QmlDesigner: Delete materials and textures inside a transaction

Removal of the node and references to the removed node are separate
operations done during node deletion, so the deletion must be
done inside a transaction to avoid getting multiple undo stack entries.

Fixes: QDS-10169
Change-Id: I2ef142b98cfaa60b1130ac729dd89347bb8cac13
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Miikka Heikkinen
2023-06-27 12:49:36 +03:00
parent 623ee60611
commit 85c4c90c63
7 changed files with 40 additions and 16 deletions

View File

@@ -4,6 +4,7 @@
#include "materialbrowsermodel.h" #include "materialbrowsermodel.h"
#include "designmodewidget.h" #include "designmodewidget.h"
#include "materialbrowserview.h"
#include "qmldesignerplugin.h" #include "qmldesignerplugin.h"
#include "qmlobjectnode.h" #include "qmlobjectnode.h"
#include "variantproperty.h" #include "variantproperty.h"
@@ -13,8 +14,9 @@
namespace QmlDesigner { namespace QmlDesigner {
MaterialBrowserModel::MaterialBrowserModel(QObject *parent) MaterialBrowserModel::MaterialBrowserModel(MaterialBrowserView *view, QObject *parent)
: QAbstractListModel(parent) : QAbstractListModel(parent)
, m_view(view)
{ {
} }
@@ -459,10 +461,13 @@ void MaterialBrowserModel::pasteMaterialProperties(int idx)
void MaterialBrowserModel::deleteMaterial(int idx) void MaterialBrowserModel::deleteMaterial(int idx)
{ {
if (isValidIndex(idx)) { if (m_view && isValidIndex(idx)) {
ModelNode node = m_materialList[idx]; ModelNode node = m_materialList[idx];
if (node.isValid()) if (node.isValid()) {
QmlObjectNode(node).destroy(); m_view->executeInTransaction(__FUNCTION__, [&] {
node.destroy();
});
}
} }
} }

View File

@@ -12,6 +12,8 @@
namespace QmlDesigner { namespace QmlDesigner {
class MaterialBrowserView;
class MaterialBrowserModel : public QAbstractListModel class MaterialBrowserModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
@@ -28,7 +30,7 @@ class MaterialBrowserModel : public QAbstractListModel
Q_PROPERTY(QStringList customMaterialSections MEMBER m_customMaterialSections NOTIFY materialSectionsChanged) Q_PROPERTY(QStringList customMaterialSections MEMBER m_customMaterialSections NOTIFY materialSectionsChanged)
public: public:
MaterialBrowserModel(QObject *parent = nullptr); MaterialBrowserModel(MaterialBrowserView *view, QObject *parent = nullptr);
~MaterialBrowserModel() override; ~MaterialBrowserModel() override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override;
@@ -125,6 +127,8 @@ private:
bool m_hasMaterialLibrary = false; bool m_hasMaterialLibrary = false;
bool m_allPropsCopied = true; bool m_allPropsCopied = true;
QString m_copiedMaterialType; QString m_copiedMaterialType;
QPointer<MaterialBrowserView> m_view;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -5,6 +5,7 @@
#include "designmodewidget.h" #include "designmodewidget.h"
#include "imageutils.h" #include "imageutils.h"
#include "materialbrowserview.h"
#include "qmldesignerplugin.h" #include "qmldesignerplugin.h"
#include "qmlobjectnode.h" #include "qmlobjectnode.h"
#include "variantproperty.h" #include "variantproperty.h"
@@ -13,8 +14,9 @@
namespace QmlDesigner { namespace QmlDesigner {
MaterialBrowserTexturesModel::MaterialBrowserTexturesModel(QObject *parent) MaterialBrowserTexturesModel::MaterialBrowserTexturesModel(MaterialBrowserView *view, QObject *parent)
: QAbstractListModel(parent) : QAbstractListModel(parent)
, m_view(view)
{ {
} }
@@ -292,10 +294,13 @@ void MaterialBrowserTexturesModel::duplicateTexture(int idx)
void MaterialBrowserTexturesModel::deleteTexture(int idx) void MaterialBrowserTexturesModel::deleteTexture(int idx)
{ {
if (isValidIndex(idx)) { if (m_view && isValidIndex(idx)) {
ModelNode node = m_textureList[idx]; ModelNode node = m_textureList[idx];
if (node.isValid()) if (node.isValid()) {
QmlObjectNode(node).destroy(); m_view->executeInTransaction(__FUNCTION__, [&] {
node.destroy();
});
}
} }
} }

View File

@@ -10,6 +10,8 @@
namespace QmlDesigner { namespace QmlDesigner {
class MaterialBrowserView;
class MaterialBrowserTexturesModel : public QAbstractListModel class MaterialBrowserTexturesModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
@@ -20,7 +22,7 @@ class MaterialBrowserTexturesModel : public QAbstractListModel
Q_PROPERTY(bool hasSceneEnv READ hasSceneEnv NOTIFY hasSceneEnvChanged) Q_PROPERTY(bool hasSceneEnv READ hasSceneEnv NOTIFY hasSceneEnvChanged)
public: public:
MaterialBrowserTexturesModel(QObject *parent = nullptr); MaterialBrowserTexturesModel(MaterialBrowserView *view, QObject *parent = nullptr);
~MaterialBrowserTexturesModel() override; ~MaterialBrowserTexturesModel() override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override;
@@ -89,6 +91,8 @@ private:
bool m_hasSingleModelSelection = false; bool m_hasSingleModelSelection = false;
bool m_hasSceneEnv = false; bool m_hasSceneEnv = false;
QPointer<MaterialBrowserView> m_view;
enum { enum {
RoleTexHasDynamicProps = Qt::UserRole + 1, RoleTexHasDynamicProps = Qt::UserRole + 1,
RoleTexInternalId, RoleTexInternalId,

View File

@@ -141,8 +141,8 @@ bool MaterialBrowserWidget::eventFilter(QObject *obj, QEvent *event)
MaterialBrowserWidget::MaterialBrowserWidget(AsynchronousImageCache &imageCache, MaterialBrowserWidget::MaterialBrowserWidget(AsynchronousImageCache &imageCache,
MaterialBrowserView *view) MaterialBrowserView *view)
: m_materialBrowserView(view) : m_materialBrowserView(view)
, m_materialBrowserModel(new MaterialBrowserModel(this)) , m_materialBrowserModel(new MaterialBrowserModel(view, this))
, m_materialBrowserTexturesModel(new MaterialBrowserTexturesModel(this)) , m_materialBrowserTexturesModel(new MaterialBrowserTexturesModel(view, this))
, m_quickWidget(new StudioQuickWidget(this)) , m_quickWidget(new StudioQuickWidget(this))
, m_previewImageProvider(new PreviewImageProvider()) , m_previewImageProvider(new PreviewImageProvider())
{ {

View File

@@ -442,8 +442,11 @@ void MaterialEditorView::handleToolBarAction(int action)
} }
case MaterialEditorContextObject::DeleteCurrentMaterial: { case MaterialEditorContextObject::DeleteCurrentMaterial: {
if (m_selectedMaterial.isValid()) if (m_selectedMaterial.isValid()) {
executeInTransaction(__FUNCTION__, [&] {
m_selectedMaterial.destroy(); m_selectedMaterial.destroy();
});
}
break; break;
} }

View File

@@ -389,8 +389,11 @@ void TextureEditorView::handleToolBarAction(int action)
} }
case TextureEditorContextObject::DeleteCurrentTexture: { case TextureEditorContextObject::DeleteCurrentTexture: {
if (m_selectedTexture.isValid()) if (m_selectedTexture.isValid()) {
executeInTransaction(__FUNCTION__, [&] {
m_selectedTexture.destroy(); m_selectedTexture.destroy();
});
}
break; break;
} }