aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@nokia.com>2010-09-28 14:51:05 +0200
committerMarco Bubke <marco.bubke@nokia.com>2010-09-29 13:54:27 +0200
commit45bdff449dedeea7bce15b7749169d459c6b69fc (patch)
tree4e94f8898dec339ed5ef89b679afedf854d72ef5
parent48a43475ec8ce4b00e935f88297ca6df03668af4 (diff)
QmlDesigner: Items in Positioner cannot manipulated anymore
Add a positioner node instance and the concept of resizable and movable items. Item in a positioner will be not selected anymore. Instead their positioner will be selected which is not resizable.
-rw-r--r--share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp6
-rw-r--r--src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp6
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp4
-rw-r--r--src/plugins/qmldesigner/components/formeditor/movetool.cpp21
-rw-r--r--src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp11
-rw-r--r--src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp14
-rw-r--r--src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp2
-rw-r--r--src/plugins/qmldesigner/components/formeditor/selectiontool.cpp3
-rw-r--r--src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp3
-rw-r--r--src/plugins/qmldesigner/designercore/designercore.pri6
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstance.h4
-rw-r--r--src/plugins/qmldesigner/designercore/include/qmlitemnode.h3
-rw-r--r--src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp14
-rw-r--r--src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h4
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp23
-rw-r--r--src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp28
-rw-r--r--src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h7
-rw-r--r--src/plugins/qmldesigner/designercore/instances/positionernodeinstance.cpp65
-rw-r--r--src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h34
-rw-r--r--src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp50
-rw-r--r--src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.h6
-rw-r--r--src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp15
22 files changed, 300 insertions, 29 deletions
diff --git a/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp b/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp
index 5782f2a5ee..49ed137b57 100644
--- a/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp
+++ b/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp
@@ -97,11 +97,11 @@ void SelectionIndicator::setItems(const QList<QWeakPointer<QGraphicsObject> > &i
// set selections to also all children if they are not editor items
- foreach (QWeakPointer<QGraphicsObject> obj, itemList) {
- if (obj.isNull())
+ foreach (QWeakPointer<QGraphicsObject> object, itemList) {
+ if (object.isNull())
continue;
- QGraphicsItem *item = obj.data();
+ QGraphicsItem *item = object.data();
QGraphicsPolygonItem *newSelectionIndicatorGraphicsItem = new QGraphicsPolygonItem(m_layerItem.data());
if (!m_indicatorShapeHash.contains(item)) {
diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp
index efd1eab8a1..917f7ebf5f 100644
--- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp
@@ -93,7 +93,8 @@ bool AbstractFormEditorTool::topSelectedItemIsMovable(const QList<QGraphicsItem*
FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item);
if (formEditorItem
&& selectedNodes.contains(formEditorItem->qmlItemNode())
- && !formEditorItem->qmlItemNode().isRootNode()
+ && formEditorItem->qmlItemNode().instanceIsMovable()
+ && !formEditorItem->qmlItemNode().instanceIsInPositioner()
&& (formEditorItem->qmlItemNode().hasShowContent()))
return true;
}
@@ -101,7 +102,8 @@ bool AbstractFormEditorTool::topSelectedItemIsMovable(const QList<QGraphicsItem*
foreach (QGraphicsItem *item, itemList) {
FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item);
if (formEditorItem
- && !formEditorItem->qmlItemNode().isRootNode()
+ && formEditorItem->qmlItemNode().instanceIsMovable()
+ && !formEditorItem->qmlItemNode().instanceIsInPositioner()
&& selectedNodes.contains(formEditorItem->qmlItemNode()))
return true;
}
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp
index cbe41a4ace..6e0d7b8b24 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp
@@ -200,8 +200,8 @@ FormEditorItem *FormEditorScene::addFormEditorItem(const QmlItemNode &qmlItemNod
QRectF sceneRect(qmlItemNode.instanceBoundingRect());
setSceneRect(sceneRect);
- formLayerItem()->update();
- manipulatorLayerItem()->update();
+ formLayerItem()->update();
+ manipulatorLayerItem()->update();
}
diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.cpp b/src/plugins/qmldesigner/components/formeditor/movetool.cpp
index ae76d6455f..38da0a124b 100644
--- a/src/plugins/qmldesigner/components/formeditor/movetool.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/movetool.cpp
@@ -322,10 +322,25 @@ FormEditorItem* MoveTool::containerFormEditorItem(const QList<QGraphicsItem*> &i
return 0;
}
+QList<FormEditorItem*> movalbeItems(const QList<FormEditorItem*> &itemList)
+{
+ QList<FormEditorItem*> filteredItemList(itemList);
+
+ QMutableListIterator<FormEditorItem*> listIterator(filteredItemList);
+ while (listIterator.hasNext()) {
+ FormEditorItem *item = listIterator.next();
+ if (!item->qmlItemNode().isValid() || !item->qmlItemNode().instanceIsMovable() || item->qmlItemNode().instanceIsInPositioner())
+ listIterator.remove();
+ }
+
+ return filteredItemList;
+}
QList<FormEditorItem*> MoveTool::movingItems(const QList<FormEditorItem*> &selectedItemList)
{
- FormEditorItem* ancestorItem = ancestorIfOtherItemsAreChild(selectedItemList);
+ QList<FormEditorItem*> filteredItemList = movalbeItems(selectedItemList);
+
+ FormEditorItem* ancestorItem = ancestorIfOtherItemsAreChild(filteredItemList);
if (ancestorItem != 0 && ancestorItem->qmlItemNode().isRootNode()) {
// view()->changeToSelectionTool();
@@ -339,12 +354,12 @@ QList<FormEditorItem*> MoveTool::movingItems(const QList<FormEditorItem*> &selec
return ancestorItemList;
}
- if (!haveSameParent(selectedItemList)) {
+ if (!haveSameParent(filteredItemList)) {
// view()->changeToSelectionTool();
return QList<FormEditorItem*>();
}
- return selectedItemList;
+ return filteredItemList;
}
void MoveTool::formEditorItemsChanged(const QList<FormEditorItem*> &itemList)
diff --git a/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp b/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp
index a1b5b56fcb..473618a664 100644
--- a/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp
@@ -72,11 +72,12 @@ void ResizeIndicator::setItems(const QList<FormEditorItem*> &itemList)
foreach (FormEditorItem* item, itemList) {
if (item
- && item->qmlItemNode().isValid()
- && item->qmlItemNode().isRootNode())
- continue;
- ResizeController controller(m_layerItem, item);
- m_itemControllerHash.insert(item, controller);
+ && item->qmlItemNode().isValid()
+ && item->qmlItemNode().instanceIsResizable()
+ && !item->qmlItemNode().instanceIsInPositioner()) {
+ ResizeController controller(m_layerItem, item);
+ m_itemControllerHash.insert(item, controller);
+ }
}
}
diff --git a/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp
index 18804d88e4..1872d66fc0 100644
--- a/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp
@@ -101,18 +101,20 @@ void RubberBandSelectionManipulator::select(SelectionType selectionType)
FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item);
if (formEditorItem
- && formEditorItem->qmlItemNode().isValid()
- && m_beginFormEditorItem->childItems().contains(formEditorItem)
- && !formEditorItem->qmlItemNode().isRootNode())
+ && formEditorItem->qmlItemNode().isValid()
+ && m_beginFormEditorItem->childItems().contains(formEditorItem)
+ && formEditorItem->qmlItemNode().instanceIsMovable()
+ && !formEditorItem->qmlItemNode().instanceIsInPositioner())
{
newNodeList.append(formEditorItem->qmlItemNode());
}
}
if (newNodeList.isEmpty()
- && m_beginFormEditorItem->qmlItemNode().isValid()
- && !m_beginFormEditorItem->qmlItemNode().isRootNode())
- newNodeList.append(m_beginFormEditorItem->qmlItemNode());
+ && m_beginFormEditorItem->qmlItemNode().isValid()
+ && m_beginFormEditorItem->qmlItemNode().instanceIsMovable()
+ && !m_beginFormEditorItem->qmlItemNode().instanceIsInPositioner())
+ newNodeList.append(m_beginFormEditorItem->qmlItemNode());
QList<QmlItemNode> nodeList;
diff --git a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp
index e5c12648f9..2dcda48f20 100644
--- a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp
@@ -85,7 +85,7 @@ void SelectionIndicator::setItems(const QList<FormEditorItem*> &itemList)
clear();
foreach (FormEditorItem *item, itemList) {
- if (item->qmlItemNode().isValid())
+ if (!item->qmlItemNode().isValid())
continue;
QGraphicsPolygonItem *newSelectionIndicatorGraphicsItem = new QGraphicsPolygonItem(m_layerItem.data());
diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp
index 787fedef09..5fc65decf0 100644
--- a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp
@@ -145,7 +145,8 @@ void SelectionTool::hoverMoveEvent(const QList<QGraphicsItem*> &itemList,
if (formEditorItem
&& formEditorItem->qmlItemNode().isValid()
- && !formEditorItem->qmlItemNode().isRootNode()
+ && !formEditorItem->qmlItemNode().instanceIsInPositioner()
+ && formEditorItem->qmlItemNode().instanceIsMovable()
&& (formEditorItem->qmlItemNode().hasShowContent() || !m_selectOnlyContentItems))
{
topSelectableItem = formEditorItem;
diff --git a/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp
index cc38edb07e..3fc09240b8 100644
--- a/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp
@@ -81,7 +81,8 @@ void SingleSelectionManipulator::select(SelectionType selectionType, bool select
if (formEditorItem
&& formEditorItem->qmlItemNode().isValid()
- && !formEditorItem->qmlItemNode().isRootNode()
+ && formEditorItem->qmlItemNode().instanceIsMovable()
+ && !formEditorItem->qmlItemNode().instanceIsInPositioner()
&& (formEditorItem->qmlItemNode().hasShowContent() || !selectOnlyContentItems))
{
selectedNode = formEditorItem->qmlItemNode();
diff --git a/src/plugins/qmldesigner/designercore/designercore.pri b/src/plugins/qmldesigner/designercore/designercore.pri
index 81674e0eb0..885e6cb2ea 100644
--- a/src/plugins/qmldesigner/designercore/designercore.pri
+++ b/src/plugins/qmldesigner/designercore/designercore.pri
@@ -94,7 +94,8 @@ SOURCES += $$PWD/model/abstractview.cpp \
$$PWD/exceptions/rewritingexception.cpp \
$$PWD/instances/nodeinstancemetaobject.cpp \
$$PWD/instances/behaviornodeinstance.cpp \
- $$PWD/instances/nodeinstancesignalspy.cpp
+ $$PWD/instances/nodeinstancesignalspy.cpp \
+ $$PWD/instances/positionernodeinstance.cpp
HEADERS += $$PWD/include/corelib_global.h \
$$PWD/include/abstractview.h \
@@ -187,7 +188,8 @@ HEADERS += $$PWD/include/corelib_global.h \
$$PWD/include/rewritingexception.h \
$$PWD/instances/nodeinstancemetaobject.h \
$$PWD/instances/behaviornodeinstance.h \
- $$PWD/instances/nodeinstancesignalspy.h
+ $$PWD/instances/nodeinstancesignalspy.h \
+ $$PWD/instances/positionernodeinstance.h
contains(CONFIG, plugin) {
# If core.pri has been included in the qmldesigner plugin
diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h
index 20c13cab39..0b5a223d38 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeinstance.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeinstance.h
@@ -102,6 +102,7 @@ public:
bool isQDeclarativeView() const;
bool isGraphicsObject() const;
bool isTransition() const;
+ bool isPositioner() const;
bool equalGraphicsItem(QGraphicsItem *item) const;
@@ -127,6 +128,9 @@ public:
bool isValid() const;
void makeInvalid();
bool hasContent() const;
+ bool isResizable() const;
+ bool isMovable() const;
+ bool isInPositioner() const;
bool isWrappingThisObject(QObject *object) const;
diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h
index e197067c07..5500f5eeb0 100644
--- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h
+++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h
@@ -68,6 +68,9 @@ public:
bool canReparent() const;
bool instanceIsAnchoredBySibling() const;
bool instanceIsAnchoredByChildren() const;
+ bool instanceIsMovable() const;
+ bool instanceIsResizable() const;
+ bool instanceIsInPositioner() const;
QRectF instanceBoundingRect() const;
QTransform instanceTransform() const;
diff --git a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp
index f654f198d1..65b15d4d13 100644
--- a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp
@@ -40,7 +40,8 @@ namespace Internal {
GraphicsObjectNodeInstance::GraphicsObjectNodeInstance(QGraphicsObject *graphicsObject, bool hasContent)
: ObjectNodeInstance(graphicsObject),
- m_hasContent(hasContent)
+ m_hasContent(hasContent),
+ m_isMovable(true)
{
}
@@ -232,5 +233,16 @@ void GraphicsObjectNodeInstance::paintUpdate()
{
graphicsObject()->update();
}
+
+bool GraphicsObjectNodeInstance::isMovable() const
+{
+ return m_isMovable && graphicsObject() && graphicsObject()->parentItem();
+}
+
+void GraphicsObjectNodeInstance::setMovable(bool movable)
+{
+ m_isMovable = movable;
+}
+
} // namespace Internal
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h
index ab718a2c45..45200acd27 100644
--- a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h
+++ b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h
@@ -74,12 +74,16 @@ public:
void paintUpdate();
+ bool isMovable() const;
+ void setMovable(bool movable);
+
protected:
QGraphicsObject *graphicsObject() const;
void paintRecursively(QGraphicsItem *graphicsItem, QPainter *painter) const;
static QPair<QGraphicsObject*, bool> createGraphicsObject(const NodeMetaInfo &metaInfo, QDeclarativeContext *context);
private: // variables
bool m_hasContent;
+ bool m_isMovable;
};
} // namespace Internal
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp
index a1c97686fa..39da34d8ae 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp
@@ -42,6 +42,7 @@
#include "componentnodeinstance.h"
#include "qmltransitionnodeinstance.h"
#include "qmlpropertychangesnodeinstance.h"
+#include "positionernodeinstance.h"
#include "behaviornodeinstance.h"
#include "qmlstatenodeinstance.h"
#include "nodeabstractproperty.h"
@@ -144,6 +145,8 @@ Internal::ObjectNodeInstance::Pointer NodeInstance::createInstance(const NodeMet
instance = Internal::QDeclarativeViewNodeInstance::create(metaInfo, context, objectToBeWrapped);
else if (metaInfo.isSubclassOf("Qt/QGraphicsWidget", 4, 7))
instance = Internal::GraphicsWidgetNodeInstance::create(metaInfo, context, objectToBeWrapped);
+ else if (metaInfo.isSubclassOf("QDeclarativeBasePositioner", 4, 7))
+ instance = Internal::PositionerNodeInstance::create(metaInfo, context, objectToBeWrapped);
else if (metaInfo.isSubclassOf("Qt/Item", 4, 7))
instance = Internal::QmlGraphicsItemNodeInstance::create(metaInfo, context, objectToBeWrapped);
else if (metaInfo.isSubclassOf("Qt/QGraphicsScene", 4, 7))
@@ -341,6 +344,11 @@ bool NodeInstance::isTransition() const
return m_nodeInstance->isTransition();
}
+bool NodeInstance::isPositioner() const
+{
+ return m_nodeInstance->isPositioner();
+}
+
/*!
\brief Returns if the NodeInstance is a QGraphicsItem.
\returns true if this NodeInstance is a QGraphicsItem
@@ -460,6 +468,21 @@ bool NodeInstance::hasContent() const
return m_nodeInstance->hasContent();
}
+bool NodeInstance::isResizable() const
+{
+ return m_nodeInstance->isResizable();
+}
+
+bool NodeInstance::isMovable() const
+{
+ return m_nodeInstance->isMovable();
+}
+
+bool NodeInstance::isInPositioner() const
+{
+ return m_nodeInstance->isInPositioner();
+}
+
bool NodeInstance::hasAnchor(const QString &name) const
{
return m_nodeInstance->hasAnchor(name);
diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp
index 61701feb4b..3937759fa2 100644
--- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp
@@ -98,7 +98,8 @@ bool ChildrenChangeEventFilter::eventFilter(QObject * /*object*/, QEvent *event)
ObjectNodeInstance::ObjectNodeInstance(QObject *object)
: m_deleteHeldInstance(true),
m_object(object),
- m_metaObject(0)
+ m_metaObject(0),
+ m_isInPositioner(false)
{
}
@@ -249,6 +250,11 @@ bool ObjectNodeInstance::isTransition() const
return false;
}
+bool ObjectNodeInstance::isPositioner() const
+{
+ return false;
+}
+
bool ObjectNodeInstance::equalGraphicsItem(QGraphicsItem * /*item*/) const
{
return false;
@@ -795,6 +801,26 @@ bool ObjectNodeInstance::hasContent() const
return false;
}
+bool ObjectNodeInstance::isResizable() const
+{
+ return false;
+}
+
+bool ObjectNodeInstance::isMovable() const
+{
+ return false;
+}
+
+bool ObjectNodeInstance::isInPositioner() const
+{
+ return m_isInPositioner;
+}
+
+void ObjectNodeInstance::setInPositioner(bool isInPositioner)
+{
+ m_isInPositioner = isInPositioner;
+}
+
void ObjectNodeInstance::updateAnchors()
{
}
diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h
index 20718b3a9a..f62963cf44 100644
--- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h
+++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h
@@ -117,6 +117,8 @@ public:
virtual bool isQDeclarativeView() const;
virtual bool isGraphicsObject() const;
virtual bool isTransition() const;
+ virtual bool isPositioner() const;
+
virtual bool equalGraphicsItem(QGraphicsItem *item) const;
@@ -165,6 +167,10 @@ public:
QObject *object() const;
virtual bool hasContent() const;
+ virtual bool isResizable() const;
+ virtual bool isMovable() const;
+ bool isInPositioner() const;
+ void setInPositioner(bool isInPositioner);
bool hasBindingForProperty(const QString &name) const;
@@ -207,6 +213,7 @@ private:
QWeakPointer<QObject> m_object;
NodeInstanceMetaObject *m_metaObject;
NodeInstanceSignalSpy m_signalSpy;
+ bool m_isInPositioner;
};
diff --git a/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.cpp
new file mode 100644
index 0000000000..ecc8ee3e8f
--- /dev/null
+++ b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.cpp
@@ -0,0 +1,65 @@
+#include "positionernodeinstance.h"
+#include <private/qdeclarativepositioners_p.h>
+#include <invalidnodeinstanceexception.h>
+
+namespace QmlDesigner {
+namespace Internal {
+
+PositionerNodeInstance::PositionerNodeInstance(QDeclarativeBasePositioner *item, bool hasContent)
+ : QmlGraphicsItemNodeInstance(item, hasContent)
+{
+}
+
+bool PositionerNodeInstance::isPositioner() const
+{
+ return true;
+}
+
+bool PositionerNodeInstance::isResizable() const
+{
+ return false;
+}
+
+void PositionerNodeInstance::setPropertyVariant(const QString &name, const QVariant &value)
+{
+ if (name == "move" || name == "add")
+ return;
+
+ QmlGraphicsItemNodeInstance::setPropertyVariant(name, value);
+}
+
+void PositionerNodeInstance::setPropertyBinding(const QString &name, const QString &expression)
+{
+ if (name == "move" || name == "add")
+ return;
+
+ QmlGraphicsItemNodeInstance::setPropertyBinding(name, expression);
+}
+
+PositionerNodeInstance::Pointer PositionerNodeInstance::create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped)
+{
+ QPair<QGraphicsObject*, bool> objectPair;
+
+ if (objectToBeWrapped)
+ objectPair = qMakePair(qobject_cast<QGraphicsObject*>(objectToBeWrapped), false);
+ else
+ objectPair = GraphicsObjectNodeInstance::createGraphicsObject(metaInfo, context);
+
+ QDeclarativeBasePositioner *positioner = dynamic_cast<QDeclarativeBasePositioner*>(objectPair.first);
+
+ if (positioner == 0)
+ throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
+
+ Pointer instance(new PositionerNodeInstance(positioner, objectPair.second));
+
+ static_cast<QDeclarativeParserStatus*>(positioner)->classBegin();
+
+ if (objectToBeWrapped)
+ instance->setDeleteHeldInstance(false); // the object isn't owned
+
+ instance->populateResetValueHash();
+
+ return instance;
+}
+}
+} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h
new file mode 100644
index 0000000000..9369ad6832
--- /dev/null
+++ b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h
@@ -0,0 +1,34 @@
+#ifndef POSITIONERNODEINSTANCE_H
+#define POSITIONERNODEINSTANCE_H
+
+#include "qmlgraphicsitemnodeinstance.h"
+
+class QDeclarativeBasePositioner;
+
+namespace QmlDesigner {
+namespace Internal {
+
+class PositionerNodeInstance : public QmlGraphicsItemNodeInstance
+{
+public:
+ typedef QSharedPointer<PositionerNodeInstance> Pointer;
+ typedef QWeakPointer<PositionerNodeInstance> WeakPointer;
+
+ static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
+
+ void setPropertyVariant(const QString &name, const QVariant &value);
+ void setPropertyBinding(const QString &name, const QString &expression);
+
+ bool isPositioner() const;
+
+ bool isResizable() const;
+
+
+protected:
+ PositionerNodeInstance(QDeclarativeBasePositioner *item, bool hasContent);
+};
+
+} // namespace Internal
+} // namespace QmlDesigner
+
+#endif // POSITIONERNODEINSTANCE_H
diff --git a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp
index 671e5b7c94..524da7551a 100644
--- a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp
@@ -45,6 +45,8 @@
#include <private/qdeclarativeitem_p.h>
#include <private/qdeclarativeproperty_p.h>
#include <private/qdeclarativerectangle_p.h>
+#include <private/qdeclarativepositioners_p.h>
+
#include <cmath>
@@ -56,7 +58,8 @@ namespace Internal {
QmlGraphicsItemNodeInstance::QmlGraphicsItemNodeInstance(QDeclarativeItem *item, bool hasContent)
: GraphicsObjectNodeInstance(item, hasContent),
m_hasHeight(false),
- m_hasWidth(false)
+ m_hasWidth(false),
+ m_isResizable(true)
{
}
@@ -80,6 +83,9 @@ QmlGraphicsItemNodeInstance::Pointer QmlGraphicsItemNodeInstance::create(const N
Pointer instance(new QmlGraphicsItemNodeInstance(qmlGraphicsItem, objectPair.second));
+ if (qmlGraphicsItem->inherits("QDeclarativeText"))
+ instance->setResizable(false);
+
static_cast<QDeclarativeParserStatus*>(qmlGraphicsItem)->classBegin();
if (objectToBeWrapped)
@@ -223,6 +229,8 @@ void QmlGraphicsItemNodeInstance::setPropertyVariant(const QString &name, const
}
GraphicsObjectNodeInstance::setPropertyVariant(name, value);
+
+ refresh();
}
void QmlGraphicsItemNodeInstance::setPropertyBinding(const QString &name, const QString &expression)
@@ -288,6 +296,24 @@ void QmlGraphicsItemNodeInstance::resetVertical()
setPropertyVariant("height", qmlGraphicsItem()->implicitHeight());
}
+static void repositioning(QDeclarativeItem *item)
+{
+ if (!item)
+ return;
+
+// QDeclarativeBasePositioner *positioner = qobject_cast<QDeclarativeBasePositioner*>(item);
+// if (positioner)
+// positioner->rePositioning();
+
+ if (item->parentObject())
+ repositioning(qobject_cast<QDeclarativeItem*>(item->parentObject()));
+}
+
+void QmlGraphicsItemNodeInstance::refresh()
+{
+ repositioning(qmlGraphicsItem());
+}
+
void QmlGraphicsItemNodeInstance::doComponentComplete()
{
if (qmlGraphicsItem()) {
@@ -297,6 +323,16 @@ void QmlGraphicsItemNodeInstance::doComponentComplete()
}
}
+bool QmlGraphicsItemNodeInstance::isResizable() const
+{
+ return m_isResizable && qmlGraphicsItem() && qmlGraphicsItem()->parentItem();
+}
+
+void QmlGraphicsItemNodeInstance::setResizable(bool resizeable)
+{
+ m_isResizable = resizeable;
+}
+
int QmlGraphicsItemNodeInstance::penWidth() const
{
QDeclarativeRectangle *rectangle = qobject_cast<QDeclarativeRectangle*>(object());
@@ -350,7 +386,19 @@ void QmlGraphicsItemNodeInstance::resetProperty(const QString &name)
void QmlGraphicsItemNodeInstance::reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty)
{
+ if (oldParentInstance.isValid() && oldParentInstance.isPositioner()) {
+ setInPositioner(false);
+ setMovable(true);
+ }
+
GraphicsObjectNodeInstance::reparent(oldParentInstance, oldParentProperty, newParentInstance, newParentProperty);
+
+ if (newParentInstance.isValid() && newParentInstance.isPositioner()) {
+ setInPositioner(true);
+ setMovable(false);
+ }
+
+ refresh();
}
//void QmlGraphicsItemNodeInstance::updateAnchors()
diff --git a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.h
index 96db456ab9..9aa68547e9 100644
--- a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.h
+++ b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.h
@@ -70,16 +70,22 @@ public:
bool isAnchoredByChildren() const;
void doComponentComplete();
+ bool isResizable() const;
+ void setResizable(bool resizeable);
+
protected:
QmlGraphicsItemNodeInstance(QDeclarativeItem *item, bool hasContent);
QDeclarativeItem *qmlGraphicsItem() const;
QDeclarativeAnchors *anchors() const;
void resetHorizontal();
void resetVertical();
+ void refresh();
private: //variables
bool m_hasHeight;
bool m_hasWidth;
+ bool m_isResizable;
+
};
}
diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
index cafa7754ce..8a6369475a 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
@@ -201,6 +201,21 @@ bool QmlItemNode::instanceIsAnchoredByChildren() const
return nodeInstance().isAnchoredByChildren();
}
+bool QmlItemNode::instanceIsMovable() const
+{
+ return nodeInstance().isMovable();
+}
+
+bool QmlItemNode::instanceIsResizable() const
+{
+ return nodeInstance().isResizable();
+}
+
+bool QmlItemNode::instanceIsInPositioner() const
+{
+ return nodeInstance().isInPositioner();
+}
+
QRectF QmlItemNode::instanceBoundingRect() const
{
return nodeInstance().boundingRect();