1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
10 ** GNU Lesser General Public License Usage
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.
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.
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.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
31 **************************************************************************/
33 #include "qmlitemnode.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"
47 namespace QmlDesigner {
50 bool QmlItemNode::isValid() const
52 return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().isSubclassOf("QtQuick.Item", -1, -1);
55 bool QmlItemNode::isRootNode() const
57 return modelNode().isValid() && modelNode().isRootNode();
60 QStringList QmlModelStateGroup::names() const
62 QStringList returnList;
64 if (!modelNode().isValid())
65 throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
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());
77 \brief Returns list of states (without 'base state').
78 The list contains all states defined by this item.
80 QmlModelStateGroup QmlItemNode::states() const
83 return QmlModelStateGroup(modelNode());
85 return QmlModelStateGroup();
88 QList<QmlItemNode> QmlItemNode::children() const
90 QList<QmlItemNode> returnList;
94 QList<ModelNode> modelNodeList;
96 if (modelNode().hasProperty("children")) {
97 if (modelNode().property("children").isNodeListProperty())
98 modelNodeList.append(modelNode().nodeListProperty("children").toModelNodeList());
101 if (modelNode().hasProperty("data")) {
102 if (modelNode().property("data").isNodeListProperty())
103 modelNodeList.append(modelNode().nodeListProperty("data").toModelNodeList());
106 foreach (const ModelNode &modelNode, modelNodeList) {
107 if (QmlItemNode(modelNode).isValid()) //if ModelNode is FxItem
108 returnList.append(modelNode);
114 QList<QmlObjectNode> QmlItemNode::resources() const
116 QList<QmlObjectNode> returnList;
119 QList<ModelNode> modelNodeList;
120 if (modelNode().hasProperty("resources")) {
121 if (modelNode().property("resources").isNodeListProperty())
122 modelNodeList.append(modelNode().nodeListProperty("resources").toModelNodeList());
125 if (modelNode().hasProperty("data")) {
126 if (modelNode().property("data").isNodeListProperty())
127 modelNodeList.append(modelNode().nodeListProperty("data").toModelNodeList());
130 foreach (const ModelNode &node, modelNodeList) {
131 if (!QmlObjectNode(node).isValid()) //if ModelNode is no FxItem
132 returnList.append(node);
138 QList<QmlObjectNode> QmlItemNode::defaultPropertyChildren() const
140 QList<QmlObjectNode> returnList;
142 QList<ModelNode> modelNodeList;
143 if (modelNode().property(defaultProperty()).isNodeListProperty())
144 modelNodeList.append(modelNode().nodeListProperty(defaultProperty()).toModelNodeList());
146 foreach (const ModelNode &node, modelNodeList) {
147 if (!QmlObjectNode(node).isValid()) //if ModelNode is no FxItem
148 returnList.append(node);
154 QList<QmlObjectNode> QmlItemNode::allDirectSubNodes() const
156 QList<QmlObjectNode> returnList;
158 QList<ModelNode> modelNodeList = modelNode().allDirectSubModelNodes();
160 foreach (const ModelNode &node, modelNodeList) {
161 returnList.append(node);
167 QmlAnchors QmlItemNode::anchors() const
169 return QmlAnchors(*this);
172 bool QmlItemNode::hasChildren() const
174 return !children().isEmpty();
177 bool QmlItemNode::hasResources() const
179 return !resources().isEmpty();
182 bool QmlItemNode::instanceHasAnchors() const
184 return anchors().instanceHasAnchors();
187 bool QmlItemNode::hasShowContent() const
189 return nodeInstance().hasContent();
192 bool QmlItemNode::canReparent() const
194 return QmlObjectNode::canReparent() && !anchors().instanceHasAnchors() && !instanceIsAnchoredBySibling();
197 bool QmlItemNode::instanceIsAnchoredBySibling() const
199 return nodeInstance().isAnchoredBySibling();
202 bool QmlItemNode::instanceIsAnchoredByChildren() const
204 return nodeInstance().isAnchoredByChildren();
207 bool QmlItemNode::instanceIsMovable() const
209 return nodeInstance().isMovable();
212 bool QmlItemNode::instanceIsResizable() const
214 return nodeInstance().isResizable();
217 bool QmlItemNode::instanceIsInPositioner() const
219 return nodeInstance().isInPositioner();
222 QRectF QmlItemNode::instanceBoundingRect() const
224 return nodeInstance().boundingRect();
227 QTransform QmlItemNode::instanceTransform() const
229 return nodeInstance().transform();
232 QTransform QmlItemNode::instanceSceneTransform() const
234 return nodeInstance().sceneTransform();
237 QPointF QmlItemNode::instancePosition() const
239 return nodeInstance().position();
242 QSizeF QmlItemNode::instanceSize() const
244 return nodeInstance().size();
247 int QmlItemNode::instancePenWidth() const
249 return nodeInstance().penWidth();
252 void QmlItemNode::paintInstance(QPainter *painter)
254 if (nodeInstance().isValid())
255 nodeInstance().paint(painter);
258 void QmlItemNode::selectNode()
260 modelNode().selectNode();
263 void QmlItemNode::deselectNode()
265 modelNode().deselectNode();
268 bool QmlItemNode::isSelected() const
270 return modelNode().isSelected();
273 QList<QmlModelState> QmlModelStateGroup::allStates() const
275 QList<QmlModelState> returnList;
277 if (!modelNode().isValid())
278 throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
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));
289 QString QmlItemNode::simplifiedTypeName() const
291 return modelNode().simplifiedTypeName();
294 uint qHash(const QmlItemNode &node)
296 return qHash(node.modelNode());
299 QmlModelState QmlModelStateGroup::addState(const QString &name)
301 if (!modelNode().isValid())
302 throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
305 PropertyListType propertyList;
306 propertyList.append(qMakePair(QString("name"), QVariant(name)));
308 ModelNode newState = modelNode().view()->createModelNode("QtQuick.State", 1, 0, propertyList);
309 modelNode().nodeListProperty("states").reparentHere(newState);
314 void QmlModelStateGroup::removeState(const QString &name)
316 if (!modelNode().isValid())
317 throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
319 if (state(name).isValid())
320 state(name).modelNode().destroy();
323 QmlModelState QmlModelStateGroup::state(const QString &name) const
325 if (!modelNode().isValid())
326 throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
328 if (modelNode().property("states").isNodeListProperty()) {
329 foreach (const ModelNode &node, modelNode().nodeListProperty("states").toModelNodeList()) {
330 if (QmlModelState(node).name() == name)
334 return QmlModelState();
337 QList<ModelNode> toModelNodeList(const QList<QmlItemNode> &qmlItemNodeList)
339 QList<ModelNode> modelNodeList;
341 foreach (const QmlItemNode &qmlItemNode, qmlItemNodeList)
342 modelNodeList.append(qmlItemNode.modelNode());
344 return modelNodeList;
347 QList<QmlItemNode> toQmlItemNodeList(const QList<ModelNode> &modelNodeList)
349 QList<QmlItemNode> qmlItemNodeList;
351 foreach (const ModelNode &modelNode, modelNodeList) {
352 QmlItemNode itemNode(modelNode);
353 if (itemNode.isValid())
354 qmlItemNodeList.append(itemNode);
357 return qmlItemNodeList;
360 const QList<QmlItemNode> QmlItemNode::allDirectSubModelNodes() const
362 return toQmlItemNodeList(modelNode().allDirectSubModelNodes());
365 const QList<QmlItemNode> QmlItemNode::allSubModelNodes() const
367 return toQmlItemNodeList(modelNode().allSubModelNodes());
370 bool QmlItemNode::hasAnySubModelNodes() const
372 return modelNode().hasAnySubModelNodes();