summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@nokia.com>2011-06-21 15:05:15 +0200
committerThomas Hartmann <Thomas.Hartmann@nokia.com>2011-06-22 09:57:52 +0200
commit2b018f237c42efa9831027fc68189910a9e285ac (patch)
tree774999f3beb7b037a9d68254f8eabb366a944f01 /src/tools
parent27da3098ad8b27a432eefcd87616c82481c9d126 (diff)
downloadqt-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')
-rw-r--r--src/tools/qmlpuppet/instances/nodeinstanceserver.h5
-rw-r--r--src/tools/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp106
-rw-r--r--src/tools/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp4
-rw-r--r--src/tools/qmlpuppet/qml2puppet/instances/qt5rendernodeinstanceserver.cpp42
-rw-r--r--src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.cpp16
-rw-r--r--src/tools/qmlpuppet/qml2puppet/instances/sgitemnodeinstance.h2
-rw-r--r--src/tools/qmlpuppet/qmlpuppet/instances/qt4informationnodeinstanceserver.cpp6
-rw-r--r--src/tools/qmlpuppet/qmlpuppet/instances/qt4rendernodeinstanceserver.cpp6
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()) {