OSDN Git Service

Update license.
[qt-creator-jp/qt-creator-jp.git] / src / plugins / qmldesigner / designercore / model / qmlitemnode.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2011 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 "qmlitemnode.h"
34 #include <metainfo.h>
35 #include <QDeclarativeView>
36 #include "qmlchangeset.h"
37 #include "variantproperty.h"
38 #include "nodeproperty.h"
39 #include "nodelistproperty.h"
40 #include "nodeinstance.h"
41 #include "qmlanchors.h"
42 #include "invalidmodelnodeexception.h"
43 #include "rewritertransaction.h"
44 #include "qmlmodelview.h"
45 #include "mathutils.h"
46
47 namespace QmlDesigner {
48
49
50 bool QmlItemNode::isValid() const
51 {
52     return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().isSubclassOf("QtQuick.Item", -1, -1);
53 }
54
55 bool QmlItemNode::isRootNode() const
56 {
57     return modelNode().isValid() && modelNode().isRootNode();
58 }
59
60 QStringList QmlModelStateGroup::names() const
61 {
62     QStringList returnList;
63
64     if (!modelNode().isValid())
65         throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
66
67     if (modelNode().property("states").isNodeListProperty()) {
68         foreach (const ModelNode &node, modelNode().nodeListProperty("states").toModelNodeList()) {
69             if (QmlModelState(node).isValid())
70                 returnList.append(QmlModelState(node).name());
71         }
72     }
73     return returnList;
74 }
75
76 /**
77   \brief Returns list of states (without 'base state').
78   The list contains all states defined by this item.
79   */
80 QmlModelStateGroup QmlItemNode::states() const
81 {
82     if (isValid())
83         return QmlModelStateGroup(modelNode());
84     else
85         return QmlModelStateGroup();
86 }
87
88 QList<QmlItemNode> QmlItemNode::children() const
89 {
90     QList<QmlItemNode> returnList;
91
92     if (isValid()) {
93
94         QList<ModelNode> modelNodeList;
95
96         if (modelNode().hasProperty("children")) {
97             if (modelNode().property("children").isNodeListProperty())
98                 modelNodeList.append(modelNode().nodeListProperty("children").toModelNodeList());
99         }
100
101         if (modelNode().hasProperty("data")) {
102             if (modelNode().property("data").isNodeListProperty())
103                 modelNodeList.append(modelNode().nodeListProperty("data").toModelNodeList());
104         }
105
106         foreach (const ModelNode &modelNode, modelNodeList) {
107             if (QmlItemNode(modelNode).isValid())  //if ModelNode is FxItem
108                 returnList.append(modelNode);
109         }
110     }
111     return returnList;
112 }
113
114 QList<QmlObjectNode> QmlItemNode::resources() const
115 {
116     QList<QmlObjectNode> returnList;
117
118     if (isValid()) {
119         QList<ModelNode> modelNodeList;
120         if (modelNode().hasProperty("resources")) {
121             if (modelNode().property("resources").isNodeListProperty())
122                 modelNodeList.append(modelNode().nodeListProperty("resources").toModelNodeList());
123         }
124
125         if (modelNode().hasProperty("data")) {
126             if (modelNode().property("data").isNodeListProperty())
127                 modelNodeList.append(modelNode().nodeListProperty("data").toModelNodeList());
128         }
129
130         foreach (const ModelNode &node, modelNodeList) {
131             if (!QmlObjectNode(node).isValid()) //if ModelNode is no FxItem
132                 returnList.append(node);
133         }
134     }
135     return returnList;
136 }
137
138 QList<QmlObjectNode> QmlItemNode::defaultPropertyChildren() const
139 {
140     QList<QmlObjectNode> returnList;
141     if (isValid()) {
142         QList<ModelNode> modelNodeList;
143         if (modelNode().property(defaultProperty()).isNodeListProperty())
144             modelNodeList.append(modelNode().nodeListProperty(defaultProperty()).toModelNodeList());
145
146         foreach (const ModelNode &node, modelNodeList) {
147             if (!QmlObjectNode(node).isValid()) //if ModelNode is no FxItem
148                 returnList.append(node);
149         }
150     }
151     return returnList;
152 }
153
154 QList<QmlObjectNode> QmlItemNode::allDirectSubNodes() const
155 {
156     QList<QmlObjectNode> returnList;
157     if (isValid()) {
158         QList<ModelNode> modelNodeList = modelNode().allDirectSubModelNodes();
159
160         foreach (const ModelNode &node, modelNodeList) {
161                 returnList.append(node);
162         }
163     }
164     return returnList;
165 }
166
167 QmlAnchors QmlItemNode::anchors() const
168 {
169     return QmlAnchors(*this);
170 }
171
172 bool QmlItemNode::hasChildren() const
173 {
174     return !children().isEmpty();
175 }
176
177 bool QmlItemNode::hasResources() const
178 {
179     return !resources().isEmpty();
180 }
181
182 bool QmlItemNode::instanceHasAnchors() const
183 {
184     return anchors().instanceHasAnchors();
185 }
186
187 bool QmlItemNode::hasShowContent() const
188 {
189     return nodeInstance().hasContent();
190 }
191
192 bool QmlItemNode::canReparent() const
193 {
194     return QmlObjectNode::canReparent() && !anchors().instanceHasAnchors() && !instanceIsAnchoredBySibling();
195 }
196
197 bool QmlItemNode::instanceIsAnchoredBySibling() const
198 {
199     return nodeInstance().isAnchoredBySibling();
200 }
201
202 bool QmlItemNode::instanceIsAnchoredByChildren() const
203 {
204     return nodeInstance().isAnchoredByChildren();
205 }
206
207 bool QmlItemNode::instanceIsMovable() const
208 {
209     return nodeInstance().isMovable();
210 }
211
212 bool QmlItemNode::instanceIsResizable() const
213 {
214     return nodeInstance().isResizable();
215 }
216
217 bool QmlItemNode::instanceIsInPositioner() const
218 {
219      return nodeInstance().isInPositioner();
220 }
221
222 QRectF  QmlItemNode::instanceBoundingRect() const
223 {
224     return nodeInstance().boundingRect();
225 }
226
227 QTransform  QmlItemNode::instanceTransform() const
228 {
229     return nodeInstance().transform();
230 }
231
232 QTransform QmlItemNode::instanceSceneTransform() const
233 {
234     return nodeInstance().sceneTransform();
235 }
236
237 QPointF QmlItemNode::instancePosition() const
238 {
239     return nodeInstance().position();
240 }
241
242 QSizeF QmlItemNode::instanceSize() const
243 {
244     return nodeInstance().size();
245 }
246
247 int QmlItemNode::instancePenWidth() const
248 {
249     return nodeInstance().penWidth();
250 }
251
252 void QmlItemNode::paintInstance(QPainter *painter)
253 {
254     if (nodeInstance().isValid())
255         nodeInstance().paint(painter);
256 }
257
258 void QmlItemNode::selectNode()
259 {
260     modelNode().selectNode();
261 }
262
263 void QmlItemNode::deselectNode()
264 {
265     modelNode().deselectNode();
266 }
267
268 bool QmlItemNode::isSelected() const
269 {
270     return modelNode().isSelected();
271 }
272
273 QList<QmlModelState> QmlModelStateGroup::allStates() const
274 {
275     QList<QmlModelState> returnList;
276
277     if (!modelNode().isValid())
278         throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
279
280     if (modelNode().property("states").isNodeListProperty()) {
281         foreach (const ModelNode &node, modelNode().nodeListProperty("states").toModelNodeList()) {
282             if (QmlModelState(node).isValid())
283                 returnList.append(QmlModelState(node));
284         }
285     }
286     return returnList;
287 }
288
289 QString QmlItemNode::simplifiedTypeName() const
290 {
291     return modelNode().simplifiedTypeName();
292 }
293
294 uint qHash(const QmlItemNode &node)
295 {
296     return qHash(node.modelNode());
297 }
298
299 QmlModelState QmlModelStateGroup::addState(const QString &name)
300 {
301     if (!modelNode().isValid())
302         throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
303
304
305     PropertyListType propertyList;
306     propertyList.append(qMakePair(QString("name"), QVariant(name)));
307
308     ModelNode newState = modelNode().view()->createModelNode("QtQuick.State", 1, 0, propertyList);
309     modelNode().nodeListProperty("states").reparentHere(newState);
310
311     return newState;
312 }
313
314 void QmlModelStateGroup::removeState(const QString &name)
315 {
316     if (!modelNode().isValid())
317         throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
318
319     if (state(name).isValid())
320         state(name).modelNode().destroy();
321 }
322
323 QmlModelState QmlModelStateGroup::state(const QString &name) const
324 {
325     if (!modelNode().isValid())
326         throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
327
328     if (modelNode().property("states").isNodeListProperty()) {
329         foreach (const ModelNode &node, modelNode().nodeListProperty("states").toModelNodeList()) {
330             if (QmlModelState(node).name() == name)
331                 return node;
332         }
333     }
334     return QmlModelState();
335 }
336
337 QList<ModelNode> toModelNodeList(const QList<QmlItemNode> &qmlItemNodeList)
338 {
339     QList<ModelNode> modelNodeList;
340
341     foreach (const QmlItemNode &qmlItemNode, qmlItemNodeList)
342         modelNodeList.append(qmlItemNode.modelNode());
343
344     return modelNodeList;
345 }
346
347 QList<QmlItemNode> toQmlItemNodeList(const QList<ModelNode> &modelNodeList)
348 {
349     QList<QmlItemNode> qmlItemNodeList;
350
351     foreach (const ModelNode &modelNode, modelNodeList) {
352         QmlItemNode itemNode(modelNode);
353         if (itemNode.isValid())
354             qmlItemNodeList.append(itemNode);
355     }
356
357     return qmlItemNodeList;
358 }
359
360 const QList<QmlItemNode> QmlItemNode::allDirectSubModelNodes() const
361 {
362     return toQmlItemNodeList(modelNode().allDirectSubModelNodes());
363 }
364
365 const QList<QmlItemNode> QmlItemNode::allSubModelNodes() const
366 {
367     return toQmlItemNodeList(modelNode().allSubModelNodes());
368 }
369
370 bool QmlItemNode::hasAnySubModelNodes() const
371 {
372     return modelNode().hasAnySubModelNodes();
373 }
374
375 } //QmlDesigner