Files
qt-creator/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceserver.h
Marco Bubke 765ba3b4b9 QmlDesigner: Prevent item hoping for reparenting
Because of the asynchronous nature of the formeditor the item can be between
to states. This looks like the item is hoping around. To prevent this a token
is sent to the instances and back. For the time frame the painting is disabled.

Change-Id: If7e937cba8171248464ad350bb14438c020b25f9
Reviewed-on: http://codereview.qt.nokia.com/1189
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Alessandro Portale <alessandro.portale@nokia.com>
2011-07-06 18:19:28 +02:00

228 lines
8.9 KiB
C++

/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#ifndef NODEINSTANCESERVER_H
#define NODEINSTANCESERVER_H
#include <QUrl>
#include <QVector>
#include <QSet>
#include <QStringList>
#include <nodeinstanceserverinterface.h>
#include "servernodeinstance.h"
QT_BEGIN_NAMESPACE
class QFileSystemWatcher;
class QDeclarativeView;
class QSGView;
class QDeclarativeEngine;
class QGraphicsObject;
class QFileInfo;
class QDeclarativeComponent;
QT_END_NAMESPACE
namespace QmlDesigner {
class NodeInstanceClientInterface;
class ValuesChangedCommand;
class PixmapChangedCommand;
class InformationChangedCommand;
class ChildrenChangedCommand;
class ReparentContainer;
class ComponentCompletedCommand;
class AddImportContainer;
namespace Internal {
class ChildrenChangeEventFilter;
}
class NodeInstanceServer : public NodeInstanceServerInterface
{
Q_OBJECT
public:
typedef QPair<QWeakPointer<QObject>, QString> ObjectPropertyPair;
typedef QPair<qint32, QString> IdPropertyPair;
typedef QPair<ServerNodeInstance, QString> InstancePropertyPair;
typedef QPair<QString, QWeakPointer<QObject> > DummyPair;
explicit NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient);
~NodeInstanceServer();
void createInstances(const CreateInstancesCommand &command);
void changeFileUrl(const ChangeFileUrlCommand &command);
void changePropertyValues(const ChangeValuesCommand &command);
void changePropertyBindings(const ChangeBindingsCommand &command);
void changeAuxiliaryValues(const ChangeAuxiliaryCommand &command);
void changeIds(const ChangeIdsCommand &command);
void createScene(const CreateSceneCommand &command);
void clearScene(const ClearSceneCommand &command);
void removeInstances(const RemoveInstancesCommand &command);
void removeProperties(const RemovePropertiesCommand &command);
void reparentInstances(const ReparentInstancesCommand &command);
void changeState(const ChangeStateCommand &command);
void completeComponent(const CompleteComponentCommand &command);
void changeNodeSource(const ChangeNodeSourceCommand &command);
void token(const TokenCommand &command);
ServerNodeInstance instanceForId(qint32 id) const;
bool hasInstanceForId(qint32 id) const;
ServerNodeInstance instanceForObject(QObject *object) const;
bool hasInstanceForObject(QObject *object) const;
virtual QDeclarativeEngine *engine() const = 0;
QDeclarativeContext *context() const;
void removeAllInstanceRelationships();
QFileSystemWatcher *fileSystemWatcher();
QFileSystemWatcher *dummydataFileSystemWatcher();
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter() const;
void addFilePropertyToFileSystemWatcher(QObject *object, const QString &propertyName, const QString &path);
void removeFilePropertyFromFileSystemWatcher(QObject *object, const QString &propertyName, const QString &path);
QUrl fileUrl() const;
ServerNodeInstance activeStateInstance() const;
void setStateInstance(const ServerNodeInstance &stateInstance);
void clearStateInstance();
ServerNodeInstance rootNodeInstance() const;
void notifyPropertyChange(qint32 instanceid, const QString &propertyName);
QStringList imports() const;
QObject *dummyContextObject() const;
virtual QDeclarativeView *declarativeView() const = 0;
virtual QSGView *sgView() const = 0;
public slots:
void refreshLocalFileProperty(const QString &path);
void refreshDummyData(const QString &path);
void emitParentChanged(QObject *child);
protected:
QList<ServerNodeInstance> createInstances(const QVector<InstanceContainer> &container);
void reparentInstances(const QVector<ReparentContainer> &containerVector);
void addImportString(const QString &import);
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;
void timerEvent(QTimerEvent *);
virtual void collectItemChangesAndSendChangeCommands() = 0;
ValuesChangedCommand createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const;
ValuesChangedCommand createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const;
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);
void addChangedProperty(const InstancePropertyPair &property);
virtual void startRenderTimer();
void slowDownRenderTimer();
void stopRenderTimer();
void setRenderTimerInterval(int timerInterval);
int renderTimerInterval() const;
void setSlowRenderTimerInterval(int timerInterval);
virtual void initializeView(const QVector<AddImportContainer> &importVector) = 0;
virtual QList<ServerNodeInstance> setupScene(const CreateSceneCommand &command) = 0;
void loadDummyDataFiles(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;
QDeclarativeContext *rootContext() const;
const QVector<InstancePropertyPair> changedPropertyList() const;
void clearChangedPropertyList();
virtual void refreshBindings() = 0;
void setupDummysForContext(QDeclarativeContext *context);
void setupFileUrl(const QUrl &fileUrl);
void setupImports(const QVector<AddImportContainer> &container);
void setupDummyData(const QUrl &fileUrl);
QList<ServerNodeInstance> setupInstances(const CreateSceneCommand &command);
QList<QDeclarativeContext*> allSubContextsForObject(QObject *object);
static QList<QObject*> allSubObjectsForObject(QObject *object);
virtual void resizeCanvasSizeToRootItemSize() = 0;
private:
ServerNodeInstance m_rootNodeInstance;
ServerNodeInstance m_activeStateInstance;
QHash<qint32, ServerNodeInstance> m_idInstanceHash;
QHash<QObject*, ServerNodeInstance> m_objectInstanceHash;
QMultiHash<QString, ObjectPropertyPair> m_fileSystemWatcherHash;
QList<QPair<QString, QWeakPointer<QObject> > > m_dummyObjectList;
QWeakPointer<QFileSystemWatcher> m_fileSystemWatcher;
QWeakPointer<QFileSystemWatcher> m_dummdataFileSystemWatcher;
QWeakPointer<Internal::ChildrenChangeEventFilter> m_childrenChangeEventFilter;
QUrl m_fileUrl;
NodeInstanceClientInterface *m_nodeInstanceClient;
int m_timer;
int m_renderTimerInterval;
bool m_slowRenderTimer;
int m_slowRenderTimerInterval;
QVector<InstancePropertyPair> m_changedPropertyList;
QStringList m_importList;
QWeakPointer<QObject> m_dummyContextObject;
QWeakPointer<QDeclarativeComponent> m_importComponent;
QWeakPointer<QObject> m_importComponentObject;
};
}
#endif // NODEINSTANCESERVER_H