1 #include "gradientlineqmladaptor.h"
3 #include <qdeclarative.h>
6 #include <nodeproperty.h>
7 #include <nodelistproperty.h>
8 #include <nodemetainfo.h>
9 #include <abstractview.h>
10 #include <rewritingexception.h>
11 #include <variantproperty.h>
13 namespace QmlDesigner {
15 GradientLineQmlAdaptor::GradientLineQmlAdaptor(QWidget *parent) :
16 QmlEditorWidgets::GradientLine(parent)
18 connect(this, SIGNAL(gradientChanged()), this, SLOT(writeGradient()));
21 void GradientLineQmlAdaptor::setItemNode(const QVariant &itemNode)
24 if (!itemNode.value<ModelNode>().isValid())
26 m_itemNode = itemNode.value<ModelNode>();
28 emit itemNodeChanged();
31 static inline QColor normalizeColor(const QColor &color)
33 QColor newColor = QColor(color.name());
34 newColor.setAlpha(color.alpha());
38 static inline qreal roundReal(qreal real)
41 return qreal(i) / 100;
44 void GradientLineQmlAdaptor::setupGradient()
46 ModelNode modelNode = m_itemNode.modelNode();
47 QLinearGradient newGradient;
48 QVector<QGradientStop> stops;
50 if (!modelNode.isValid())
53 if (modelNode.hasProperty(gradientName())) { //gradient exists
55 ModelNode gradientNode = modelNode.nodeProperty(gradientName()).modelNode();
56 QList<ModelNode> stopList = gradientNode.nodeListProperty("stops").toModelNodeList();
58 foreach (const ModelNode &stopNode, stopList) {
59 QmlObjectNode stopObjectNode = stopNode;
60 if (stopObjectNode.isValid()) {
61 qreal position = stopObjectNode.instanceValue("position").toReal();
62 QColor color = stopObjectNode.instanceValue("color").value<QColor>();
63 stops.append( QPair<qreal, QColor>(position, color));
67 stops.append( QPair<qreal, QColor>(0, activeColor()));
68 stops.append( QPair<qreal, QColor>(1, QColor(Qt::black)));
71 newGradient.setStops(stops);
72 setGradient(newGradient);
75 void GradientLineQmlAdaptor::writeGradient()
80 if (!m_itemNode.isValid())
83 if (!m_itemNode.modelNode().metaInfo().hasProperty(gradientName()))
86 RewriterTransaction transaction = m_itemNode.modelNode().view()->beginRewriterTransaction();
88 ModelNode modelNode = m_itemNode.modelNode();
91 QVector<QGradientStop> stops = gradient().stops();
92 if (m_itemNode.isInBaseState()) {
93 if (modelNode.hasProperty(gradientName())) {
94 oldId = modelNode.nodeProperty(gradientName()).modelNode().id();
95 modelNode.removeProperty(gradientName());
98 ModelNode gradientNode = modelNode.view()->createModelNode("Qt/Gradient", 4, 7);
101 gradientNode.setId(oldId);
103 for (int i = 0;i < stops.size(); i++) {
104 ModelNode gradientStopNode = modelNode.view()->createModelNode("Qt/GradientStop", 4, 7);
105 gradientStopNode.variantProperty("position") = roundReal(stops.at(i).first);
106 gradientStopNode.variantProperty("color") = normalizeColor(stops.at(i).second);
107 gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode);
109 modelNode.nodeProperty(gradientName()).reparentHere(gradientNode);
111 if (!modelNode.hasProperty(gradientName())) {
112 qWarning(" GradientLine::updateGradient: no gradient in state");
115 ModelNode gradientNode = modelNode.nodeProperty(gradientName()).modelNode();
116 QList<ModelNode> stopList = gradientNode.nodeListProperty("stops").toModelNodeList();
117 for (int i = 0;i < stops.size(); i++) {
118 QmlObjectNode stopObjectNode = stopList.at(i);
119 stopObjectNode.setVariantProperty("position", roundReal(stops.at(i).first));
120 stopObjectNode.setVariantProperty("color", normalizeColor(stops.at(i).second));
124 catch (RewritingException &e) {
125 QMessageBox::warning(0, "Error", e.description());
129 void GradientLineQmlAdaptor::deleteGradient()
131 if (!m_itemNode.isValid())
134 if (!m_itemNode.modelNode().metaInfo().hasProperty(gradientName()))
137 ModelNode modelNode = m_itemNode.modelNode();
139 if (m_itemNode.isInBaseState()) {
140 if (modelNode.hasProperty(gradientName())) {
141 RewriterTransaction transaction = m_itemNode.modelNode().view()->beginRewriterTransaction();
142 ModelNode gradientNode = modelNode.nodeProperty(gradientName()).modelNode();
143 if (QmlObjectNode(gradientNode).isValid())
144 QmlObjectNode(gradientNode).destroy();
149 void GradientLineQmlAdaptor::registerDeclarativeType() {
150 qmlRegisterType<QmlDesigner::GradientLineQmlAdaptor>("Bauhaus",1,0,"GradientLine");