From 12645efba0086722293e28bbf0b4a058c4b6152f Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Fri, 9 Apr 2021 15:32:06 +0200 Subject: [PATCH] QmlDesigner: Fix for Gradient Stops Change-Id: I657b92cb00c0eda93b8dd74a2393072cc9ae9287 Fixes: QDS-680 Reviewed-by: Thomas Hartmann --- .../propertyeditor/gradientmodel.cpp | 42 +++++++++++++------ .../components/propertyeditor/gradientmodel.h | 6 ++- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp index 4cb3473158c..c59e3d7e93b 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp @@ -37,10 +37,12 @@ #include #include #include +#include #include #include +#include GradientModel::GradientModel(QObject *parent) : QAbstractListModel(parent) @@ -109,9 +111,9 @@ int GradientModel::addStop(qreal position, const QColor &color) if (m_itemNode.modelNode().hasNodeProperty(gradientPropertyName().toUtf8())) { int properPos = 0; - try { - QmlDesigner::ModelNode gradientNode = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode(); + try { + QmlDesigner::ModelNode gradientNode = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode(); QmlDesigner::ModelNode gradientStopNode = createGradientStopNode(); @@ -128,6 +130,9 @@ int GradientModel::addStop(qreal position, const QColor &color) gradientNode.nodeListProperty("stops").slide(stopNodes.count() - 1, properPos); setupModel(); + resetPuppet(); + + emit gradientCountChanged(); } catch (const QmlDesigner::Exception &e) { e.showException(); } @@ -176,6 +181,7 @@ void GradientModel::addGradient() if (m_gradientTypeName != "Gradient") resetPuppet(); /*Unfortunately required */ + emit hasGradientChanged(); emit gradientTypeChanged(); } @@ -247,9 +253,15 @@ void GradientModel::removeStop(int index) if (stop.isValid()) { stop.destroy(); setupModel(); + resetPuppet(); + + emit gradientCountChanged(); } }); + + return; } + qWarning() << Q_FUNC_INFO << "invalid index"; } @@ -301,10 +313,10 @@ qreal GradientModel::readGradientProperty(const QString &propertyName) const void GradientModel::setupModel() { m_locked = true; - beginResetModel(); + auto guard = qScopeGuard([&] { m_locked = false; }); + beginResetModel(); endResetModel(); - m_locked = false; } void GradientModel::setAnchorBackend(const QVariant &anchorBackend) @@ -324,12 +336,11 @@ void GradientModel::setAnchorBackend(const QVariant &anchorBackend) setupModel(); m_locked = true; + auto guard = qScopeGuard([&] { m_locked = false; }); emit anchorBackendChanged(); emit hasGradientChanged(); emit gradientTypeChanged(); - - m_locked = false; } QString GradientModel::gradientPropertyName() const @@ -482,9 +493,10 @@ void GradientModel::deleteGradientNode(bool saveTransaction) if (m_itemNode.isInBaseState()) { if (modelNode.hasProperty(gradientPropertyName().toUtf8())) { + QmlDesigner::RewriterTransaction transaction; if (saveTransaction) - QmlDesigner::RewriterTransaction transaction = view()->beginRewriterTransaction( - QByteArrayLiteral("GradientModel::deleteGradient")); + transaction = view()->beginRewriterTransaction(QByteArrayLiteral("GradientModel::deleteGradient")); + QmlDesigner::ModelNode gradientNode = modelNode.nodeProperty(gradientPropertyName().toUtf8()).modelNode(); if (QmlDesigner::QmlObjectNode(gradientNode).isValid()) @@ -529,7 +541,8 @@ void GradientModel::setPresetByID(int presetID) void GradientModel::setPresetByStops(const QList &stopsPositions, const QList &stopsColors, - int stopsCount) + int stopsCount, + bool saveTransaction) { if (m_locked) return; @@ -537,8 +550,9 @@ void GradientModel::setPresetByStops(const QList &stopsPositions, if (!m_itemNode.isValid() || gradientPropertyName().isEmpty()) return; - QmlDesigner::RewriterTransaction transaction = view()->beginRewriterTransaction( - QByteArrayLiteral("GradientModel::setCustomPreset")); + QmlDesigner::RewriterTransaction transaction; + if (saveTransaction) + transaction = view()->beginRewriterTransaction(QByteArrayLiteral("GradientModel::setCustomPreset")); deleteGradientNode(false); @@ -599,6 +613,8 @@ void GradientModel::savePreset() void GradientModel::updateGradient() { + beginResetModel(); + QList stops; QList colors; int stopsCount = rowCount(); @@ -607,5 +623,7 @@ void GradientModel::updateGradient() colors.append(getColor(i).name(QColor::HexArgb)); } - setPresetByStops(stops, colors, stopsCount); + setPresetByStops(stops, colors, stopsCount, false); + + endResetModel(); } diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h index c54526838e8..d2ce8bb7157 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h @@ -38,7 +38,7 @@ class GradientModel : public QAbstractListModel Q_PROPERTY(QVariant anchorBackendProperty READ anchorBackend WRITE setAnchorBackend NOTIFY anchorBackendChanged) Q_PROPERTY(QString gradientPropertyName READ gradientPropertyName WRITE setGradientPropertyName) Q_PROPERTY(QString gradientTypeName READ gradientTypeName WRITE setGradientTypeName NOTIFY gradientTypeChanged) - Q_PROPERTY(int count READ rowCount) + Q_PROPERTY(int count READ rowCount NOTIFY gradientCountChanged) Q_PROPERTY(bool hasGradient READ hasGradient NOTIFY hasGradientChanged) public: @@ -73,7 +73,8 @@ public: Q_INVOKABLE void setPresetByID(int presetID); Q_INVOKABLE void setPresetByStops(const QList &stopsPositions, const QList &stopsColors, - int stopsCount); + int stopsCount, + bool saveTransaction = true); Q_INVOKABLE void savePreset(); @@ -83,6 +84,7 @@ signals: void anchorBackendChanged(); void hasGradientChanged(); void gradientTypeChanged(); + void gradientCountChanged(); private: void setupModel();