QmlDesigner: Fix for Gradient Stops

Change-Id: I657b92cb00c0eda93b8dd74a2393072cc9ae9287
Fixes: QDS-680
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Aleksei German
2021-04-09 15:32:06 +02:00
parent 574f9888c4
commit 12645efba0
2 changed files with 34 additions and 14 deletions

View File

@@ -37,10 +37,12 @@
#include <abstractview.h> #include <abstractview.h>
#include <nodemetainfo.h> #include <nodemetainfo.h>
#include <exception.h> #include <exception.h>
#include <rewritertransaction.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QTimer> #include <QTimer>
#include <QScopeGuard>
GradientModel::GradientModel(QObject *parent) : GradientModel::GradientModel(QObject *parent) :
QAbstractListModel(parent) QAbstractListModel(parent)
@@ -109,9 +111,9 @@ int GradientModel::addStop(qreal position, const QColor &color)
if (m_itemNode.modelNode().hasNodeProperty(gradientPropertyName().toUtf8())) { if (m_itemNode.modelNode().hasNodeProperty(gradientPropertyName().toUtf8())) {
int properPos = 0; 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(); QmlDesigner::ModelNode gradientStopNode = createGradientStopNode();
@@ -128,6 +130,9 @@ int GradientModel::addStop(qreal position, const QColor &color)
gradientNode.nodeListProperty("stops").slide(stopNodes.count() - 1, properPos); gradientNode.nodeListProperty("stops").slide(stopNodes.count() - 1, properPos);
setupModel(); setupModel();
resetPuppet();
emit gradientCountChanged();
} catch (const QmlDesigner::Exception &e) { } catch (const QmlDesigner::Exception &e) {
e.showException(); e.showException();
} }
@@ -176,6 +181,7 @@ void GradientModel::addGradient()
if (m_gradientTypeName != "Gradient") if (m_gradientTypeName != "Gradient")
resetPuppet(); /*Unfortunately required */ resetPuppet(); /*Unfortunately required */
emit hasGradientChanged(); emit hasGradientChanged();
emit gradientTypeChanged(); emit gradientTypeChanged();
} }
@@ -247,9 +253,15 @@ void GradientModel::removeStop(int index)
if (stop.isValid()) { if (stop.isValid()) {
stop.destroy(); stop.destroy();
setupModel(); setupModel();
resetPuppet();
emit gradientCountChanged();
} }
}); });
return;
} }
qWarning() << Q_FUNC_INFO << "invalid index"; qWarning() << Q_FUNC_INFO << "invalid index";
} }
@@ -301,10 +313,10 @@ qreal GradientModel::readGradientProperty(const QString &propertyName) const
void GradientModel::setupModel() void GradientModel::setupModel()
{ {
m_locked = true; m_locked = true;
beginResetModel(); auto guard = qScopeGuard([&] { m_locked = false; });
beginResetModel();
endResetModel(); endResetModel();
m_locked = false;
} }
void GradientModel::setAnchorBackend(const QVariant &anchorBackend) void GradientModel::setAnchorBackend(const QVariant &anchorBackend)
@@ -324,12 +336,11 @@ void GradientModel::setAnchorBackend(const QVariant &anchorBackend)
setupModel(); setupModel();
m_locked = true; m_locked = true;
auto guard = qScopeGuard([&] { m_locked = false; });
emit anchorBackendChanged(); emit anchorBackendChanged();
emit hasGradientChanged(); emit hasGradientChanged();
emit gradientTypeChanged(); emit gradientTypeChanged();
m_locked = false;
} }
QString GradientModel::gradientPropertyName() const QString GradientModel::gradientPropertyName() const
@@ -482,9 +493,10 @@ void GradientModel::deleteGradientNode(bool saveTransaction)
if (m_itemNode.isInBaseState()) { if (m_itemNode.isInBaseState()) {
if (modelNode.hasProperty(gradientPropertyName().toUtf8())) { if (modelNode.hasProperty(gradientPropertyName().toUtf8())) {
QmlDesigner::RewriterTransaction transaction;
if (saveTransaction) if (saveTransaction)
QmlDesigner::RewriterTransaction transaction = view()->beginRewriterTransaction( transaction = view()->beginRewriterTransaction(QByteArrayLiteral("GradientModel::deleteGradient"));
QByteArrayLiteral("GradientModel::deleteGradient"));
QmlDesigner::ModelNode gradientNode QmlDesigner::ModelNode gradientNode
= modelNode.nodeProperty(gradientPropertyName().toUtf8()).modelNode(); = modelNode.nodeProperty(gradientPropertyName().toUtf8()).modelNode();
if (QmlDesigner::QmlObjectNode(gradientNode).isValid()) if (QmlDesigner::QmlObjectNode(gradientNode).isValid())
@@ -529,7 +541,8 @@ void GradientModel::setPresetByID(int presetID)
void GradientModel::setPresetByStops(const QList<qreal> &stopsPositions, void GradientModel::setPresetByStops(const QList<qreal> &stopsPositions,
const QList<QString> &stopsColors, const QList<QString> &stopsColors,
int stopsCount) int stopsCount,
bool saveTransaction)
{ {
if (m_locked) if (m_locked)
return; return;
@@ -537,8 +550,9 @@ void GradientModel::setPresetByStops(const QList<qreal> &stopsPositions,
if (!m_itemNode.isValid() || gradientPropertyName().isEmpty()) if (!m_itemNode.isValid() || gradientPropertyName().isEmpty())
return; return;
QmlDesigner::RewriterTransaction transaction = view()->beginRewriterTransaction( QmlDesigner::RewriterTransaction transaction;
QByteArrayLiteral("GradientModel::setCustomPreset")); if (saveTransaction)
transaction = view()->beginRewriterTransaction(QByteArrayLiteral("GradientModel::setCustomPreset"));
deleteGradientNode(false); deleteGradientNode(false);
@@ -599,6 +613,8 @@ void GradientModel::savePreset()
void GradientModel::updateGradient() void GradientModel::updateGradient()
{ {
beginResetModel();
QList<qreal> stops; QList<qreal> stops;
QList<QString> colors; QList<QString> colors;
int stopsCount = rowCount(); int stopsCount = rowCount();
@@ -607,5 +623,7 @@ void GradientModel::updateGradient()
colors.append(getColor(i).name(QColor::HexArgb)); colors.append(getColor(i).name(QColor::HexArgb));
} }
setPresetByStops(stops, colors, stopsCount); setPresetByStops(stops, colors, stopsCount, false);
endResetModel();
} }

View File

@@ -38,7 +38,7 @@ class GradientModel : public QAbstractListModel
Q_PROPERTY(QVariant anchorBackendProperty READ anchorBackend WRITE setAnchorBackend NOTIFY anchorBackendChanged) Q_PROPERTY(QVariant anchorBackendProperty READ anchorBackend WRITE setAnchorBackend NOTIFY anchorBackendChanged)
Q_PROPERTY(QString gradientPropertyName READ gradientPropertyName WRITE setGradientPropertyName) Q_PROPERTY(QString gradientPropertyName READ gradientPropertyName WRITE setGradientPropertyName)
Q_PROPERTY(QString gradientTypeName READ gradientTypeName WRITE setGradientTypeName NOTIFY gradientTypeChanged) 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) Q_PROPERTY(bool hasGradient READ hasGradient NOTIFY hasGradientChanged)
public: public:
@@ -73,7 +73,8 @@ public:
Q_INVOKABLE void setPresetByID(int presetID); Q_INVOKABLE void setPresetByID(int presetID);
Q_INVOKABLE void setPresetByStops(const QList<qreal> &stopsPositions, Q_INVOKABLE void setPresetByStops(const QList<qreal> &stopsPositions,
const QList<QString> &stopsColors, const QList<QString> &stopsColors,
int stopsCount); int stopsCount,
bool saveTransaction = true);
Q_INVOKABLE void savePreset(); Q_INVOKABLE void savePreset();
@@ -83,6 +84,7 @@ signals:
void anchorBackendChanged(); void anchorBackendChanged();
void hasGradientChanged(); void hasGradientChanged();
void gradientTypeChanged(); void gradientTypeChanged();
void gradientCountChanged();
private: private:
void setupModel(); void setupModel();