OSDN Git Service

Update license.
[qt-creator-jp/qt-creator-jp.git] / src / plugins / qmldesigner / components / propertyeditor / gradientlineqmladaptor.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
8 **
9 **
10 ** GNU Lesser General Public License Usage
11 **
12 ** This file may be used under the terms of the GNU Lesser General Public
13 ** License version 2.1 as published by the Free Software Foundation and
14 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
15 ** Please review the following information to ensure the GNU Lesser General
16 ** Public License version 2.1 requirements will be met:
17 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 **
19 ** In addition, as a special exception, Nokia gives you certain additional
20 ** rights. These rights are described in the Nokia Qt LGPL Exception
21 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 **
23 ** Other Usage
24 **
25 ** Alternatively, this file may be used in accordance with the terms and
26 ** conditions contained in a signed written agreement between you and Nokia.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **************************************************************************/
32
33 #include "gradientlineqmladaptor.h"
34
35 #include <qdeclarative.h>
36 #include <QMessageBox>
37
38 #include <nodeproperty.h>
39 #include <nodelistproperty.h>
40 #include <nodemetainfo.h>
41 #include <abstractview.h>
42 #include <rewritingexception.h>
43 #include <variantproperty.h>
44
45 namespace QmlDesigner {
46
47 GradientLineQmlAdaptor::GradientLineQmlAdaptor(QWidget *parent) :
48     QmlEditorWidgets::GradientLine(parent)
49 {
50     setActive(false);
51     connect(this, SIGNAL(gradientChanged()), this, SLOT(writeGradient()));
52 }
53
54 void GradientLineQmlAdaptor::setItemNode(const QVariant &itemNode)
55 {
56
57     if (!itemNode.value<ModelNode>().isValid())
58         return;
59     m_itemNode = itemNode.value<ModelNode>();
60     emit itemNodeChanged();
61 }
62
63 static inline QColor normalizeColor(const QColor &color)
64 {
65     QColor newColor = QColor(color.name());
66     newColor.setAlpha(color.alpha());
67     return newColor;
68 }
69
70 static inline qreal roundReal(qreal real)
71 {
72     int i = real * 100;
73     return qreal(i) / 100;
74 }
75
76 void GradientLineQmlAdaptor::setupGradient()
77 {
78     if (!active())
79         return;
80
81     ModelNode modelNode = m_itemNode.modelNode();
82     QLinearGradient newGradient;
83     QVector<QGradientStop> stops;
84
85     if (!modelNode.isValid())
86         return;
87
88     if (modelNode.hasProperty(gradientName())) { //gradient exists
89
90         ModelNode gradientNode = modelNode.nodeProperty(gradientName()).modelNode();
91         QList<ModelNode> stopList = gradientNode.nodeListProperty("stops").toModelNodeList();
92
93         foreach (const ModelNode &stopNode, stopList) {
94             QmlObjectNode stopObjectNode = stopNode;
95             if (stopObjectNode.isValid()) {
96                 qreal position = stopObjectNode.modelValue("position").toReal();
97                 QColor color = stopObjectNode.modelValue("color").value<QColor>();
98                 stops.append( QPair<qreal, QColor>(position, color));
99             }
100         }
101     } else {
102         stops.append( QPair<qreal, QColor>(0, activeColor()));
103         stops.append( QPair<qreal, QColor>(1, QColor(Qt::black)));
104     }
105
106     newGradient.setStops(stops);
107     setGradient(newGradient);
108 }
109
110 void GradientLineQmlAdaptor::writeGradient()
111 {
112     if (!active())
113         return;
114
115     if (!m_itemNode.isValid())
116         return;
117
118     if (!m_itemNode.modelNode().metaInfo().hasProperty(gradientName()))
119         return;
120     try {
121         ModelNode modelNode = m_itemNode.modelNode();
122
123         QString oldId;
124         QVector<QGradientStop> stops = gradient().stops();
125         if (m_itemNode.isInBaseState()) {
126             if (modelNode.hasProperty(gradientName())) {
127                 oldId = modelNode.nodeProperty(gradientName()).modelNode().id();
128                 modelNode.removeProperty(gradientName());
129             }
130
131             ModelNode gradientNode = modelNode.view()->createModelNode("QtQuick.Gradient", 1, 0);
132             modelNode.nodeProperty(gradientName()).reparentHere(gradientNode);
133
134             RewriterTransaction transaction = m_itemNode.modelNode().view()->beginRewriterTransaction();
135
136             if (!oldId.isNull())
137                 gradientNode.setId(oldId);
138
139             for (int i = 0;i < stops.size(); i++) {
140                 ModelNode gradientStopNode = modelNode.view()->createModelNode("QtQuick.GradientStop", 1, 0);
141                 gradientStopNode.variantProperty("position") = roundReal(stops.at(i).first);
142                 gradientStopNode.variantProperty("color") = normalizeColor(stops.at(i).second);
143                 gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode);
144             }
145         } else { //state
146             if  (!modelNode.hasProperty(gradientName())) {
147                 qWarning(" GradientLine::updateGradient: no gradient in state");
148                 return;
149             }
150             ModelNode gradientNode = modelNode.nodeProperty(gradientName()).modelNode();
151             QList<ModelNode> stopList = gradientNode.nodeListProperty("stops").toModelNodeList();
152             for (int i = 0;i < stops.size(); i++) {
153                 QmlObjectNode stopObjectNode = stopList.at(i);
154                 stopObjectNode.setVariantProperty("position", roundReal(stops.at(i).first));
155                 stopObjectNode.setVariantProperty("color", normalizeColor(stops.at(i).second));
156             }
157         }
158     }
159     catch (RewritingException &e) {
160         QMessageBox::warning(0, "Error", e.description());
161     }
162 }
163
164 void GradientLineQmlAdaptor::deleteGradient()
165 {
166     if (!m_itemNode.isValid())
167         return;
168
169     if (!m_itemNode.modelNode().metaInfo().hasProperty(gradientName()))
170         return;
171
172     ModelNode modelNode = m_itemNode.modelNode();
173
174     if (m_itemNode.isInBaseState()) {
175         if (modelNode.hasProperty(gradientName())) {
176             RewriterTransaction transaction = m_itemNode.modelNode().view()->beginRewriterTransaction();
177             ModelNode gradientNode = modelNode.nodeProperty(gradientName()).modelNode();
178             if (QmlObjectNode(gradientNode).isValid())
179                 QmlObjectNode(gradientNode).destroy();
180         }
181     }
182 }
183
184 void GradientLineQmlAdaptor::registerDeclarativeType() {
185     qmlRegisterType<QmlDesigner::GradientLineQmlAdaptor>("Bauhaus",1,0,"GradientLine");
186 }
187
188 } //QmlDesigner