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>
This commit is contained in:
Marco Bubke
2020-09-03 13:48:13 +02:00
committed by Thomas Hartmann
parent a535196c41
commit 0f9010d381
26 changed files with 520 additions and 33 deletions

View File

@@ -6,6 +6,7 @@ HEADERS += $$PWD/synchronizecommand.h \ \
$$PWD/changelanguagecommand.h \ $$PWD/changelanguagecommand.h \
$$PWD//debugoutputcommand.h \ $$PWD//debugoutputcommand.h \
$$PWD/endpuppetcommand.h \ $$PWD/endpuppetcommand.h \
$$PWD/scenecreatedcommand.h \
$$PWD/tokencommand.h \ $$PWD/tokencommand.h \
$$PWD/componentcompletedcommand.h \ $$PWD/componentcompletedcommand.h \
$$PWD/completecomponentcommand.h \ $$PWD/completecomponentcommand.h \

View File

@@ -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)

View File

@@ -68,6 +68,7 @@
#include "removepropertiescommand.h" #include "removepropertiescommand.h"
#include "removesharedmemorycommand.h" #include "removesharedmemorycommand.h"
#include "reparentinstancescommand.h" #include "reparentinstancescommand.h"
#include "scenecreatedcommand.h"
#include "statepreviewimagechangedcommand.h" #include "statepreviewimagechangedcommand.h"
#include "synchronizecommand.h" #include "synchronizecommand.h"
#include "tokencommand.h" #include "tokencommand.h"
@@ -275,6 +276,11 @@ void NodeInstanceClientProxy::capturedData(const CapturedDataCommand &command)
writeCommand(QVariant::fromValue(command)); writeCommand(QVariant::fromValue(command));
} }
void NodeInstanceClientProxy::sceneCreated(const SceneCreatedCommand &command)
{
writeCommand(QVariant::fromValue(command));
}
void NodeInstanceClientProxy::flush() void NodeInstanceClientProxy::flush()
{ {
} }

View File

@@ -87,6 +87,7 @@ public:
void selectionChanged(const ChangeSelectionCommand &command) override; void selectionChanged(const ChangeSelectionCommand &command) override;
void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) override; void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) override;
void capturedData(const CapturedDataCommand &capturedData) override; void capturedData(const CapturedDataCommand &capturedData) override;
void sceneCreated(const SceneCreatedCommand &command) override;
void flush() override; void flush() override;
void synchronizeWithClientProcess() override; void synchronizeWithClientProcess() override;

View File

@@ -43,6 +43,7 @@ class PuppetAliveCommand;
class ChangeSelectionCommand; class ChangeSelectionCommand;
class PuppetToCreatorCommand; class PuppetToCreatorCommand;
class CapturedDataCommand; class CapturedDataCommand;
class SceneCreatedCommand;
class NodeInstanceClientInterface class NodeInstanceClientInterface
{ {
@@ -59,6 +60,7 @@ public:
virtual void selectionChanged(const ChangeSelectionCommand &command) = 0; virtual void selectionChanged(const ChangeSelectionCommand &command) = 0;
virtual void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) = 0; virtual void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) = 0;
virtual void capturedData(const CapturedDataCommand &command) = 0; virtual void capturedData(const CapturedDataCommand &command) = 0;
virtual void sceneCreated(const SceneCreatedCommand &command) = 0;
virtual void flush() {} virtual void flush() {}
virtual void synchronizeWithClientProcess() {} virtual void synchronizeWithClientProcess() {}

View File

@@ -60,6 +60,7 @@
#include "removepropertiescommand.h" #include "removepropertiescommand.h"
#include "removesharedmemorycommand.h" #include "removesharedmemorycommand.h"
#include "reparentinstancescommand.h" #include "reparentinstancescommand.h"
#include "scenecreatedcommand.h"
#include "statepreviewimagechangedcommand.h" #include "statepreviewimagechangedcommand.h"
#include "synchronizecommand.h" #include "synchronizecommand.h"
#include "tokencommand.h" #include "tokencommand.h"
@@ -223,6 +224,9 @@ void NodeInstanceServerInterface::registerCommands()
qRegisterMetaType<CapturedDataCommand>("CapturedDataCommand"); qRegisterMetaType<CapturedDataCommand>("CapturedDataCommand");
qRegisterMetaTypeStreamOperators<CapturedDataCommand>("CapturedDataCommand"); qRegisterMetaTypeStreamOperators<CapturedDataCommand>("CapturedDataCommand");
qRegisterMetaType<SceneCreatedCommand>("SceneCreatedCommand");
qRegisterMetaTypeStreamOperators<SceneCreatedCommand>("SceneCreatedCommand");
} }
} }

View File

@@ -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

View File

@@ -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

View File

@@ -6,7 +6,10 @@ versionAtLeast(QT_VERSION, 5.15.0):qtHaveModule(quick3d) {
} }
HEADERS += $$PWD/qt5nodeinstanceserver.h \ HEADERS += $$PWD/qt5nodeinstanceserver.h \
$$PWD/qt5capturenodeinstanceserver.h \ $$PWD/capturenodeinstanceserverdispatcher.h \
$$PWD/capturescenecreatedcommand.h \
$$PWD/nodeinstanceserverdispatcher.h \
$$PWD/qt5capturepreviewnodeinstanceserver.h \
$$PWD/qt5testnodeinstanceserver.h \ $$PWD/qt5testnodeinstanceserver.h \
$$PWD/qt5informationnodeinstanceserver.h \ $$PWD/qt5informationnodeinstanceserver.h \
$$PWD/qt5rendernodeinstanceserver.h \ $$PWD/qt5rendernodeinstanceserver.h \
@@ -33,7 +36,9 @@ HEADERS += $$PWD/qt5nodeinstanceserver.h \
$$PWD/quick3dtexturenodeinstance.h $$PWD/quick3dtexturenodeinstance.h
SOURCES += $$PWD/qt5nodeinstanceserver.cpp \ SOURCES += $$PWD/qt5nodeinstanceserver.cpp \
$$PWD/qt5capturenodeinstanceserver.cpp \ $$PWD/capturenodeinstanceserverdispatcher.cpp \
$$PWD/nodeinstanceserverdispatcher.cpp \
$$PWD/qt5capturepreviewnodeinstanceserver.cpp \
$$PWD/qt5testnodeinstanceserver.cpp \ $$PWD/qt5testnodeinstanceserver.cpp \
$$PWD/qt5informationnodeinstanceserver.cpp \ $$PWD/qt5informationnodeinstanceserver.cpp \
$$PWD/qt5rendernodeinstanceserver.cpp \ $$PWD/qt5rendernodeinstanceserver.cpp \

View File

@@ -261,7 +261,7 @@ void NodeInstanceServer::setRenderTimerInterval(int timerInterval)
void NodeInstanceServer::setSlowRenderTimerInterval(int timerInterval) void NodeInstanceServer::setSlowRenderTimerInterval(int timerInterval)
{ {
m_slowRenderTimerInterval = timerInterval; m_timerModeInterval = timerInterval;
} }
void NodeInstanceServer::setTimerId(int timerId) void NodeInstanceServer::setTimerId(int timerId)
@@ -281,29 +281,31 @@ int NodeInstanceServer::renderTimerInterval() const
void NodeInstanceServer::startRenderTimer() void NodeInstanceServer::startRenderTimer()
{ {
if (m_slowRenderTimer) if (m_timerMode == TimerMode::SlowTimer)
stopRenderTimer(); stopRenderTimer();
if (m_timerMode == TimerMode::DisableTimer)
return;
if (m_timer == 0) if (m_timer == 0)
m_timer = startTimer(m_renderTimerInterval); m_timer = startTimer(m_renderTimerInterval);
m_slowRenderTimer = false; m_timerMode = TimerMode::NormalTimer;
} }
void NodeInstanceServer::slowDownRenderTimer() void NodeInstanceServer::slowDownRenderTimer()
{ {
if (!m_slowRenderTimer)
stopRenderTimer();
if (m_timer != 0) { if (m_timer != 0) {
killTimer(m_timer); killTimer(m_timer);
m_timer = 0; m_timer = 0;
} }
if (m_timer == 0) if (m_timerMode == TimerMode::DisableTimer)
m_timer = startTimer(m_slowRenderTimerInterval); return;
m_slowRenderTimer = true; m_timer = startTimer(m_timerModeInterval);
m_timerMode = TimerMode::SlowTimer;
} }
void NodeInstanceServer::stopRenderTimer() void NodeInstanceServer::stopRenderTimer()
@@ -1449,4 +1451,9 @@ void NodeInstanceServer::handleExtraRender()
} }
} }
void NodeInstanceServer::disableTimer()
{
m_timerMode = TimerMode::DisableTimer;
}
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -114,6 +114,8 @@ namespace Internal {
class ChildrenChangeEventFilter; class ChildrenChangeEventFilter;
} }
enum class TimerMode { DisableTimer, NormalTimer, SlowTimer };
class NodeInstanceServer : public NodeInstanceServerInterface class NodeInstanceServer : public NodeInstanceServerInterface
{ {
Q_OBJECT Q_OBJECT
@@ -128,7 +130,6 @@ public:
QVariant propertyValue; QVariant propertyValue;
}; };
explicit NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient); explicit NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient);
void createInstances(const CreateInstancesCommand &command) override; void createInstances(const CreateInstancesCommand &command) override;
@@ -171,7 +172,9 @@ public:
QFileSystemWatcher *dummydataFileSystemWatcher(); QFileSystemWatcher *dummydataFileSystemWatcher();
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter() const; Internal::ChildrenChangeEventFilter *childrenChangeEventFilter() const;
void addFilePropertyToFileSystemWatcher(QObject *object, const PropertyName &propertyName, const QString &path); 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; QUrl fileUrl() const;
@@ -190,7 +193,9 @@ public:
virtual QQuickView *quickView() const = 0; virtual QQuickView *quickView() const = 0;
void sendDebugOutput(DebugOutputCommand::Type type, const QString &message, qint32 instanceId = 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); void removeInstanceRelationsipForDeletedObject(QObject *object);
@@ -198,6 +203,10 @@ public:
void decrementNeedsExtraRender(); void decrementNeedsExtraRender();
void handleExtraRender(); void handleExtraRender();
void disableTimer();
virtual void collectItemChangesAndSendChangeCommands() = 0;
public slots: public slots:
void refreshLocalFileProperty(const QString &path); void refreshLocalFileProperty(const QString &path);
void refreshDummyData(const QString &path); void refreshDummyData(const QString &path);
@@ -221,7 +230,6 @@ protected:
void timerEvent(QTimerEvent *) override; void timerEvent(QTimerEvent *) override;
virtual void collectItemChangesAndSendChangeCommands() = 0;
ValuesChangedCommand createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const; ValuesChangedCommand createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const;
ValuesChangedCommand createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const; ValuesChangedCommand createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const;
@@ -290,8 +298,8 @@ private:
NodeInstanceClientInterface *m_nodeInstanceClient; NodeInstanceClientInterface *m_nodeInstanceClient;
int m_timer = 0; int m_timer = 0;
int m_renderTimerInterval = 16; int m_renderTimerInterval = 16;
bool m_slowRenderTimer = false; TimerMode m_timerMode = TimerMode::NormalTimer;
int m_slowRenderTimerInterval = 200; int m_timerModeInterval = 200;
QVector<InstancePropertyPair> m_changedPropertyList; QVector<InstancePropertyPair> m_changedPropertyList;
QByteArray m_importCode; QByteArray m_importCode;
QPointer<QObject> m_dummyContextObject; QPointer<QObject> m_dummyContextObject;

View File

@@ -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

View File

@@ -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

View File

@@ -23,7 +23,7 @@
** **
****************************************************************************/ ****************************************************************************/
#include "qt5capturenodeinstanceserver.h" #include "qt5capturepreviewnodeinstanceserver.h"
#include "servernodeinstance.h" #include "servernodeinstance.h"
#include <captureddatacommand.h> #include <captureddatacommand.h>
@@ -75,7 +75,7 @@ CapturedDataCommand::StateData collectStateData(ServerNodeInstance rootNodeInsta
} }
} // namespace } // namespace
void Qt5CaptureNodeInstanceServer::collectItemChangesAndSendChangeCommands() void Qt5CapturePreviewNodeInstanceServer::collectItemChangesAndSendChangeCommands()
{ {
static bool inFunction = false; static bool inFunction = false;

View File

@@ -29,10 +29,10 @@
namespace QmlDesigner { namespace QmlDesigner {
class Qt5CaptureNodeInstanceServer : public Qt5PreviewNodeInstanceServer class Qt5CapturePreviewNodeInstanceServer : public Qt5PreviewNodeInstanceServer
{ {
public: public:
explicit Qt5CaptureNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) explicit Qt5CapturePreviewNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient)
: Qt5PreviewNodeInstanceServer(nodeInstanceClient) : Qt5PreviewNodeInstanceServer(nodeInstanceClient)
{} {}

View File

@@ -27,7 +27,8 @@
#include <QCoreApplication> #include <QCoreApplication>
#include "qt5capturenodeinstanceserver.h" #include "capturenodeinstanceserverdispatcher.h"
#include "qt5capturepreviewnodeinstanceserver.h"
#include "qt5informationnodeinstanceserver.h" #include "qt5informationnodeinstanceserver.h"
#include "qt5previewnodeinstanceserver.h" #include "qt5previewnodeinstanceserver.h"
#include "qt5rendernodeinstanceserver.h" #include "qt5rendernodeinstanceserver.h"
@@ -62,6 +63,10 @@ Qt5NodeInstanceClientProxy::Qt5NodeInstanceClientProxy(QObject *parent) :
initializeCapturedStream(QCoreApplication::arguments().at(2)); initializeCapturedStream(QCoreApplication::arguments().at(2));
readDataStream(); readDataStream();
QCoreApplication::exit(); 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")) { } else if (QCoreApplication::arguments().at(2) == QLatin1String("previewmode")) {
setNodeInstanceServer(std::make_unique<Qt5PreviewNodeInstanceServer>(this)); setNodeInstanceServer(std::make_unique<Qt5PreviewNodeInstanceServer>(this));
initializeSocket(); initializeSocket();
@@ -72,7 +77,7 @@ Qt5NodeInstanceClientProxy::Qt5NodeInstanceClientProxy(QObject *parent) :
setNodeInstanceServer(std::make_unique<Qt5RenderNodeInstanceServer>(this)); setNodeInstanceServer(std::make_unique<Qt5RenderNodeInstanceServer>(this));
initializeSocket(); initializeSocket();
} else if (QCoreApplication::arguments().at(2) == QLatin1String("capturemode")) { } else if (QCoreApplication::arguments().at(2) == QLatin1String("capturemode")) {
setNodeInstanceServer(std::make_unique<Qt5CaptureNodeInstanceServer>(this)); setNodeInstanceServer(std::make_unique<Qt5CapturePreviewNodeInstanceServer>(this));
initializeSocket(); initializeSocket();
} }
} }

View File

@@ -72,7 +72,7 @@ class ServerNodeInstance
friend class Qt5InformationNodeInstanceServer; friend class Qt5InformationNodeInstanceServer;
friend class Qt5NodeInstanceServer; friend class Qt5NodeInstanceServer;
friend class Qt5PreviewNodeInstanceServer; friend class Qt5PreviewNodeInstanceServer;
friend class Qt5CaptureNodeInstanceServer; friend class Qt5CapturePreviewNodeInstanceServer;
friend class Qt5TestNodeInstanceServer; friend class Qt5TestNodeInstanceServer;
friend class QHash<qint32, ServerNodeInstance>; friend class QHash<qint32, ServerNodeInstance>;
friend uint qHash(const ServerNodeInstance &instance); friend uint qHash(const ServerNodeInstance &instance);

View File

@@ -50,11 +50,12 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <memory>
#include <QDebug> #include <QDebug>
#include <QPair> #include <QPair>
#include <QPicture>
#include <QString> #include <QString>
#include <QTimer> #include <QTimer>
#include <memory>
namespace QmlDesigner { namespace QmlDesigner {
@@ -770,6 +771,11 @@ void FormEditorView::exportAsImage()
m_formEditorWidget->exportAsImage(m_scene->rootFormEditorItem()->boundingRect()); m_formEditorWidget->exportAsImage(m_scene->rootFormEditorItem()->boundingRect());
} }
QPicture FormEditorView::renderToPicture() const
{
return m_formEditorWidget->renderToPicture();
}
QmlItemNode findRecursiveQmlItemNode(const QmlObjectNode &firstQmlObjectNode) QmlItemNode findRecursiveQmlItemNode(const QmlObjectNode &firstQmlObjectNode)
{ {
QmlObjectNode qmlObjectNode = firstQmlObjectNode; QmlObjectNode qmlObjectNode = firstQmlObjectNode;

View File

@@ -128,6 +128,7 @@ public:
void setGotoErrorCallback(std::function<void(int, int)> gotoErrorCallback); void setGotoErrorCallback(std::function<void(int, int)> gotoErrorCallback);
void exportAsImage(); void exportAsImage();
QPicture renderToPicture() const;
protected: protected:
void reset(); void reset();

View File

@@ -53,6 +53,7 @@
#include <QActionGroup> #include <QActionGroup>
#include <QFileDialog> #include <QFileDialog>
#include <QPainter> #include <QPainter>
#include <QPicture>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWheelEvent> #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 FormEditorGraphicsView *FormEditorWidget::graphicsView() const
{ {
return m_graphicsView; return m_graphicsView;
@@ -504,7 +518,4 @@ DocumentWarningWidget *FormEditorWidget::errorWidget()
return m_documentErrorWidget; return m_documentErrorWidget;
} }
} // namespace QmlDesigner
}

View File

@@ -83,6 +83,7 @@ public:
void showWarningMessageBox(const QList<DocumentMessage> &warnings); void showWarningMessageBox(const QList<DocumentMessage> &warnings);
void exportAsImage(const QRectF &boundingRect); void exportAsImage(const QRectF &boundingRect);
QPicture renderToPicture() const;
FormEditorGraphicsView *graphicsView() const; FormEditorGraphicsView *graphicsView() const;

View File

@@ -99,6 +99,7 @@ public:
void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource) override; void nodeSourceChanged(const ModelNode &modelNode, const QString &newNodeSource) override;
void capturedData(const CapturedDataCommand &capturedData) override; void capturedData(const CapturedDataCommand &capturedData) override;
void currentStateChanged(const ModelNode &node) override; void currentStateChanged(const ModelNode &node) override;
void sceneCreated(const SceneCreatedCommand &command) override;
QList<NodeInstance> instances() const; QList<NodeInstance> instances() const;
NodeInstance instanceForModelNode(const ModelNode &node) const ; NodeInstance instanceForModelNode(const ModelNode &node) const ;

View File

@@ -64,6 +64,7 @@
#include "removepropertiescommand.h" #include "removepropertiescommand.h"
#include "removesharedmemorycommand.h" #include "removesharedmemorycommand.h"
#include "reparentinstancescommand.h" #include "reparentinstancescommand.h"
#include "scenecreatedcommand.h"
#include "statepreviewimagechangedcommand.h" #include "statepreviewimagechangedcommand.h"
#include "tokencommand.h" #include "tokencommand.h"
#include "update3dviewstatecommand.h" #include "update3dviewstatecommand.h"
@@ -585,10 +586,10 @@ void NodeInstanceView::currentStateChanged(const ModelNode &node)
nodeInstanceView()->activateBaseState(); nodeInstanceView()->activateBaseState();
} }
void NodeInstanceView::sceneCreated(const SceneCreatedCommand &) {}
//\} //\}
void NodeInstanceView::removeAllInstanceNodeRelationships() void NodeInstanceView::removeAllInstanceNodeRelationships()
{ {
m_nodeInstanceHash.clear(); m_nodeInstanceHash.clear();

View File

@@ -135,6 +135,7 @@ Project {
"commands/changevaluescommand.cpp", "commands/changevaluescommand.cpp",
"commands/changevaluescommand.h", "commands/changevaluescommand.h",
"commands/captureddatacommand.h", "commands/captureddatacommand.h",
"commands/scenecreatedcommand.h",
"commands/childrenchangedcommand.cpp", "commands/childrenchangedcommand.cpp",
"commands/childrenchangedcommand.h", "commands/childrenchangedcommand.h",
"commands/clearscenecommand.cpp", "commands/clearscenecommand.cpp",

View File

@@ -53,6 +53,7 @@ extend_qtc_executable(qml2puppet
view3dactioncommand.cpp view3dactioncommand.h view3dactioncommand.cpp view3dactioncommand.h
valueschangedcommand.cpp valueschangedcommand.cpp
captureddatacommand.h captureddatacommand.h
scenecreatedcommand.h
) )
extend_qtc_executable(qml2puppet extend_qtc_executable(qml2puppet
@@ -156,7 +157,9 @@ extend_qtc_executable(qml2puppet
quick3dtexturenodeinstance.cpp quick3dtexturenodeinstance.h quick3dtexturenodeinstance.cpp quick3dtexturenodeinstance.h
quickitemnodeinstance.cpp quickitemnodeinstance.h quickitemnodeinstance.cpp quickitemnodeinstance.h
servernodeinstance.cpp servernodeinstance.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 extend_qtc_executable(qml2puppet

View File

@@ -117,6 +117,7 @@ QtcTool {
"commands/view3dactioncommand.cpp", "commands/view3dactioncommand.cpp",
"commands/view3dactioncommand.h", "commands/view3dactioncommand.h",
"commands/captureddatacommand.h", "commands/captureddatacommand.h",
"commands/scenecreatedcommand.h",
"container/addimportcontainer.cpp", "container/addimportcontainer.cpp",
"container/addimportcontainer.h", "container/addimportcontainer.h",
"container/idcontainer.cpp", "container/idcontainer.cpp",
@@ -219,8 +220,12 @@ QtcTool {
"instances/qt5testnodeinstanceserver.h", "instances/qt5testnodeinstanceserver.h",
"instances/servernodeinstance.cpp", "instances/servernodeinstance.cpp",
"instances/servernodeinstance.h", "instances/servernodeinstance.h",
"instances/qt5capturenodeinstanceserver.cpp", "instances/qt5capturepreviewnodeinstanceserver.cpp",
"instances/qt5capturenodeinstanceserver.h", "instances/qt5capturepreviewnodeinstanceserver.h",
"instances/nodeinstanceserverdispatcher.cpp",
"instances/nodeinstanceserverdispatcher.h",
"instances/capturenodeinstanceserverdispatcher.cpp",
"instances/capturenodeinstanceserverdispatcher.h",
"editor3d/generalhelper.cpp", "editor3d/generalhelper.cpp",
"editor3d/mousearea3d.cpp", "editor3d/mousearea3d.cpp",
"editor3d/camerageometry.cpp", "editor3d/camerageometry.cpp",