diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index 835ba07b5b2..968cab58466 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -177,18 +177,22 @@ void Edit3DWidget::dropEvent(QDropEvent *dropEvent) ->viewManager().designerActionManager(); QHash addedAssets = actionManager.handleExternalAssetsDrop(dropEvent->mimeData()); - // add 3D assets to 3d editor (QtQuick3D import will be added if missing) - ItemLibraryInfo *itemLibInfo = m_view->model()->metaInfo().itemLibraryInfo(); + view()->executeInTransaction("Edit3DWidget::dropEvent", [&] { + // add 3D assets to 3d editor (QtQuick3D import will be added if missing) + ItemLibraryInfo *itemLibInfo = m_view->model()->metaInfo().itemLibraryInfo(); - const QStringList added3DAssets = addedAssets.value(ComponentCoreConstants::add3DAssetsDisplayString); - for (const QString &assetPath : added3DAssets) { - QString fileName = QFileInfo(assetPath).baseName(); - fileName = fileName.at(0).toUpper() + fileName.mid(1); // capitalize first letter - QString type = QString("Quick3DAssets.%1.%1").arg(fileName); - QList entriesForType = itemLibInfo->entriesForType(type.toLatin1()); - if (!entriesForType.isEmpty()) // should always be true, but just in case - QmlVisualNode::createQml3DNode(view(), entriesForType.at(0), m_canvas->activeScene()).modelNode(); - } + const QStringList added3DAssets = addedAssets.value(ComponentCoreConstants::add3DAssetsDisplayString); + for (const QString &assetPath : added3DAssets) { + QString fileName = QFileInfo(assetPath).baseName(); + fileName = fileName.at(0).toUpper() + fileName.mid(1); // capitalize first letter + QString type = QString("Quick3DAssets.%1.%1").arg(fileName); + QList entriesForType = itemLibInfo->entriesForType(type.toLatin1()); + if (!entriesForType.isEmpty()) { // should always be true, but just in case + QmlVisualNode::createQml3DNode(view(), entriesForType.at(0), + m_canvas->activeScene(), {}, false).modelNode(); + } + } + }); } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index e7e3d69d6a3..842dee7e130 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -599,20 +599,24 @@ void FormEditorWidget::dropEvent(QDropEvent *dropEvent) ->viewManager().designerActionManager(); QHash addedAssets = actionManager.handleExternalAssetsDrop(dropEvent->mimeData()); - // Create Image components for added image assets - const QStringList addedImages = addedAssets.value(ComponentCoreConstants::addImagesDisplayString); - for (const QString &imgPath : addedImages) { - QmlItemNode::createQmlItemNodeFromImage(m_formEditorView, imgPath, {}, - m_formEditorView->scene()->rootFormEditorItem()->qmlItemNode()); - } + m_formEditorView->executeInTransaction("FormEditorWidget::dropEvent", [&] { + // Create Image components for added image assets + const QStringList addedImages = addedAssets.value(ComponentCoreConstants::addImagesDisplayString); + for (const QString &imgPath : addedImages) { + QmlItemNode::createQmlItemNodeFromImage(m_formEditorView, imgPath, {}, + m_formEditorView->scene()->rootFormEditorItem()->qmlItemNode(), + false); + } - // Create Text components for added font assets - const QStringList addedFonts = addedAssets.value(ComponentCoreConstants::addFontsDisplayString); - for (const QString &fontPath : addedFonts) { - QString fontFamily = QFileInfo(fontPath).baseName(); - QmlItemNode::createQmlItemNodeFromFont(m_formEditorView, fontFamily, rootItemRect().center(), - m_formEditorView->scene()->rootFormEditorItem()->qmlItemNode()); - } + // Create Text components for added font assets + const QStringList addedFonts = addedAssets.value(ComponentCoreConstants::addFontsDisplayString); + for (const QString &fontPath : addedFonts) { + QString fontFamily = QFileInfo(fontPath).baseName(); + QmlItemNode::createQmlItemNodeFromFont(m_formEditorView, fontFamily, rootItemRect().center(), + m_formEditorView->scene()->rootFormEditorItem()->qmlItemNode(), + false); + } + }); } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index 114fef0d63c..af209245479 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -101,8 +101,9 @@ public: bool createInTransaction = true); static QmlVisualNode createQml3DNode(AbstractView *view, - const ItemLibraryEntry &itemLibraryEntry, - qint32 sceneRootId = -1, const QVector3D &position = {}); + const ItemLibraryEntry &itemLibraryEntry, + qint32 sceneRootId = -1, const QVector3D &position = {}, + bool createInTransaction = true); static NodeListProperty findSceneNodeProperty(AbstractView *view, qint32 sceneRootId); diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 02ecb64efde..c65f281f64a 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -174,7 +174,7 @@ QmlItemNode QmlItemNode::createQmlItemNodeFromFont(AbstractView *view, }; if (executeInTransaction) - view->executeInTransaction("QmlItemNode::createQmlItemNodeFromImage", doCreateQmlItemNodeFromFont); + view->executeInTransaction("QmlItemNode::createQmlItemNodeFromFont", doCreateQmlItemNodeFromFont); else doCreateQmlItemNodeFromFont(); diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index 544471b03cc..f26c32ad780 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -365,14 +365,15 @@ QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, QmlVisualNode QmlVisualNode::createQml3DNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, - qint32 sceneRootId, const QVector3D &position) + qint32 sceneRootId, const QVector3D &position, + bool createInTransaction) { NodeAbstractProperty sceneNodeProperty = sceneRootId != -1 ? findSceneNodeProperty(view, sceneRootId) : view->rootModelNode().defaultNodeAbstractProperty(); QTC_ASSERT(sceneNodeProperty.isValid(), return {}); - return createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode(); + return createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty, createInTransaction).modelNode(); } NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view, qint32 sceneRootId)