aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2020-09-03 13:48:13 +0200
committerThomas Hartmann <thomas.hartmann@qt.io>2020-09-11 08:57:42 +0000
commit0f9010d381d9defb7597f28186b9e10d3dd3eae1 (patch)
tree437e2d0e8774736804bb3fe37f1bc2995ffd1622
parenta535196c418a7054c2fb1524ff1df9afb0961166 (diff)
QmlDesigner: Introduce multiple node instance server
For capturing data we need a atomic mechanism. So in one process multiple node instance server can be started and then a command is send back that a scene is created. It can be used to ensure that captured data of views is up to date. Task-number: QDS-2630 Change-Id: Iea8d0b036b6384c9c1b0f91af401f2b1f1978c12 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--share/qtcreator/qml/qmlpuppet/commands/commands.pri1
-rw-r--r--share/qtcreator/qml/qmlpuppet/commands/scenecreatedcommand.h42
-rw-r--r--share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp6
-rw-r--r--share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h1
-rw-r--r--share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h2
-rw-r--r--share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp4
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/capturenodeinstanceserverdispatcher.cpp53
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/capturenodeinstanceserverdispatcher.h50
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri9
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp25
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h20
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserverdispatcher.cpp202
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserverdispatcher.h71
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturepreviewnodeinstanceserver.cpp (renamed from share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturenodeinstanceserver.cpp)4
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturepreviewnodeinstanceserver.h (renamed from share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturenodeinstanceserver.h)4
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp9
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h2
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorview.cpp8
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorview.h1
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp19
-rw-r--r--src/plugins/qmldesigner/components/formeditor/formeditorwidget.h1
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodeinstanceview.h1
-rw-r--r--src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp3
-rw-r--r--src/plugins/qmldesigner/qmldesignerplugin.qbs1
-rw-r--r--src/tools/qml2puppet/CMakeLists.txt5
-rw-r--r--src/tools/qml2puppet/qml2puppet.qbs9
26 files changed, 520 insertions, 33 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/commands/commands.pri b/share/qtcreator/qml/qmlpuppet/commands/commands.pri
index f343cbbd47..680abb2744 100644
--- a/share/qtcreator/qml/qmlpuppet/commands/commands.pri
+++ b/share/qtcreator/qml/qmlpuppet/commands/commands.pri
@@ -6,6 +6,7 @@ HEADERS += $$PWD/synchronizecommand.h \ \
$$PWD/changelanguagecommand.h \
$$PWD//debugoutputcommand.h \
$$PWD/endpuppetcommand.h \
+ $$PWD/scenecreatedcommand.h \
$$PWD/tokencommand.h \
$$PWD/componentcompletedcommand.h \
$$PWD/completecomponentcommand.h \
diff --git a/share/qtcreator/qml/qmlpuppet/commands/scenecreatedcommand.h b/share/qtcreator/qml/qmlpuppet/commands/scenecreatedcommand.h
new file mode 100644
index 0000000000..c854821b83
--- /dev/null
+++ b/share/qtcreator/qml/qmlpuppet/commands/scenecreatedcommand.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#pragma once
+
+#include <QMetaType>
+
+namespace QmlDesigner {
+
+class SceneCreatedCommand
+{
+public:
+ friend QDataStream &operator<<(QDataStream &out, const SceneCreatedCommand &) { return out; }
+
+ friend QDataStream &operator>>(QDataStream &in, SceneCreatedCommand &) { return in; }
+};
+
+} // namespace QmlDesigner
+
+Q_DECLARE_METATYPE(QmlDesigner::SceneCreatedCommand)
diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp
index 1f23d39d7d..67f9efe987 100644
--- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp
+++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp
@@ -68,6 +68,7 @@
#include "removepropertiescommand.h"
#include "removesharedmemorycommand.h"
#include "reparentinstancescommand.h"
+#include "scenecreatedcommand.h"
#include "statepreviewimagechangedcommand.h"
#include "synchronizecommand.h"
#include "tokencommand.h"
@@ -275,6 +276,11 @@ void NodeInstanceClientProxy::capturedData(const CapturedDataCommand &command)
writeCommand(QVariant::fromValue(command));
}
+void NodeInstanceClientProxy::sceneCreated(const SceneCreatedCommand &command)
+{
+ writeCommand(QVariant::fromValue(command));
+}
+
void NodeInstanceClientProxy::flush()
{
}
diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h
index c034435be8..11658c5dd5 100644
--- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h
+++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h
@@ -87,6 +87,7 @@ public:
void selectionChanged(const ChangeSelectionCommand &command) override;
void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) override;
void capturedData(const CapturedDataCommand &capturedData) override;
+ void sceneCreated(const SceneCreatedCommand &command) override;
void flush() override;
void synchronizeWithClientProcess() override;
diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h
index d60e0d7ff0..e3b9121c82 100644
--- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h
+++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h
@@ -43,6 +43,7 @@ class PuppetAliveCommand;
class ChangeSelectionCommand;
class PuppetToCreatorCommand;
class CapturedDataCommand;
+class SceneCreatedCommand;
class NodeInstanceClientInterface
{
@@ -59,6 +60,7 @@ public:
virtual void selectionChanged(const ChangeSelectionCommand &command) = 0;
virtual void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) = 0;
virtual void capturedData(const CapturedDataCommand &command) = 0;
+ virtual void sceneCreated(const SceneCreatedCommand &command) = 0;
virtual void flush() {}
virtual void synchronizeWithClientProcess() {}
diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp
index e3a05376e2..638308af11 100644
--- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp
+++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp
@@ -60,6 +60,7 @@
#include "removepropertiescommand.h"
#include "removesharedmemorycommand.h"
#include "reparentinstancescommand.h"
+#include "scenecreatedcommand.h"
#include "statepreviewimagechangedcommand.h"
#include "synchronizecommand.h"
#include "tokencommand.h"
@@ -223,6 +224,9 @@ void NodeInstanceServerInterface::registerCommands()
qRegisterMetaType<CapturedDataCommand>("CapturedDataCommand");
qRegisterMetaTypeStreamOperators<CapturedDataCommand>("CapturedDataCommand");
+
+ qRegisterMetaType<SceneCreatedCommand>("SceneCreatedCommand");
+ qRegisterMetaTypeStreamOperators<SceneCreatedCommand>("SceneCreatedCommand");
}
}
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/capturenodeinstanceserverdispatcher.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/capturenodeinstanceserverdispatcher.cpp
new file mode 100644
index 0000000000..e03dcd3d34
--- /dev/null
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/capturenodeinstanceserverdispatcher.cpp
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "capturenodeinstanceserverdispatcher.h"
+
+#include "nodeinstanceclientinterface.h"
+#include "qt5capturepreviewnodeinstanceserver.h"
+#include "qt5informationnodeinstanceserver.h"
+#include "qt5rendernodeinstanceserver.h"
+#include "scenecreatedcommand.h"
+
+namespace QmlDesigner {
+
+void CaptureNodeInstanceServerDispatcher::createScene(const CreateSceneCommand &command)
+{
+ NodeInstanceServerDispatcher::createScene(command);
+
+ QTimer::singleShot(100,
+ this,
+ &CaptureNodeInstanceServerDispatcher::collectItemChangesAndSendChangeCommands);
+}
+
+void CaptureNodeInstanceServerDispatcher::collectItemChangesAndSendChangeCommands()
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->collectItemChangesAndSendChangeCommands();
+
+ m_nodeInstanceClient->sceneCreated({});
+}
+
+} // namespace QmlDesigner
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/capturenodeinstanceserverdispatcher.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/capturenodeinstanceserverdispatcher.h
new file mode 100644
index 0000000000..8544ea1a1c
--- /dev/null
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/capturenodeinstanceserverdispatcher.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#pragma once
+
+#include "nodeinstanceserverdispatcher.h"
+
+namespace QmlDesigner {
+
+class CaptureNodeInstanceServerDispatcher : public NodeInstanceServerDispatcher
+{
+public:
+ CaptureNodeInstanceServerDispatcher(const QStringList &serverNames,
+ NodeInstanceClientInterface *nodeInstanceClient)
+ : NodeInstanceServerDispatcher{serverNames, nodeInstanceClient}
+ , m_nodeInstanceClient{nodeInstanceClient}
+ {}
+
+ void createScene(const CreateSceneCommand &command);
+
+private:
+ void collectItemChangesAndSendChangeCommands();
+
+private:
+ NodeInstanceClientInterface *m_nodeInstanceClient;
+};
+
+} // namespace QmlDesigner
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri
index b57e3aab8f..85de00c5ff 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/instances.pri
@@ -6,7 +6,10 @@ versionAtLeast(QT_VERSION, 5.15.0):qtHaveModule(quick3d) {
}
HEADERS += $$PWD/qt5nodeinstanceserver.h \
- $$PWD/qt5capturenodeinstanceserver.h \
+ $$PWD/capturenodeinstanceserverdispatcher.h \
+ $$PWD/capturescenecreatedcommand.h \
+ $$PWD/nodeinstanceserverdispatcher.h \
+ $$PWD/qt5capturepreviewnodeinstanceserver.h \
$$PWD/qt5testnodeinstanceserver.h \
$$PWD/qt5informationnodeinstanceserver.h \
$$PWD/qt5rendernodeinstanceserver.h \
@@ -33,7 +36,9 @@ HEADERS += $$PWD/qt5nodeinstanceserver.h \
$$PWD/quick3dtexturenodeinstance.h
SOURCES += $$PWD/qt5nodeinstanceserver.cpp \
- $$PWD/qt5capturenodeinstanceserver.cpp \
+ $$PWD/capturenodeinstanceserverdispatcher.cpp \
+ $$PWD/nodeinstanceserverdispatcher.cpp \
+ $$PWD/qt5capturepreviewnodeinstanceserver.cpp \
$$PWD/qt5testnodeinstanceserver.cpp \
$$PWD/qt5informationnodeinstanceserver.cpp \
$$PWD/qt5rendernodeinstanceserver.cpp \
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp
index 368f99a033..c53e537862 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp
@@ -261,7 +261,7 @@ void NodeInstanceServer::setRenderTimerInterval(int timerInterval)
void NodeInstanceServer::setSlowRenderTimerInterval(int timerInterval)
{
- m_slowRenderTimerInterval = timerInterval;
+ m_timerModeInterval = timerInterval;
}
void NodeInstanceServer::setTimerId(int timerId)
@@ -281,29 +281,31 @@ int NodeInstanceServer::renderTimerInterval() const
void NodeInstanceServer::startRenderTimer()
{
- if (m_slowRenderTimer)
+ if (m_timerMode == TimerMode::SlowTimer)
stopRenderTimer();
+ if (m_timerMode == TimerMode::DisableTimer)
+ return;
+
if (m_timer == 0)
m_timer = startTimer(m_renderTimerInterval);
- m_slowRenderTimer = false;
+ m_timerMode = TimerMode::NormalTimer;
}
void NodeInstanceServer::slowDownRenderTimer()
{
- if (!m_slowRenderTimer)
- stopRenderTimer();
-
if (m_timer != 0) {
killTimer(m_timer);
m_timer = 0;
}
- if (m_timer == 0)
- m_timer = startTimer(m_slowRenderTimerInterval);
+ if (m_timerMode == TimerMode::DisableTimer)
+ return;
+
+ m_timer = startTimer(m_timerModeInterval);
- m_slowRenderTimer = true;
+ m_timerMode = TimerMode::SlowTimer;
}
void NodeInstanceServer::stopRenderTimer()
@@ -1449,4 +1451,9 @@ void NodeInstanceServer::handleExtraRender()
}
}
+void NodeInstanceServer::disableTimer()
+{
+ m_timerMode = TimerMode::DisableTimer;
+}
+
} // namespace QmlDesigner
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h
index 140e216049..0c5810b3ec 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h
@@ -114,6 +114,8 @@ namespace Internal {
class ChildrenChangeEventFilter;
}
+enum class TimerMode { DisableTimer, NormalTimer, SlowTimer };
+
class NodeInstanceServer : public NodeInstanceServerInterface
{
Q_OBJECT
@@ -128,7 +130,6 @@ public:
QVariant propertyValue;
};
-
explicit NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient);
void createInstances(const CreateInstancesCommand &command) override;
@@ -171,7 +172,9 @@ public:
QFileSystemWatcher *dummydataFileSystemWatcher();
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter() const;
void addFilePropertyToFileSystemWatcher(QObject *object, const PropertyName &propertyName, const QString &path);
- void removeFilePropertyFromFileSystemWatcher(QObject *object, const PropertyName &propertyName, const QString &path);
+ void removeFilePropertyFromFileSystemWatcher(QObject *object,
+ const PropertyName &propertyName,
+ const QString &path);
QUrl fileUrl() const;
@@ -190,7 +193,9 @@ public:
virtual QQuickView *quickView() const = 0;
void sendDebugOutput(DebugOutputCommand::Type type, const QString &message, qint32 instanceId = 0);
- void sendDebugOutput(DebugOutputCommand::Type type, const QString &message, const QVector<qint32> &instanceIds);
+ void sendDebugOutput(DebugOutputCommand::Type type,
+ const QString &message,
+ const QVector<qint32> &instanceIds);
void removeInstanceRelationsipForDeletedObject(QObject *object);
@@ -198,6 +203,10 @@ public:
void decrementNeedsExtraRender();
void handleExtraRender();
+ void disableTimer();
+
+ virtual void collectItemChangesAndSendChangeCommands() = 0;
+
public slots:
void refreshLocalFileProperty(const QString &path);
void refreshDummyData(const QString &path);
@@ -221,7 +230,6 @@ protected:
void timerEvent(QTimerEvent *) override;
- virtual void collectItemChangesAndSendChangeCommands() = 0;
ValuesChangedCommand createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const;
ValuesChangedCommand createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const;
@@ -290,8 +298,8 @@ private:
NodeInstanceClientInterface *m_nodeInstanceClient;
int m_timer = 0;
int m_renderTimerInterval = 16;
- bool m_slowRenderTimer = false;
- int m_slowRenderTimerInterval = 200;
+ TimerMode m_timerMode = TimerMode::NormalTimer;
+ int m_timerModeInterval = 200;
QVector<InstancePropertyPair> m_changedPropertyList;
QByteArray m_importCode;
QPointer<QObject> m_dummyContextObject;
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserverdispatcher.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserverdispatcher.cpp
new file mode 100644
index 0000000000..a06a156e15
--- /dev/null
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserverdispatcher.cpp
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "nodeinstanceserverdispatcher.h"
+
+#include "qt5capturepreviewnodeinstanceserver.h"
+#include "qt5informationnodeinstanceserver.h"
+#include "qt5rendernodeinstanceserver.h"
+
+namespace QmlDesigner {
+
+NodeInstanceServerDispatcher::NodeInstanceServerDispatcher(const QStringList &serverNames,
+ NodeInstanceClientInterface *nodeInstanceClient)
+{
+ for (const QString &serverName : serverNames)
+ addServer(serverName, nodeInstanceClient);
+}
+
+void NodeInstanceServerDispatcher::createInstances(const CreateInstancesCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->createInstances(command);
+}
+
+void NodeInstanceServerDispatcher::changeFileUrl(const ChangeFileUrlCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changeFileUrl(command);
+}
+
+void NodeInstanceServerDispatcher::createScene(const CreateSceneCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->createScene(command);
+}
+
+void NodeInstanceServerDispatcher::clearScene(const ClearSceneCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->clearScene(command);
+}
+
+void NodeInstanceServerDispatcher::update3DViewState(const Update3dViewStateCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->update3DViewState(command);
+}
+
+void NodeInstanceServerDispatcher::removeInstances(const RemoveInstancesCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->removeInstances(command);
+}
+
+void NodeInstanceServerDispatcher::removeProperties(const RemovePropertiesCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->removeProperties(command);
+}
+
+void NodeInstanceServerDispatcher::changePropertyBindings(const ChangeBindingsCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changePropertyBindings(command);
+}
+
+void NodeInstanceServerDispatcher::changePropertyValues(const ChangeValuesCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changePropertyValues(command);
+}
+
+void NodeInstanceServerDispatcher::changeAuxiliaryValues(const ChangeAuxiliaryCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changeAuxiliaryValues(command);
+}
+
+void NodeInstanceServerDispatcher::reparentInstances(const ReparentInstancesCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->reparentInstances(command);
+}
+
+void NodeInstanceServerDispatcher::changeIds(const ChangeIdsCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changeIds(command);
+}
+
+void NodeInstanceServerDispatcher::changeState(const ChangeStateCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changeState(command);
+}
+
+void NodeInstanceServerDispatcher::completeComponent(const CompleteComponentCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->completeComponent(command);
+}
+
+void NodeInstanceServerDispatcher::changeNodeSource(const ChangeNodeSourceCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changeNodeSource(command);
+}
+
+void NodeInstanceServerDispatcher::token(const TokenCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->token(command);
+}
+
+void NodeInstanceServerDispatcher::removeSharedMemory(const RemoveSharedMemoryCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->removeSharedMemory(command);
+}
+
+void NodeInstanceServerDispatcher::changeSelection(const ChangeSelectionCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changeSelection(command);
+}
+
+void NodeInstanceServerDispatcher::inputEvent(const InputEventCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->inputEvent(command);
+}
+
+void NodeInstanceServerDispatcher::view3DAction(const View3DActionCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->view3DAction(command);
+}
+
+void NodeInstanceServerDispatcher::changeLanguage(const ChangeLanguageCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changeLanguage(command);
+}
+
+void NodeInstanceServerDispatcher::changePreviewImageSize(const ChangePreviewImageSizeCommand &command)
+{
+ for (std::unique_ptr<NodeInstanceServer> &server : m_servers)
+ server->changePreviewImageSize(command);
+}
+
+namespace {
+
+std::unique_ptr<NodeInstanceServer> createNodeInstanceServer(
+ const QString &serverName, NodeInstanceClientInterface *nodeInstanceClient)
+{
+ if (serverName == "capturemode")
+ return std::make_unique<Qt5CapturePreviewNodeInstanceServer>(nodeInstanceClient);
+ else if (serverName == "rendermode")
+ return std::make_unique<Qt5RenderNodeInstanceServer>(nodeInstanceClient);
+ else if (serverName == "editormode")
+ return std::make_unique<Qt5InformationNodeInstanceServer>(nodeInstanceClient);
+ else if (serverName == "previewmode")
+ return std::make_unique<Qt5PreviewNodeInstanceServer>(nodeInstanceClient);
+
+ return {};
+}
+
+} // namespace
+
+void NodeInstanceServerDispatcher::addServer(const QString &serverName,
+ NodeInstanceClientInterface *nodeInstanceClient)
+{
+ auto server = createNodeInstanceServer(serverName, nodeInstanceClient);
+
+ server->disableTimer();
+
+ m_servers.push_back(std::move(server));
+}
+
+} // namespace QmlDesigner
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserverdispatcher.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserverdispatcher.h
new file mode 100644
index 0000000000..c09c629573
--- /dev/null
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserverdispatcher.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#pragma once
+
+#include <nodeinstanceserver.h>
+
+#include <memory>
+#include <vector>
+
+namespace QmlDesigner {
+
+class NodeInstanceServerDispatcher : public NodeInstanceServerInterface
+{
+public:
+ NodeInstanceServerDispatcher(const QStringList &serverNames,
+ NodeInstanceClientInterface *nodeInstanceClient);
+
+ void createInstances(const CreateInstancesCommand &command);
+ void changeFileUrl(const ChangeFileUrlCommand &command);
+ void createScene(const CreateSceneCommand &command);
+ void clearScene(const ClearSceneCommand &command);
+ void update3DViewState(const Update3dViewStateCommand &command);
+ void removeInstances(const RemoveInstancesCommand &command);
+ void removeProperties(const RemovePropertiesCommand &command);
+ void changePropertyBindings(const ChangeBindingsCommand &command);
+ void changePropertyValues(const ChangeValuesCommand &command);
+ void changeAuxiliaryValues(const ChangeAuxiliaryCommand &command);
+ void reparentInstances(const ReparentInstancesCommand &command);
+ void changeIds(const ChangeIdsCommand &command);
+ void changeState(const ChangeStateCommand &command);
+ void completeComponent(const CompleteComponentCommand &command);
+ void changeNodeSource(const ChangeNodeSourceCommand &command);
+ void token(const TokenCommand &command);
+ void removeSharedMemory(const RemoveSharedMemoryCommand &command);
+ void changeSelection(const ChangeSelectionCommand &command);
+ void inputEvent(const InputEventCommand &command);
+ void view3DAction(const View3DActionCommand &command);
+ void changeLanguage(const ChangeLanguageCommand &command);
+ void changePreviewImageSize(const ChangePreviewImageSizeCommand &command);
+
+private:
+ void addServer(const QString &serverName, NodeInstanceClientInterface *nodeInstanceClient);
+
+protected:
+ std::vector<std::unique_ptr<NodeInstanceServer>> m_servers;
+};
+
+} // namespace QmlDesigner
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturenodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturepreviewnodeinstanceserver.cpp
index f1e2a3a475..46461581f8 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturenodeinstanceserver.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturepreviewnodeinstanceserver.cpp
@@ -23,7 +23,7 @@
**
****************************************************************************/
-#include "qt5capturenodeinstanceserver.h"
+#include "qt5capturepreviewnodeinstanceserver.h"
#include "servernodeinstance.h"
#include <captureddatacommand.h>
@@ -75,7 +75,7 @@ CapturedDataCommand::StateData collectStateData(ServerNodeInstance rootNodeInsta
}
} // namespace
-void Qt5CaptureNodeInstanceServer::collectItemChangesAndSendChangeCommands()
+void Qt5CapturePreviewNodeInstanceServer::collectItemChangesAndSendChangeCommands()
{
static bool inFunction = false;
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturenodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturepreviewnodeinstanceserver.h
index cd0208e563..8118728973 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturenodeinstanceserver.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5capturepreviewnodeinstanceserver.h
@@ -29,10 +29,10 @@
namespace QmlDesigner {
-class Qt5CaptureNodeInstanceServer : public Qt5PreviewNodeInstanceServer
+class Qt5CapturePreviewNodeInstanceServer : public Qt5PreviewNodeInstanceServer
{
public:
- explicit Qt5CaptureNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient)
+ explicit Qt5CapturePreviewNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient)
: Qt5PreviewNodeInstanceServer(nodeInstanceClient)
{}
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp
index 1cdfc91074..defbf5614a 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp
@@ -27,7 +27,8 @@
#include <QCoreApplication>
-#include "qt5capturenodeinstanceserver.h"
+#include "capturenodeinstanceserverdispatcher.h"
+#include "qt5capturepreviewnodeinstanceserver.h"
#include "qt5informationnodeinstanceserver.h"
#include "qt5previewnodeinstanceserver.h"
#include "qt5rendernodeinstanceserver.h"
@@ -62,6 +63,10 @@ Qt5NodeInstanceClientProxy::Qt5NodeInstanceClientProxy(QObject *parent) :
initializeCapturedStream(QCoreApplication::arguments().at(2));
readDataStream();
QCoreApplication::exit();
+ } else if (QCoreApplication::arguments().at(2).contains(',')) {
+ const QStringList serverNames = QCoreApplication::arguments().at(2).split(',');
+ setNodeInstanceServer(std::make_unique<CaptureNodeInstanceServerDispatcher>(serverNames, this));
+ initializeSocket();
} else if (QCoreApplication::arguments().at(2) == QLatin1String("previewmode")) {
setNodeInstanceServer(std::make_unique<Qt5PreviewNodeInstanceServer>(this));
initializeSocket();
@@ -72,7 +77,7 @@ Qt5NodeInstanceClientProxy::Qt5NodeInstanceClientProxy(QObject *parent) :
setNodeInstanceServer(std::make_unique<Qt5RenderNodeInstanceServer>(this));
initializeSocket();
} else if (QCoreApplication::arguments().at(2) == QLatin1String("capturemode")) {
- setNodeInstanceServer(std::make_unique<Qt5CaptureNodeInstanceServer>(this));
+ setNodeInstanceServer(std::make_unique<Qt5CapturePreviewNodeInstanceServer>(this));
initializeSocket();
}
}
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h
index ea27429c66..975d0e8c37 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h
@@ -72,7 +72,7 @@ class ServerNodeInstance
friend class Qt5InformationNodeInstanceServer;
friend class Qt5NodeInstanceServer;
friend class Qt5PreviewNodeInstanceServer;
- friend class Qt5CaptureNodeInstanceServer;
+ friend class Qt5CapturePreviewNodeInstanceServer;
friend class Qt5TestNodeInstanceServer;
friend class QHash<qint32, ServerNodeInstance>;
friend uint qHash(const ServerNodeInstance &instance);
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index 1ba8fcd2be..247c564dd4 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -50,11 +50,12 @@
#include <utils/algorithm.h>
#include <utils/qtcassert.h>
+#include <memory>
#include <QDebug>
#include <QPair>
+#include <QPicture>
#include <QString>
#include <QTimer>
-#include <memory>
namespace QmlDesigner {
@@ -770,6 +771,11 @@ void FormEditorView::exportAsImage()
m_formEditorWidget->exportAsImage(m_scene->rootFormEditorItem()->boundingRect());
}
+QPicture FormEditorView::renderToPicture() const
+{
+ return m_formEditorWidget->renderToPicture();
+}
+
QmlItemNode findRecursiveQmlItemNode(const QmlObjectNode &firstQmlObjectNode)
{
QmlObjectNode qmlObjectNode = firstQmlObjectNode;
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
index 64c1f2a435..8aa156fa45 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
@@ -128,6 +128,7 @@ public:
void setGotoErrorCallback(std::function<void(int, int)> gotoErrorCallback);
void exportAsImage();
+ QPicture renderToPicture() const;
protected:
void reset();
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
index c09516cbf8..c8c54f6a53 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp
@@ -53,6 +53,7 @@
#include <QActionGroup>
#include <QFileDialog>
#include <QPainter>
+#include <QPicture>
#include <QVBoxLayout>
#include <QWheelEvent>
@@ -487,6 +488,19 @@ void FormEditorWidget::exportAsImage(const QRectF &boundingRect)
}
}
+QPicture FormEditorWidget::renderToPicture() const
+{
+ QPicture picture;
+ QPainter painter{&picture};
+
+ const QTransform viewportTransform = m_graphicsView->viewportTransform();
+ const QRectF boundingRect = rootItemRect();
+
+ m_graphicsView->render(&painter, boundingRect, viewportTransform.mapRect(boundingRect.toRect()));
+
+ return picture;
+}
+
FormEditorGraphicsView *FormEditorWidget::graphicsView() const
{
return m_graphicsView;
@@ -504,7 +518,4 @@ DocumentWarningWidget *FormEditorWidget::errorWidget()
return m_documentErrorWidget;
}
-
-}
-
-
+} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h
index b32c95916a..1f6b559a38 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h
@@ -83,6 +83,7 @@ public:
void showWarningMessageBox(const QList<DocumentMessage> &warnings);
void exportAsImage(const QRectF &boundingRect);
+ QPicture renderToPicture() const;
FormEditorGraphicsView *graphicsView() const;
diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
index 7ab1fc9808..eaf4fc08e2 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
@@ -99,6 +99,7 @@ public:
void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource) override;
void capturedData(const CapturedDataCommand &capturedData) override;
void currentStateChanged(const ModelNode &node) override;
+ void sceneCreated(const SceneCreatedCommand &command) override;
QList<NodeInstance> instances() const;
NodeInstance instanceForModelNode(const ModelNode &node) const ;
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
index ece4fa35b9..dc379bd312 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
@@ -64,6 +64,7 @@
#include "removepropertiescommand.h"
#include "removesharedmemorycommand.h"
#include "reparentinstancescommand.h"
+#include "scenecreatedcommand.h"
#include "statepreviewimagechangedcommand.h"
#include "tokencommand.h"
#include "update3dviewstatecommand.h"
@@ -585,10 +586,10 @@ void NodeInstanceView::currentStateChanged(const ModelNode &node)
nodeInstanceView()->activateBaseState();
}
+void NodeInstanceView::sceneCreated(const SceneCreatedCommand &) {}
//\}
-
void NodeInstanceView::removeAllInstanceNodeRelationships()
{
m_nodeInstanceHash.clear();
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs
index 40a26e7392..17c6b4282a 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.qbs
+++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs
@@ -135,6 +135,7 @@ Project {
"commands/changevaluescommand.cpp",
"commands/changevaluescommand.h",
"commands/captureddatacommand.h",
+ "commands/scenecreatedcommand.h",
"commands/childrenchangedcommand.cpp",
"commands/childrenchangedcommand.h",
"commands/clearscenecommand.cpp",
diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt
index 2b80c8ca29..f3f6a66303 100644
--- a/src/tools/qml2puppet/CMakeLists.txt
+++ b/src/tools/qml2puppet/CMakeLists.txt
@@ -53,6 +53,7 @@ extend_qtc_executable(qml2puppet
view3dactioncommand.cpp view3dactioncommand.h
valueschangedcommand.cpp
captureddatacommand.h
+ scenecreatedcommand.h
)
extend_qtc_executable(qml2puppet
@@ -156,7 +157,9 @@ extend_qtc_executable(qml2puppet
quick3dtexturenodeinstance.cpp quick3dtexturenodeinstance.h
quickitemnodeinstance.cpp quickitemnodeinstance.h
servernodeinstance.cpp servernodeinstance.h
- qt5capturenodeinstanceserver.cpp qt5capturenodeinstanceserver.h
+ qt5capturepreviewnodeinstanceserver.cpp qt5capturepreviewnodeinstanceserver.h
+ nodeinstanceserverdispatcher.cpp nodeinstanceserverdispatcher.h
+ capturenodeinstanceserverdispatcher.cpp capturenodeinstanceserverdispatcher.h
)
extend_qtc_executable(qml2puppet
diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs
index 3aab61eb9c..4d135b0cde 100644
--- a/src/tools/qml2puppet/qml2puppet.qbs
+++ b/src/tools/qml2puppet/qml2puppet.qbs
@@ -117,6 +117,7 @@ QtcTool {
"commands/view3dactioncommand.cpp",
"commands/view3dactioncommand.h",
"commands/captureddatacommand.h",
+ "commands/scenecreatedcommand.h",
"container/addimportcontainer.cpp",
"container/addimportcontainer.h",
"container/idcontainer.cpp",
@@ -219,8 +220,12 @@ QtcTool {
"instances/qt5testnodeinstanceserver.h",
"instances/servernodeinstance.cpp",
"instances/servernodeinstance.h",
- "instances/qt5capturenodeinstanceserver.cpp",
- "instances/qt5capturenodeinstanceserver.h",
+ "instances/qt5capturepreviewnodeinstanceserver.cpp",
+ "instances/qt5capturepreviewnodeinstanceserver.h",
+ "instances/nodeinstanceserverdispatcher.cpp",
+ "instances/nodeinstanceserverdispatcher.h",
+ "instances/capturenodeinstanceserverdispatcher.cpp",
+ "instances/capturenodeinstanceserverdispatcher.h",
"editor3d/generalhelper.cpp",
"editor3d/mousearea3d.cpp",
"editor3d/camerageometry.cpp",