forked from qt-creator/qt-creator
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:
@@ -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();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
@@ -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())
|
||||||
{
|
{
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user