OSDN Git Service

QmlDesigner.propertyEditor: bug fix for gradient editing
[qt-creator-jp/qt-creator-jp.git] / src / plugins / qmldesigner / components / propertyeditor / gradientlineqmladaptor.cpp
1 #include "gradientlineqmladaptor.h"
2
3 #include <qdeclarative.h>
4 #include <QMessageBox>
5
6 #include <nodeproperty.h>
7 #include <nodelistproperty.h>
8 #include <nodemetainfo.h>
9 #include <abstractview.h>
10 #include <rewritingexception.h>
11 #include <variantproperty.h>
12
13 namespace QmlDesigner {
14
15 GradientLineQmlAdaptor::GradientLineQmlAdaptor(QWidget *parent) :
16     QmlEditorWidgets::GradientLine(parent)
17 {
18     connect(this, SIGNAL(gradientChanged()), this, SLOT(writeGradient()));
19 }
20
21 void GradientLineQmlAdaptor::setItemNode(const QVariant &itemNode)
22 {
23
24     if (!itemNode.value<ModelNode>().isValid())
25         return;
26     m_itemNode = itemNode.value<ModelNode>();
27     setupGradient();
28     emit itemNodeChanged();
29 }
30
31 static inline QColor normalizeColor(const QColor &color)
32 {
33     QColor newColor = QColor(color.name());
34     newColor.setAlpha(color.alpha());
35     return newColor;
36 }
37
38 static inline qreal roundReal(qreal real)
39 {
40     int i = real * 100;
41     return qreal(i) / 100;
42 }
43
44 void GradientLineQmlAdaptor::setupGradient()
45 {
46     ModelNode modelNode = m_itemNode.modelNode();
47     QLinearGradient newGradient;
48     QVector<QGradientStop> stops;
49
50     if (!modelNode.isValid())
51         return;
52
53     if (modelNode.hasProperty(gradientName())) { //gradient exists
54
55         ModelNode gradientNode = modelNode.nodeProperty(gradientName()).modelNode();
56         QList<ModelNode> stopList = gradientNode.nodeListProperty("stops").toModelNodeList();
57
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));
64             }
65         }
66     } else {
67         stops.append( QPair<qreal, QColor>(0, activeColor()));
68         stops.append( QPair<qreal, QColor>(1, QColor(Qt::black)));
69     }
70
71     newGradient.setStops(stops);
72     setGradient(newGradient);
73 }
74
75 void GradientLineQmlAdaptor::writeGradient()
76 {
77     if (!active())
78         return;
79
80     if (!m_itemNode.isValid())
81         return;
82
83     if (!m_itemNode.modelNode().metaInfo().hasProperty(gradientName()))
84         return;
85     try {
86         RewriterTransaction transaction = m_itemNode.modelNode().view()->beginRewriterTransaction();
87
88         ModelNode modelNode = m_itemNode.modelNode();
89
90         QString oldId;
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());
96             }
97
98             ModelNode gradientNode = modelNode.view()->createModelNode("Qt/Gradient", 4, 7);
99
100             if (!oldId.isNull())
101                 gradientNode.setId(oldId);
102
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);
108             }
109             modelNode.nodeProperty(gradientName()).reparentHere(gradientNode);
110         } else { //state
111             if  (!modelNode.hasProperty(gradientName())) {
112                 qWarning(" GradientLine::updateGradient: no gradient in state");
113                 return;
114             }
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));
121             }
122         }
123     }
124     catch (RewritingException &e) {
125         QMessageBox::warning(0, "Error", e.description());
126     }
127 }
128
129 void GradientLineQmlAdaptor::deleteGradient()
130 {
131     if (!m_itemNode.isValid())
132         return;
133
134     if (!m_itemNode.modelNode().metaInfo().hasProperty(gradientName()))
135         return;
136
137     ModelNode modelNode = m_itemNode.modelNode();
138
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();
145         }
146     }
147 }
148
149 void GradientLineQmlAdaptor::registerDeclarativeType() {
150     qmlRegisterType<QmlDesigner::GradientLineQmlAdaptor>("Bauhaus",1,0,"GradientLine");
151 }
152
153 } //QmlDesigner