forked from qt-creator/qt-creator
QmlDesigner: Fix for Gradient Stops
Change-Id: I657b92cb00c0eda93b8dd74a2393072cc9ae9287 Fixes: QDS-680 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -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,8 +111,8 @@ 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 {
|
|
||||||
|
|
||||||
|
try {
|
||||||
QmlDesigner::ModelNode gradientNode = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode();
|
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();
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
|
Reference in New Issue
Block a user