diff options
author | Marco Bubke <marco.bubke@nokia.com> | 2011-06-21 15:05:15 +0200 |
---|---|---|
committer | Thomas Hartmann <Thomas.Hartmann@nokia.com> | 2011-06-22 09:57:52 +0200 |
commit | 2b018f237c42efa9831027fc68189910a9e285ac (patch) | |
tree | 774999f3beb7b037a9d68254f8eabb366a944f01 /src/tools | |
parent | 27da3098ad8b27a432eefcd87616c82481c9d126 (diff) | |
download | qt-creator-2b018f237c42efa9831027fc68189910a9e285ac.tar.gz |
QmlDesigner.NodeInstances: Scene Graph prototype
Change-Id: I0c72519f637f260869b2a76b2a3cc7ece46aef57
Reviewed-on: http://codereview.qt.nokia.com/573
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Diffstat (limited to 'src/tools')
8 files changed, 166 insertions, 21 deletions
diff --git a/src/tools/qmlpuppet/instances/nodeinstanceserver.h b/src/tools/qmlpuppet/instances/nodeinstanceserver.h index cb49bd50f2..bd45ec4849 100644 --- a/src/tools/qmlpuppet/instances/nodeinstanceserver.h +++ b/src/tools/qmlpuppet/instances/nodeinstanceserver.h @@ -123,6 +123,9 @@ public: QStringList imports() const; QObject *dummyContextObject() const; + virtual QDeclarativeView *declarativeView() const = 0; + virtual QSGView *sgView() const = 0; + public slots: void refreshLocalFileProperty(const QString &path); void refreshDummyData(const QString &path); @@ -176,8 +179,6 @@ protected: void setTimerId(int timerId); int timerId() const; - virtual QDeclarativeView *declarativeView() const = 0; - virtual QSGView *sgView() const = 0; QDeclarativeContext *rootContext() const; diff --git a/src/tools/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 057c821238..1e8cd6bdf3 100644 --- a/src/tools/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/src/tools/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -64,6 +64,8 @@ #include "qt5informationnodeinstanceserver.h" +#include <QSGItem> + #include "servernodeinstance.h" #include "childrenchangeeventfilter.h" #include "propertyabstractcontainer.h" @@ -93,6 +95,8 @@ #include "dummycontextobject.h" +#include "designersupportfunctions.h" + namespace QmlDesigner { Qt5InformationNodeInstanceServer::Qt5InformationNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) : @@ -102,6 +106,87 @@ Qt5InformationNodeInstanceServer::Qt5InformationNodeInstanceServer(NodeInstanceC void Qt5InformationNodeInstanceServer::collectItemChangesAndSendChangeCommands() { + static bool inFunction = false; + if (!inFunction) { + inFunction = true; + + QSet<ServerNodeInstance> informationChangedInstanceSet; + QVector<InstancePropertyPair> propertyChangedList; + bool adjustSceneRect = false; + + if (sgView()) { + foreach (QSGItem *item, allItems()) { + if (item && hasInstanceForObject(item)) { + ServerNodeInstance instance = instanceForObject(item); + + DesignerSupport::DirtyType informationsDirty = DesignerSupport::DirtyType(DesignerSupport::TransformUpdateMask + | DesignerSupport::Visible + | DesignerSupport::ZValue + | DesignerSupport::OpacityValue); + if (DesignerSupport::dirty(item, informationsDirty)) + informationChangedInstanceSet.insert(instance); + + + if (DesignerSupport::dirty(item, DesignerSupport::ParentChanged)) { + m_parentChangedSet.insert(instance); + informationChangedInstanceSet.insert(instance); + } +// if (d->geometryChanged) { +// if (instance.isRootNodeInstance()) +// declarativeView()->scene()->setSceneRect(item->boundingRect()); +// } + + } + } + + foreach (const InstancePropertyPair& property, changedPropertyList()) { + const ServerNodeInstance instance = property.first; + const QString propertyName = property.second; + + if (instance.isValid()) { + if (instance.isRootNodeInstance() && (propertyName == "width" || propertyName == "height")) + adjustSceneRect = true; + + if (propertyName.contains("anchors")) + informationChangedInstanceSet.insert(instance); + + propertyChangedList.append(property); + } + } + + resetAllItems(); + clearChangedPropertyList(); + + if (!informationChangedInstanceSet.isEmpty()) + nodeInstanceClient()->informationChanged(createAllInformationChangedCommand(informationChangedInstanceSet.toList())); + + if (!propertyChangedList.isEmpty()) + nodeInstanceClient()->valuesChanged(createValuesChangedCommand(propertyChangedList)); + + if (!m_parentChangedSet.isEmpty()) { + sendChildrenChangedCommand(m_parentChangedSet.toList()); + m_parentChangedSet.clear(); + } + +// if (adjustSceneRect) { +// QRectF boundingRect = rootNodeInstance().boundingRect(); +// if (boundingRect.isValid()) { +// declarativeView()->setSceneRect(boundingRect); +// } +// } + + if (!m_completedComponentList.isEmpty()) { + nodeInstanceClient()->componentCompleted(createComponentCompletedCommand(m_completedComponentList)); + m_completedComponentList.clear(); + } + + slowDownRenderTimer(); + nodeInstanceClient()->flush(); + nodeInstanceClient()->synchronizeWithClientProcess(); + } + + inFunction = false; + } } void Qt5InformationNodeInstanceServer::reparentInstances(const ReparentInstancesCommand &command) @@ -113,12 +198,12 @@ void Qt5InformationNodeInstanceServer::reparentInstances(const ReparentInstances } } - NodeInstanceServer::reparentInstances(command); + Qt5NodeInstanceServer::reparentInstances(command); } void Qt5InformationNodeInstanceServer::clearScene(const ClearSceneCommand &command) { - NodeInstanceServer::clearScene(command); + Qt5NodeInstanceServer::clearScene(command); m_parentChangedSet.clear(); m_completedComponentList.clear(); @@ -126,7 +211,7 @@ void Qt5InformationNodeInstanceServer::clearScene(const ClearSceneCommand &comma void Qt5InformationNodeInstanceServer::createScene(const CreateSceneCommand &command) { - NodeInstanceServer::createScene(command); + Qt5NodeInstanceServer::createScene(command); QList<ServerNodeInstance> instanceList; foreach (const InstanceContainer &container, command.instances()) { @@ -149,13 +234,18 @@ void Qt5InformationNodeInstanceServer::sendChildrenChangedCommand(const QList<Se QList<ServerNodeInstance> noParentList; foreach (const ServerNodeInstance &child, childList) { - if (!child.hasParent()) + if (!child.hasParent()) { noParentList.append(child); - else - parentSet.insert(child.parent()); + } else { + ServerNodeInstance parent = child.parent(); + if (parent.isValid()) { + parentSet.insert(parent); + } else { + noParentList.append(child); + } + } } - foreach (const ServerNodeInstance &parent, parentSet) nodeInstanceClient()->childrenChanged(createChildrenChangedCommand(parent, parent.childItems())); @@ -166,7 +256,7 @@ void Qt5InformationNodeInstanceServer::sendChildrenChangedCommand(const QList<Se void Qt5InformationNodeInstanceServer::completeComponent(const CompleteComponentCommand &command) { - NodeInstanceServer::completeComponent(command); + Qt5NodeInstanceServer::completeComponent(command); QList<ServerNodeInstance> instanceList; foreach (qint32 instanceId, command.instances()) { diff --git a/src/tools/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/src/tools/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index 342962670c..a97b2202ec 100644 --- a/src/tools/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/src/tools/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -106,6 +106,7 @@ void Qt5NodeInstanceServer::initializeView(const QVector<AddImportContainer> &/* #ifdef Q_WS_MAC sgView()->setAttribute(Qt::WA_DontShowOnScreen, true); #endif + sgView()->setUpdatesEnabled(false); } QDeclarativeView *Qt5NodeInstanceServer::declarativeView() const @@ -129,7 +130,8 @@ void Qt5NodeInstanceServer::resizeCanvasSizeToRootItemSize() void Qt5NodeInstanceServer::resetAllItems() { - + foreach (QSGItem *item, allItems()) + DesignerSupport::resetDirty(item); } QList<ServerNodeInstance> Qt5NodeInstanceServer::setupScene(const CreateSceneCommand &command) diff --git a/src/tools/qmlpuppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp b/src/tools/qmlpuppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp index debf543334..e25c0ce3b1 100644 --- a/src/tools/qmlpuppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp +++ b/src/tools/qmlpuppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp @@ -64,6 +64,8 @@ #include "qt5rendernodeinstanceserver.h" +#include <QSGItem> + #include "servernodeinstance.h" #include "childrenchangeeventfilter.h" #include "propertyabstractcontainer.h" @@ -93,6 +95,8 @@ #include "dummycontextobject.h" +#include "designersupportfunctions.h" + namespace QmlDesigner { Qt5RenderNodeInstanceServer::Qt5RenderNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) : @@ -102,8 +106,46 @@ Qt5RenderNodeInstanceServer::Qt5RenderNodeInstanceServer(NodeInstanceClientInter void Qt5RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands() { + static bool inFunction = false; + if (!inFunction) { + inFunction = true; + + bool adjustSceneRect = false; + + if (sgView()) { + foreach (QSGItem *item, allItems()) { + if (item && hasInstanceForObject(item)) { + ServerNodeInstance instance = instanceForObject(item); + if (DesignerSupport::dirty(item, DesignerSupport::ContentUpdateMask)) + m_dirtyInstanceSet.insert(instance); + } + } + + clearChangedPropertyList(); + resetAllItems(); + + if (!m_dirtyInstanceSet.isEmpty() && nodeInstanceClient()->bytesToWrite() < 10000) { + nodeInstanceClient()->pixmapChanged(createPixmapChangedCommand(m_dirtyInstanceSet.toList())); + m_dirtyInstanceSet.clear(); + } + +// if (adjustSceneRect) { +// QRectF boundingRect = rootNodeInstance().boundingRect(); +// if (boundingRect.isValid()) { +// declarativeView()->setSceneRect(boundingRect); +// } +// } + + slowDownRenderTimer(); + nodeInstanceClient()->flush(); + nodeInstanceClient()->synchronizeWithClientProcess(); + } + + inFunction = false; + } } + void Qt5RenderNodeInstanceServer::createScene(const CreateSceneCommand &command) { NodeInstanceServer::createScene(command); diff --git a/src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.cpp b/src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.cpp index c341c52a34..8735ddf7d5 100644 --- a/src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.cpp +++ b/src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.cpp @@ -69,11 +69,13 @@ #include "qt5nodeinstanceserver.h" #include <QDeclarativeExpression> - +#include <QSGView> #include <cmath> #include <QHash> +#include <QtDebug> + namespace QmlDesigner { namespace Internal { @@ -233,7 +235,7 @@ void SGItemNodeInstance::setMovable(bool movable) SGItemNodeInstance::Pointer SGItemNodeInstance::create(QObject *object) { - QSGItem *sgItem = dynamic_cast<QSGItem*>(object); + QSGItem *sgItem = qobject_cast<QSGItem*>(object); Q_ASSERT(sgItem); @@ -252,10 +254,17 @@ SGItemNodeInstance::Pointer SGItemNodeInstance::create(QObject *object) return instance; } -void SGItemNodeInstance::initialize(const Pointer &objectNodeInstance) +void SGItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance) { + if (instanceId() == 0) { + DesignerSupport::setRootItem(nodeInstanceServer()->sgView(), sgItem()); + } else { + sgItem()->setParentItem(qobject_cast<QSGItem*>(nodeInstanceServer()->sgView()->rootObject())); + } + designerSupport()->refFromEffectItem(sgItem()); ObjectNodeInstance::initialize(objectNodeInstance); + sgItem()->update(); } bool SGItemNodeInstance::isSGItem() const @@ -559,6 +568,7 @@ void SGItemNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParentIn } refresh(); + DesignerSupport::updateDirtyNode(sgItem()); } static bool isValidAnchorName(const QString &name) diff --git a/src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.h b/src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.h index b3f35e0ca0..de17a6216e 100644 --- a/src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.h +++ b/src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.h @@ -86,7 +86,7 @@ public: ~SGItemNodeInstance(); static Pointer create(QObject *objectToBeWrapped); - void initialize(const Pointer &objectNodeInstance); + void initialize(const ObjectNodeInstance::Pointer &objectNodeInstance); bool isSGItem() const; diff --git a/src/tools/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp b/src/tools/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp index 7a25e1e72e..bbde41f8d9 100644 --- a/src/tools/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp +++ b/src/tools/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp @@ -210,7 +210,7 @@ void Qt4InformationNodeInstanceServer::reparentInstances(const ReparentInstances } } - NodeInstanceServer::reparentInstances(command); + Qt4NodeInstanceServer::reparentInstances(command); } void Qt4InformationNodeInstanceServer::clearScene(const ClearSceneCommand &command) @@ -223,7 +223,7 @@ void Qt4InformationNodeInstanceServer::clearScene(const ClearSceneCommand &comma void Qt4InformationNodeInstanceServer::createScene(const CreateSceneCommand &command) { - NodeInstanceServer::createScene(command); + Qt4NodeInstanceServer::createScene(command); QList<ServerNodeInstance> instanceList; foreach(const InstanceContainer &container, command.instances()) { @@ -263,7 +263,7 @@ void Qt4InformationNodeInstanceServer::sendChildrenChangedCommand(const QList<Se void Qt4InformationNodeInstanceServer::completeComponent(const CompleteComponentCommand &command) { - NodeInstanceServer::completeComponent(command); + Qt4NodeInstanceServer::completeComponent(command); QList<ServerNodeInstance> instanceList; foreach(qint32 instanceId, command.instances()) { diff --git a/src/tools/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp b/src/tools/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp index 914d65d808..abeeda1e20 100644 --- a/src/tools/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp +++ b/src/tools/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp @@ -148,7 +148,7 @@ void Qt4RenderNodeInstanceServer::collectItemChangesAndSendChangeCommands() void Qt4RenderNodeInstanceServer::createScene(const CreateSceneCommand &command) { - NodeInstanceServer::createScene(command); + Qt4NodeInstanceServer::createScene(command); QList<ServerNodeInstance> instanceList; foreach(const InstanceContainer &container, command.instances()) { @@ -163,14 +163,14 @@ void Qt4RenderNodeInstanceServer::createScene(const CreateSceneCommand &command) void Qt4RenderNodeInstanceServer::clearScene(const ClearSceneCommand &command) { - NodeInstanceServer::clearScene(command); + Qt4NodeInstanceServer::clearScene(command); m_dirtyInstanceSet.clear(); } void Qt4RenderNodeInstanceServer::completeComponent(const CompleteComponentCommand &command) { - NodeInstanceServer::completeComponent(command); + Qt4NodeInstanceServer::completeComponent(command); QList<ServerNodeInstance> instanceList; foreach(qint32 instanceId, command.instances()) { |