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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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