2012-11-06 15:35:19 +01:00
|
|
|
/****************************************************************************
|
2012-09-19 15:57:22 +02:00
|
|
|
**
|
2016-01-15 14:59:14 +01:00
|
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2012-09-19 15:57:22 +02:00
|
|
|
**
|
2012-11-06 15:35:19 +01:00
|
|
|
** This file is part of Qt Creator.
|
2012-09-19 15:57:22 +02:00
|
|
|
**
|
2012-11-06 15:35:19 +01:00
|
|
|
** 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
|
2016-01-15 14:59:14 +01:00
|
|
|
** 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.
|
2012-09-19 15:57:22 +02:00
|
|
|
**
|
2015-09-18 11:34:48 +02:00
|
|
|
** GNU General Public License Usage
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
2016-01-15 14:59:14 +01:00
|
|
|
** 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.
|
2012-09-19 15:57:22 +02:00
|
|
|
**
|
2012-11-06 15:35:19 +01:00
|
|
|
****************************************************************************/
|
2012-09-19 15:57:22 +02:00
|
|
|
|
2016-03-18 07:55:01 +01:00
|
|
|
#pragma once
|
2012-09-19 15:57:22 +02:00
|
|
|
|
|
|
|
#include <QUrl>
|
|
|
|
#include <QVector>
|
|
|
|
#include <QSet>
|
|
|
|
#include <QStringList>
|
2012-10-04 17:44:48 +02:00
|
|
|
#include <QPointer>
|
2012-09-19 15:57:22 +02:00
|
|
|
|
|
|
|
#include <nodeinstanceserverinterface.h>
|
|
|
|
#include "servernodeinstance.h"
|
2012-11-21 15:26:27 +01:00
|
|
|
#include "debugoutputcommand.h"
|
2012-09-19 15:57:22 +02:00
|
|
|
|
2019-07-31 12:31:51 +02:00
|
|
|
namespace QtHelpers {
|
|
|
|
template <class T>
|
|
|
|
QList<T>toList(const QSet<T> &set)
|
|
|
|
{
|
|
|
|
#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
|
|
|
|
return set.toList();
|
|
|
|
#else
|
|
|
|
return QList<T>(set.begin(), set.end());
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
} //QtHelpers
|
|
|
|
|
2012-09-19 15:57:22 +02:00
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
class QFileSystemWatcher;
|
|
|
|
class QQmlView;
|
|
|
|
class QQuickView;
|
|
|
|
class QQmlEngine;
|
|
|
|
class QFileInfo;
|
|
|
|
class QQmlComponent;
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
|
|
|
|
namespace QmlDesigner {
|
|
|
|
|
|
|
|
class NodeInstanceClientInterface;
|
|
|
|
class ValuesChangedCommand;
|
2019-10-23 16:29:31 +02:00
|
|
|
class ValuesModifiedCommand;
|
2012-09-19 15:57:22 +02:00
|
|
|
class PixmapChangedCommand;
|
|
|
|
class InformationChangedCommand;
|
|
|
|
class ChildrenChangedCommand;
|
|
|
|
class ReparentContainer;
|
|
|
|
class ComponentCompletedCommand;
|
|
|
|
class AddImportContainer;
|
2016-09-29 15:30:29 +02:00
|
|
|
class MockupTypeContainer;
|
2015-02-18 13:32:35 +01:00
|
|
|
class IdContainer;
|
2019-10-17 13:51:57 +02:00
|
|
|
class ChangeSelectionCommand;
|
2019-11-01 10:51:09 +02:00
|
|
|
class Drop3DLibraryItemCommand;
|
2012-09-19 15:57:22 +02:00
|
|
|
|
|
|
|
namespace Internal {
|
|
|
|
class ChildrenChangeEventFilter;
|
|
|
|
}
|
|
|
|
|
|
|
|
class NodeInstanceServer : public NodeInstanceServerInterface
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
2018-07-31 17:11:50 +02:00
|
|
|
using ObjectPropertyPair = QPair<QPointer<QObject>, PropertyName>;
|
|
|
|
using IdPropertyPair = QPair<qint32, QString>;
|
|
|
|
using InstancePropertyPair= QPair<ServerNodeInstance, PropertyName>;
|
|
|
|
using DummyPair = QPair<QString, QPointer<QObject> >;
|
2019-10-23 16:29:31 +02:00
|
|
|
using InstancePropertyValueTriple = struct {
|
|
|
|
ServerNodeInstance instance;
|
|
|
|
PropertyName propertyName;
|
|
|
|
QVariant propertyValue;
|
|
|
|
};
|
2018-07-31 17:11:50 +02:00
|
|
|
|
2012-09-19 15:57:22 +02:00
|
|
|
|
|
|
|
explicit NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient);
|
|
|
|
|
2018-05-07 14:56:23 +02:00
|
|
|
void createInstances(const CreateInstancesCommand &command) override;
|
|
|
|
void changeFileUrl(const ChangeFileUrlCommand &command) override;
|
|
|
|
void changePropertyValues(const ChangeValuesCommand &command) override;
|
|
|
|
void changePropertyBindings(const ChangeBindingsCommand &command) override;
|
|
|
|
void changeAuxiliaryValues(const ChangeAuxiliaryCommand &command) override;
|
|
|
|
void changeIds(const ChangeIdsCommand &command) override;
|
|
|
|
void createScene(const CreateSceneCommand &command) override;
|
|
|
|
void clearScene(const ClearSceneCommand &command) override;
|
2019-11-13 11:16:55 +01:00
|
|
|
void change3DView(const Change3DViewCommand &command) override;
|
2018-05-07 14:56:23 +02:00
|
|
|
void removeInstances(const RemoveInstancesCommand &command) override;
|
|
|
|
void removeProperties(const RemovePropertiesCommand &command) override;
|
|
|
|
void reparentInstances(const ReparentInstancesCommand &command) override;
|
|
|
|
void changeState(const ChangeStateCommand &command) override;
|
|
|
|
void completeComponent(const CompleteComponentCommand &command) override;
|
|
|
|
void changeNodeSource(const ChangeNodeSourceCommand &command) override;
|
|
|
|
void token(const TokenCommand &command) override;
|
|
|
|
void removeSharedMemory(const RemoveSharedMemoryCommand &command) override;
|
2019-10-17 13:51:57 +02:00
|
|
|
void changeSelection(const ChangeSelectionCommand &command) override;
|
2012-09-19 15:57:22 +02:00
|
|
|
|
|
|
|
ServerNodeInstance instanceForId(qint32 id) const;
|
|
|
|
bool hasInstanceForId(qint32 id) const;
|
|
|
|
|
|
|
|
ServerNodeInstance instanceForObject(QObject *object) const;
|
|
|
|
bool hasInstanceForObject(QObject *object) const;
|
|
|
|
|
|
|
|
virtual QQmlEngine *engine() const = 0;
|
|
|
|
QQmlContext *context() const;
|
|
|
|
|
|
|
|
void removeAllInstanceRelationships();
|
|
|
|
|
|
|
|
QFileSystemWatcher *fileSystemWatcher();
|
|
|
|
QFileSystemWatcher *dummydataFileSystemWatcher();
|
|
|
|
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter() const;
|
2013-03-05 12:19:19 +01:00
|
|
|
void addFilePropertyToFileSystemWatcher(QObject *object, const PropertyName &propertyName, const QString &path);
|
|
|
|
void removeFilePropertyFromFileSystemWatcher(QObject *object, const PropertyName &propertyName, const QString &path);
|
2012-09-19 15:57:22 +02:00
|
|
|
|
|
|
|
QUrl fileUrl() const;
|
|
|
|
|
|
|
|
ServerNodeInstance activeStateInstance() const;
|
|
|
|
void setStateInstance(const ServerNodeInstance &stateInstance);
|
|
|
|
void clearStateInstance();
|
|
|
|
|
|
|
|
ServerNodeInstance rootNodeInstance() const;
|
|
|
|
|
2013-03-05 12:19:19 +01:00
|
|
|
void notifyPropertyChange(qint32 instanceid, const PropertyName &propertyName);
|
2012-09-19 15:57:22 +02:00
|
|
|
|
2014-09-25 12:57:57 +02:00
|
|
|
QByteArray importCode() const;
|
2012-09-19 15:57:22 +02:00
|
|
|
QObject *dummyContextObject() const;
|
|
|
|
|
|
|
|
virtual QQmlView *declarativeView() const = 0;
|
|
|
|
virtual QQuickView *quickView() const = 0;
|
|
|
|
|
2015-02-26 17:30:56 +01:00
|
|
|
void sendDebugOutput(DebugOutputCommand::Type type, const QString &message, qint32 instanceId = 0);
|
2015-02-18 13:32:35 +01:00
|
|
|
void sendDebugOutput(DebugOutputCommand::Type type, const QString &message, const QVector<qint32> &instanceIds);
|
2012-11-21 15:26:27 +01:00
|
|
|
|
2015-02-23 11:28:23 +01:00
|
|
|
void removeInstanceRelationsipForDeletedObject(QObject *object);
|
2012-09-19 15:57:22 +02:00
|
|
|
public slots:
|
|
|
|
void refreshLocalFileProperty(const QString &path);
|
|
|
|
void refreshDummyData(const QString &path);
|
|
|
|
void emitParentChanged(QObject *child);
|
|
|
|
|
|
|
|
protected:
|
2019-12-11 16:00:28 +02:00
|
|
|
virtual QList<ServerNodeInstance> createInstances(const QVector<InstanceContainer> &container);
|
2012-09-19 15:57:22 +02:00
|
|
|
void reparentInstances(const QVector<ReparentContainer> &containerVector);
|
|
|
|
|
|
|
|
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter();
|
|
|
|
void resetInstanceProperty(const PropertyAbstractContainer &propertyContainer);
|
|
|
|
void setInstancePropertyBinding(const PropertyBindingContainer &bindingContainer);
|
|
|
|
void setInstancePropertyVariant(const PropertyValueContainer &valueContainer);
|
|
|
|
void setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer);
|
|
|
|
void removeProperties(const QList<PropertyAbstractContainer> &propertyList);
|
|
|
|
|
|
|
|
void insertInstanceRelationship(const ServerNodeInstance &instance);
|
|
|
|
void removeInstanceRelationsip(qint32 instanceId);
|
|
|
|
|
|
|
|
NodeInstanceClientInterface *nodeInstanceClient() const;
|
|
|
|
|
2018-05-07 14:56:23 +02:00
|
|
|
void timerEvent(QTimerEvent *) override;
|
2012-09-19 15:57:22 +02:00
|
|
|
|
|
|
|
virtual void collectItemChangesAndSendChangeCommands() = 0;
|
|
|
|
|
|
|
|
ValuesChangedCommand createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const;
|
|
|
|
ValuesChangedCommand createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const;
|
2019-10-23 16:29:31 +02:00
|
|
|
ValuesModifiedCommand createValuesModifiedCommand(const QVector<InstancePropertyValueTriple> &propertyList) const;
|
2012-09-19 15:57:22 +02:00
|
|
|
PixmapChangedCommand createPixmapChangedCommand(const QList<ServerNodeInstance> &instanceList) const;
|
|
|
|
InformationChangedCommand createAllInformationChangedCommand(const QList<ServerNodeInstance> &instanceList, bool initial = false) const;
|
|
|
|
ChildrenChangedCommand createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList<ServerNodeInstance> &instanceList) const;
|
|
|
|
ComponentCompletedCommand createComponentCompletedCommand(const QList<ServerNodeInstance> &instanceList);
|
2019-10-17 13:51:57 +02:00
|
|
|
ChangeSelectionCommand createChangeSelectionCommand(const QList<ServerNodeInstance> &instanceList);
|
2019-11-01 10:51:09 +02:00
|
|
|
Drop3DLibraryItemCommand createDrop3DLibraryItemCommand(const QByteArray &itemData);
|
2012-09-19 15:57:22 +02:00
|
|
|
|
|
|
|
void addChangedProperty(const InstancePropertyPair &property);
|
|
|
|
|
|
|
|
virtual void startRenderTimer();
|
|
|
|
void slowDownRenderTimer();
|
|
|
|
void stopRenderTimer();
|
|
|
|
void setRenderTimerInterval(int timerInterval);
|
|
|
|
int renderTimerInterval() const;
|
|
|
|
void setSlowRenderTimerInterval(int timerInterval);
|
|
|
|
|
2014-09-25 12:57:57 +02:00
|
|
|
virtual void initializeView() = 0;
|
2014-12-09 14:50:13 +01:00
|
|
|
virtual void setupScene(const CreateSceneCommand &command) = 0;
|
2012-09-19 15:57:22 +02:00
|
|
|
void loadDummyDataFiles(const QString& directory);
|
|
|
|
void loadDummyDataContext(const QString& directory);
|
|
|
|
void loadDummyDataFile(const QFileInfo& fileInfo);
|
|
|
|
void loadDummyContextObjectFile(const QFileInfo& fileInfo);
|
|
|
|
static QStringList dummyDataDirectories(const QString& directoryPath);
|
|
|
|
|
|
|
|
void setTimerId(int timerId);
|
|
|
|
int timerId() const;
|
|
|
|
|
|
|
|
QQmlContext *rootContext() const;
|
|
|
|
|
|
|
|
|
|
|
|
const QVector<InstancePropertyPair> changedPropertyList() const;
|
|
|
|
void clearChangedPropertyList();
|
|
|
|
|
|
|
|
virtual void refreshBindings() = 0;
|
|
|
|
|
|
|
|
void setupDummysForContext(QQmlContext *context);
|
|
|
|
|
2016-09-29 15:30:29 +02:00
|
|
|
void setupMockupTypes(const QVector<MockupTypeContainer> &container);
|
2012-09-19 15:57:22 +02:00
|
|
|
void setupFileUrl(const QUrl &fileUrl);
|
2015-03-10 11:46:27 +01:00
|
|
|
void setupImports(const QVector<AddImportContainer> &container);
|
2012-09-19 15:57:22 +02:00
|
|
|
void setupDummyData(const QUrl &fileUrl);
|
|
|
|
void setupDefaultDummyData();
|
|
|
|
QList<ServerNodeInstance> setupInstances(const CreateSceneCommand &command);
|
|
|
|
|
|
|
|
QList<QQmlContext*> allSubContextsForObject(QObject *object);
|
|
|
|
static QList<QObject*> allSubObjectsForObject(QObject *object);
|
|
|
|
|
|
|
|
virtual void resizeCanvasSizeToRootItemSize() = 0;
|
|
|
|
|
|
|
|
private:
|
2014-09-25 12:57:57 +02:00
|
|
|
void setupOnlyWorkingImports(const QStringList &workingImportStatementList);
|
2012-09-19 15:57:22 +02:00
|
|
|
ServerNodeInstance m_rootNodeInstance;
|
|
|
|
ServerNodeInstance m_activeStateInstance;
|
|
|
|
QHash<qint32, ServerNodeInstance> m_idInstanceHash;
|
|
|
|
QHash<QObject*, ServerNodeInstance> m_objectInstanceHash;
|
|
|
|
QMultiHash<QString, ObjectPropertyPair> m_fileSystemWatcherHash;
|
2012-10-08 13:40:01 +02:00
|
|
|
QList<QPair<QString, QPointer<QObject> > > m_dummyObjectList;
|
2012-10-04 17:44:48 +02:00
|
|
|
QPointer<QFileSystemWatcher> m_fileSystemWatcher;
|
|
|
|
QPointer<QFileSystemWatcher> m_dummdataFileSystemWatcher;
|
|
|
|
QPointer<Internal::ChildrenChangeEventFilter> m_childrenChangeEventFilter;
|
2012-09-19 15:57:22 +02:00
|
|
|
QUrl m_fileUrl;
|
|
|
|
NodeInstanceClientInterface *m_nodeInstanceClient;
|
2017-09-19 14:12:06 +02:00
|
|
|
int m_timer = 0;
|
|
|
|
int m_renderTimerInterval = 16;
|
|
|
|
bool m_slowRenderTimer = false;
|
|
|
|
int m_slowRenderTimerInterval = 200;
|
2012-09-19 15:57:22 +02:00
|
|
|
QVector<InstancePropertyPair> m_changedPropertyList;
|
2014-09-25 12:57:57 +02:00
|
|
|
QByteArray m_importCode;
|
2012-10-04 17:44:48 +02:00
|
|
|
QPointer<QObject> m_dummyContextObject;
|
|
|
|
QPointer<QQmlComponent> m_importComponent;
|
|
|
|
QPointer<QObject> m_importComponentObject;
|
2012-09-19 15:57:22 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|