forked from qt-creator/qt-creator
QmlDesigner.Instances: Move instances out of process
The complete qml emulation layer (instances) is moved
into another external process (qmlpuppet).
Summary of architectural changes:
- Asynchronous messaging
Handling commands and data transfer asynchronously reduces the
amount of context switches between processes.
- Proxy classes for client process
This classes abstract the inter process communication
- QVariant based command parsing and serialization
Using LocalSocket in bidirectional manner for communications
of commands and data transfer.
- Integer based identifier instead of ModelNode in client process
The qml emulation layer (instances) has no more depencies to our
internal data model.
- Timer based rendering
Rendering in instances is controlled by a timer. Only dirty items
are updated.
This commit is contained in:
@@ -78,6 +78,8 @@ bin/*.dll
|
||||
bin/qtcreator
|
||||
bin/qtcreator_process_stub*
|
||||
bin/qtcreator.exe
|
||||
bin/qmlpuppet
|
||||
bin/qmlpuppet.exe
|
||||
share/doc/qtcreator/qtcreator.qch
|
||||
src/tools/gen-cpp-ast/generate-ast
|
||||
src/tools/mkvisitor/cplusplus0
|
||||
|
||||
@@ -34,7 +34,8 @@
|
||||
|
||||
#include <modelnode.h>
|
||||
#include <nodemetainfo.h>
|
||||
#include <widgetqueryview.h>
|
||||
#include <qmlanchors.h>
|
||||
|
||||
|
||||
#include <QGraphicsSceneMouseEvent>
|
||||
#include <QDebug>
|
||||
@@ -72,10 +73,7 @@ void FormEditorItem::setup()
|
||||
{
|
||||
if (qmlItemNode().hasInstanceParent()) {
|
||||
setParentItem(scene()->itemForQmlItemNode(qmlItemNode().instanceParent().toQmlItemNode()));
|
||||
setVisible(true);
|
||||
setOpacity(qmlItemNode().instanceValue("opacity").toDouble());
|
||||
} else if (!qmlItemNode().isRootNode()){
|
||||
setVisible(false);
|
||||
}
|
||||
|
||||
setFlag(QGraphicsItem::ItemClipsChildrenToShape, qmlItemNode().instanceValue("clip").toBool());
|
||||
|
||||
@@ -144,7 +144,6 @@ void FormEditorScene::synchronizeTransformation(const QmlItemNode &qmlItemNode)
|
||||
{
|
||||
FormEditorItem *item = itemForQmlItemNode(qmlItemNode);
|
||||
item->updateGeometry();
|
||||
item->update();
|
||||
|
||||
if (qmlItemNode.isRootNode()) {
|
||||
QRectF sceneRect(qmlItemNode.instanceBoundingRect());
|
||||
@@ -175,8 +174,6 @@ void FormEditorScene::synchronizeOtherProperty(const QmlItemNode &qmlItemNode, c
|
||||
if (propertyName == "visible")
|
||||
item->setContentVisible(qmlItemNode.instanceValue("visible").toBool());
|
||||
|
||||
if (item)
|
||||
item->update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,13 +341,6 @@ void FormEditorScene::reparentItem(const QmlItemNode &node, const QmlItemNode &n
|
||||
|
||||
if (item->parentItem() != parentItem) {
|
||||
item->setParentItem(parentItem);
|
||||
if (parentItem) {
|
||||
item->setVisible(true);
|
||||
} else {
|
||||
item->setVisible(false);
|
||||
}
|
||||
|
||||
item->update();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -380,7 +370,6 @@ void FormEditorScene::clearFormEditorItems()
|
||||
foreach (QGraphicsItem *item, itemList) {
|
||||
if (qgraphicsitem_cast<FormEditorItem* >(item)) {
|
||||
item->setParentItem(0);
|
||||
item->setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "formeditorscene.h"
|
||||
#include <rewritertransaction.h>
|
||||
#include <modelnode.h>
|
||||
#include <modelutilities.h>
|
||||
#include <itemlibraryinfo.h>
|
||||
#include <metainfo.h>
|
||||
#include <model.h>
|
||||
@@ -451,6 +450,33 @@ void FormEditorView::customNotification(const AbstractView *view, const QString
|
||||
m_formEditorWidget->setFeedbackNode(QmlItemNode());
|
||||
}
|
||||
|
||||
if (identifier == "__instance information changed__") {
|
||||
QList<FormEditorItem*> itemNodeList;
|
||||
|
||||
foreach (const ModelNode &node, nodeList) {
|
||||
QmlItemNode qmlItemNode(node);
|
||||
if (qmlItemNode.isValid() && scene()->hasItemForQmlItemNode(qmlItemNode)) {
|
||||
scene()->synchronizeParent(qmlItemNode);
|
||||
scene()->synchronizeTransformation(qmlItemNode);
|
||||
itemNodeList.append(scene()->itemForQmlItemNode(qmlItemNode));
|
||||
}
|
||||
}
|
||||
|
||||
m_currentTool->formEditorItemsChanged(itemNodeList);
|
||||
|
||||
}
|
||||
|
||||
if (identifier == "__instance render pixmap changed__") {
|
||||
QList<FormEditorItem*> itemNodeList;
|
||||
|
||||
foreach (const ModelNode &node, nodeList) {
|
||||
QmlItemNode qmlItemNode(node);
|
||||
if (qmlItemNode.isValid() && scene()->hasItemForQmlItemNode(qmlItemNode)) {
|
||||
scene()->itemForQmlItemNode(qmlItemNode)->update();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QmlModelView::customNotification(view, identifier, nodeList, data);
|
||||
}
|
||||
|
||||
@@ -509,26 +535,6 @@ QmlItemNode findRecursiveQmlItemNode(const QmlObjectNode &firstQmlObjectNode)
|
||||
return QmlItemNode();
|
||||
}
|
||||
|
||||
void FormEditorView::transformChanged(const QmlObjectNode &qmlObjectNode, const QString &/*propertyName*/)
|
||||
{
|
||||
QmlItemNode itemNode = qmlObjectNode.toQmlItemNode();
|
||||
if (itemNode.isValid() && scene()->hasItemForQmlItemNode(itemNode)) {
|
||||
m_scene->synchronizeTransformation(itemNode);
|
||||
m_currentTool->formEditorItemsChanged(QList<FormEditorItem*>() << m_scene->itemForQmlItemNode(itemNode));
|
||||
}
|
||||
|
||||
scene()->update();
|
||||
}
|
||||
|
||||
void FormEditorView::parentChanged(const QmlObjectNode &qmlObjectNode)
|
||||
{
|
||||
QmlItemNode itemNode = qmlObjectNode.toQmlItemNode();
|
||||
if (itemNode.isValid() && scene()->hasItemForQmlItemNode(itemNode)) {
|
||||
scene()->synchronizeParent(itemNode);
|
||||
m_currentTool->formEditorItemsChanged(QList<FormEditorItem*>() << m_scene->itemForQmlItemNode(itemNode));
|
||||
}
|
||||
}
|
||||
|
||||
void FormEditorView::otherPropertyChanged(const QmlObjectNode &qmlObjectNode, const QString &propertyName)
|
||||
{
|
||||
Q_ASSERT(qmlObjectNode.isValid());
|
||||
@@ -556,7 +562,6 @@ void FormEditorView::stateChanged(const QmlModelState &newQmlModelState, const Q
|
||||
{
|
||||
QmlModelView::stateChanged(newQmlModelState, oldQmlModelState);
|
||||
|
||||
|
||||
m_formEditorWidget->anchorToolAction()->setEnabled(newQmlModelState.isBaseState());
|
||||
|
||||
if (!newQmlModelState.isBaseState() && currentTool() == m_anchorTool) {
|
||||
|
||||
@@ -112,8 +112,6 @@ signals:
|
||||
void ItemCreatorDeActivated();
|
||||
|
||||
protected:
|
||||
void transformChanged(const QmlObjectNode &qmlObjectNode, const QString &propertyName);
|
||||
void parentChanged(const QmlObjectNode &qmlObjectNode);
|
||||
void otherPropertyChanged(const QmlObjectNode &qmlObjectNode, const QString &propertyName);
|
||||
void stateChanged(const QmlModelState &newQmlModelState, const QmlModelState &oldQmlModelState);
|
||||
|
||||
|
||||
@@ -81,12 +81,8 @@ void StatesEditorView::setCurrentStateSilent(int index)
|
||||
return;
|
||||
}
|
||||
|
||||
nodeInstanceView()->setBlockStatePropertyChanges(true);
|
||||
|
||||
QmlModelView::activateState(state);
|
||||
|
||||
nodeInstanceView()->setBlockStatePropertyChanges(false);
|
||||
|
||||
m_settingSilentState = false;
|
||||
}
|
||||
|
||||
@@ -478,45 +474,47 @@ void StatesEditorView::selectedNodesChanged(const QList<ModelNode> &/*selectedNo
|
||||
|
||||
QPixmap StatesEditorView::renderState(int i)
|
||||
{
|
||||
if (debug)
|
||||
qDebug() << __FUNCTION__ << i;
|
||||
return QPixmap();
|
||||
|
||||
if (!m_attachedToModel)
|
||||
return QPixmap();
|
||||
// if (debug)
|
||||
// qDebug() << __FUNCTION__ << i;
|
||||
|
||||
Q_ASSERT(i >= 0 && i < m_modelStates.size());
|
||||
QmlModelState oldState = currentState();
|
||||
setCurrentStateSilent(i);
|
||||
// if (!m_attachedToModel)
|
||||
// return QPixmap();
|
||||
|
||||
Q_ASSERT(nodeInstanceView());
|
||||
// Q_ASSERT(i >= 0 && i < m_modelStates.size());
|
||||
// QmlModelState oldState = currentState();
|
||||
// setCurrentStateSilent(i);
|
||||
|
||||
const int checkerbordSize= 10;
|
||||
QPixmap tilePixmap(checkerbordSize * 2, checkerbordSize * 2);
|
||||
tilePixmap.fill(Qt::white);
|
||||
QPainter tilePainter(&tilePixmap);
|
||||
QColor color(220, 220, 220);
|
||||
tilePainter.fillRect(0, 0, checkerbordSize, checkerbordSize, color);
|
||||
tilePainter.fillRect(checkerbordSize, checkerbordSize, checkerbordSize, checkerbordSize, color);
|
||||
tilePainter.end();
|
||||
// Q_ASSERT(nodeInstanceView());
|
||||
|
||||
// const int checkerbordSize= 10;
|
||||
// QPixmap tilePixmap(checkerbordSize * 2, checkerbordSize * 2);
|
||||
// tilePixmap.fill(Qt::white);
|
||||
// QPainter tilePainter(&tilePixmap);
|
||||
// QColor color(220, 220, 220);
|
||||
// tilePainter.fillRect(0, 0, checkerbordSize, checkerbordSize, color);
|
||||
// tilePainter.fillRect(checkerbordSize, checkerbordSize, checkerbordSize, checkerbordSize, color);
|
||||
// tilePainter.end();
|
||||
|
||||
|
||||
QSizeF pixmapSize(nodeInstanceView()->sceneRect().size());
|
||||
if (pixmapSize.width() > 100 || pixmapSize.height() > 100) // sensible maximum size
|
||||
pixmapSize.scale(QSize(100, 100), Qt::KeepAspectRatio);
|
||||
QSize cutSize(floor(pixmapSize.width()),floor(pixmapSize.height()));
|
||||
pixmapSize.setWidth(ceil(pixmapSize.width()));
|
||||
pixmapSize.setHeight(ceil(pixmapSize.height()));
|
||||
QPixmap pixmap(pixmapSize.toSize());
|
||||
// QSizeF pixmapSize(nodeInstanceView()->sceneRect().size());
|
||||
// if (pixmapSize.width() > 100 || pixmapSize.height() > 100) // sensible maximum size
|
||||
// pixmapSize.scale(QSize(100, 100), Qt::KeepAspectRatio);
|
||||
// QSize cutSize(floor(pixmapSize.width()),floor(pixmapSize.height()));
|
||||
// pixmapSize.setWidth(ceil(pixmapSize.width()));
|
||||
// pixmapSize.setHeight(ceil(pixmapSize.height()));
|
||||
// QPixmap pixmap(pixmapSize.toSize());
|
||||
|
||||
QPainter painter(&pixmap);
|
||||
painter.drawTiledPixmap(pixmap.rect(), tilePixmap);
|
||||
nodeInstanceView()->render(&painter, pixmap.rect(), nodeInstanceView()->sceneRect());
|
||||
// QPainter painter(&pixmap);
|
||||
// painter.drawTiledPixmap(pixmap.rect(), tilePixmap);
|
||||
// nodeInstanceView()->render(&painter, pixmap.rect(), nodeInstanceView()->sceneRect());
|
||||
|
||||
setCurrentStateSilent(m_modelStates.indexOf(oldState));
|
||||
// setCurrentStateSilent(m_modelStates.indexOf(oldState));
|
||||
|
||||
Q_ASSERT(oldState == currentState());
|
||||
// Q_ASSERT(oldState == currentState());
|
||||
|
||||
return pixmap.copy(0,0,cutSize.width(),cutSize.height());
|
||||
// return pixmap.copy(0,0,cutSize.width(),cutSize.height());
|
||||
}
|
||||
|
||||
void StatesEditorView::sceneChanged()
|
||||
|
||||
@@ -2,7 +2,7 @@ include($$PWD/filemanager/filemanager.pri)
|
||||
include (../config.pri)
|
||||
|
||||
QT += script \
|
||||
declarative
|
||||
network
|
||||
|
||||
DEFINES += TEST_EXPORTS
|
||||
INCLUDEPATH += $$PWD \
|
||||
@@ -27,15 +27,9 @@ SOURCES += $$PWD/model/abstractview.cpp \
|
||||
$$PWD/model/propertycontainer.cpp \
|
||||
$$PWD/pluginmanager/widgetpluginmanager.cpp \
|
||||
$$PWD/pluginmanager/widgetpluginpath.cpp \
|
||||
$$PWD/instances/nodeinstance.cpp \
|
||||
$$PWD/instances/servernodeinstance.cpp \
|
||||
$$PWD/instances/objectnodeinstance.cpp \
|
||||
$$PWD/instances/widgetnodeinstance.cpp \
|
||||
$$PWD/instances/graphicswidgetnodeinstance.cpp \
|
||||
$$PWD/instances/qmlgraphicsitemnodeinstance.cpp \
|
||||
$$PWD/instances/graphicsscenenodeinstance.cpp \
|
||||
$$PWD/instances/graphicsviewnodeinstance.cpp \
|
||||
$$PWD/instances/proxywidgetnodeinstance.cpp \
|
||||
$$PWD/instances/qmlviewnodeinstance.cpp \
|
||||
$$PWD/instances/dummynodeinstance.cpp \
|
||||
$$PWD/instances/qmlpropertychangesnodeinstance.cpp \
|
||||
$$PWD/instances/qmlstatenodeinstance.cpp \
|
||||
@@ -95,8 +89,35 @@ SOURCES += $$PWD/model/abstractview.cpp \
|
||||
$$PWD/instances/nodeinstancemetaobject.cpp \
|
||||
$$PWD/instances/behaviornodeinstance.cpp \
|
||||
$$PWD/instances/nodeinstancesignalspy.cpp \
|
||||
$$PWD/instances/positionernodeinstance.cpp
|
||||
|
||||
$$PWD/instances/positionernodeinstance.cpp \
|
||||
$$PWD/instances/nodeinstanceserver.cpp \
|
||||
$$PWD/instances/declarativedesignercommunicationinterface.cpp \
|
||||
$$PWD/instances/createinstancescommand.cpp \
|
||||
$$PWD/instances/nodeinstanceserverinterface.cpp \
|
||||
$$PWD/instances/nodeinstance.cpp \
|
||||
$$PWD/instances/propertyvaluecontainer.cpp \
|
||||
$$PWD/instances/childrenchangeeventfilter.cpp \
|
||||
$$PWD/instances/propertybindingcontainer.cpp \
|
||||
$$PWD/instances/propertyabstractcontainer.cpp \
|
||||
$$PWD/instances/createscenecommand.cpp \
|
||||
$$PWD/instances/instancecontainer.cpp \
|
||||
$$PWD/instances/changefileurlcommand.cpp \
|
||||
$$PWD/instances/clearscenecommand.cpp \
|
||||
$$PWD/instances/reparentcontainer.cpp \
|
||||
$$PWD/instances/reparentinstancescommand.cpp \
|
||||
$$PWD/instances/changevaluescommand.cpp \
|
||||
$$PWD/instances/changebindingscommand.cpp \
|
||||
$$PWD/instances/changeidscommand.cpp \
|
||||
$$PWD/instances/idcontainer.cpp \
|
||||
$$PWD/instances/removeinstancescommand.cpp \
|
||||
$$PWD/instances/removepropertiescommand.cpp \
|
||||
$$PWD/instances/valueschangedcommand.cpp \
|
||||
$$PWD/instances/pixmapchangedcommand.cpp \
|
||||
$$PWD/instances/informationchangedcommand.cpp \
|
||||
$$PWD/instances/informationcontainer.cpp \
|
||||
$$PWD/instances/changestatecommand.cpp \
|
||||
$$PWD/instances/nodeinstanceserverproxy.cpp \
|
||||
$$PWD/instances/nodeinstanceclientproxy.cpp
|
||||
HEADERS += $$PWD/include/corelib_global.h \
|
||||
$$PWD/include/abstractview.h \
|
||||
$$PWD/include/nodeinstanceview.h \
|
||||
@@ -111,7 +132,6 @@ HEADERS += $$PWD/include/corelib_global.h \
|
||||
$$PWD/include/modelnode.h \
|
||||
$$PWD/include/model.h \
|
||||
$$PWD/include/nodeproperty.h \
|
||||
$$PWD/include/widgetqueryview.h \
|
||||
$$PWD/include/subcomponentmanager.h \
|
||||
$$PWD/include/propertycontainer.h \
|
||||
$$PWD/model/internalnode_p.h \
|
||||
@@ -120,15 +140,9 @@ HEADERS += $$PWD/include/corelib_global.h \
|
||||
$$PWD/model/propertyparser.h \
|
||||
$$PWD/pluginmanager/widgetpluginmanager.h \
|
||||
$$PWD/pluginmanager/widgetpluginpath.h \
|
||||
$$PWD/include/nodeinstance.h \
|
||||
$$PWD/instances/servernodeinstance.h \
|
||||
$$PWD/instances/objectnodeinstance.h \
|
||||
$$PWD/instances/widgetnodeinstance.h \
|
||||
$$PWD/instances/graphicswidgetnodeinstance.h \
|
||||
$$PWD/instances/qmlgraphicsitemnodeinstance.h \
|
||||
$$PWD/instances/graphicsscenenodeinstance.h \
|
||||
$$PWD/instances/graphicsviewnodeinstance.h \
|
||||
$$PWD/instances/proxywidgetnodeinstance.h \
|
||||
$$PWD/instances/qmlviewnodeinstance.h \
|
||||
$$PWD/instances/dummynodeinstance.h \
|
||||
$$PWD/instances/qmlpropertychangesnodeinstance.h \
|
||||
$$PWD/instances/qmlstatenodeinstance.h \
|
||||
@@ -189,12 +203,40 @@ HEADERS += $$PWD/include/corelib_global.h \
|
||||
$$PWD/instances/nodeinstancemetaobject.h \
|
||||
$$PWD/instances/behaviornodeinstance.h \
|
||||
$$PWD/instances/nodeinstancesignalspy.h \
|
||||
$$PWD/instances/positionernodeinstance.h
|
||||
$$PWD/instances/positionernodeinstance.h \
|
||||
$$PWD/instances/nodeinstanceserver.h \
|
||||
$$PWD/instances/declarativedesignercommunicationinterface.h \
|
||||
$$PWD/instances/createinstancescommand.h \
|
||||
$$PWD/include/nodeinstanceserverinterface.h \
|
||||
$$PWD/include/nodeinstance.h \
|
||||
$$PWD/include/propertyvaluecontainer.h \
|
||||
$$PWD/instances/childrenchangeeventfilter.h \
|
||||
$$PWD/include/propertybindingcontainer.h \
|
||||
$$PWD/include/propertyabstractcontainer.h \
|
||||
$$PWD/instances/createscenecommand.h \
|
||||
$$PWD/instances/instancecontainer.h \
|
||||
$$PWD/instances/changefileurlcommand.h \
|
||||
$$PWD/instances/clearscenecommand.h \
|
||||
$$PWD/instances/reparentcontainer.h \
|
||||
$$PWD/instances/reparentinstancescommand.h \
|
||||
$$PWD/instances/changevaluescommand.h \
|
||||
$$PWD/instances/changebindingscommand.h \
|
||||
$$PWD/instances/changeidscommand.h \
|
||||
$$PWD/instances/idcontainer.h \
|
||||
$$PWD/instances/removeinstancescommand.h \
|
||||
$$PWD/instances/removepropertiescommand.h \
|
||||
$$PWD/include/nodeinstanceclientinterface.h \
|
||||
$$PWD/instances/valueschangedcommand.h \
|
||||
$$PWD/instances/pixmapchangedcommand.h \
|
||||
$$PWD/instances/informationchangedcommand.h \
|
||||
$$PWD/instances/informationcontainer.h \
|
||||
$$PWD/include/commondefines.h \
|
||||
$$PWD/instances/changestatecommand.h \
|
||||
$$PWD/instances/nodeinstanceserverproxy.h \
|
||||
$$PWD/instances/nodeinstanceclientproxy.h
|
||||
|
||||
contains(CONFIG, plugin) {
|
||||
# If core.pri has been included in the qmldesigner plugin
|
||||
SOURCES += $$PWD/model/basetexteditmodifier.cpp
|
||||
HEADERS += $$PWD/include/basetexteditmodifier.h
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
SOURCES += $$PWD/exception.cpp
|
||||
SOURCES += $$PWD/invalidnodeinstanceexception.cpp
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef COMMONDEFINES_H
|
||||
#define COMMONDEFINES_H
|
||||
|
||||
#include <QMetaType>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
enum InformationName
|
||||
{
|
||||
NoName,
|
||||
Size,
|
||||
BoundingRect,
|
||||
Transform,
|
||||
HasAnchor,
|
||||
Anchor,
|
||||
InstanceTypeForProperty,
|
||||
PenWidth,
|
||||
Position,
|
||||
IsInPositioner,
|
||||
SceneTransform,
|
||||
IsResizable,
|
||||
IsMovable,
|
||||
IsAnchoredByChildren,
|
||||
IsAnchoredBySibling,
|
||||
HasContent,
|
||||
HasBindingForProperty,
|
||||
Parent
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // COMMONDEFINES_H
|
||||
@@ -61,7 +61,6 @@ class AbstractView;
|
||||
class NodeListProperty;
|
||||
class NodeProperty;
|
||||
class NodeAbstractProperty;
|
||||
class NodeInstance;
|
||||
class ModelNode;
|
||||
|
||||
CORESHARED_EXPORT QList<Internal::InternalNodePointer> toInternalNodeList(const QList<ModelNode> &nodeList);
|
||||
|
||||
@@ -1,206 +1,69 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
#ifndef PROXYNODEINSTANCE_H
|
||||
#define PROXYNODEINSTANCE_H
|
||||
|
||||
#ifndef NODEINSTANCE_H
|
||||
#define NODEINSTANCE_H
|
||||
|
||||
#include "corelib_global.h"
|
||||
#include <QSharedPointer>
|
||||
#include <QHash>
|
||||
#include <QRectF>
|
||||
#include <propertymetainfo.h>
|
||||
#include <qmlanchors.h>
|
||||
#include <QTransform>
|
||||
#include <QPointF>
|
||||
#include <QSizeF>
|
||||
#include <QPair>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QPainter;
|
||||
class QStyleOptionGraphicsItem;
|
||||
class QDeclarativeContext;
|
||||
class QGraphicsItem;
|
||||
class QGraphicsTransform;
|
||||
QT_END_NAMESPACE
|
||||
#include "commondefines.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class ModelNode;
|
||||
class NodeInstanceView;
|
||||
class Preview;
|
||||
class NodeMetaInfo;
|
||||
class NodeState;
|
||||
class WidgetQueryView;
|
||||
class ProxyNodeInstanceData;
|
||||
|
||||
|
||||
namespace Internal {
|
||||
class ObjectNodeInstance;
|
||||
class QmlGraphicsItemNodeInstance;
|
||||
class QmlPropertyChangesNodeInstance;
|
||||
class GraphicsObjectNodeInstance;
|
||||
class QmlStateNodeInstance;
|
||||
}
|
||||
|
||||
class CORESHARED_EXPORT NodeInstance
|
||||
class NodeInstance
|
||||
{
|
||||
friend class CORESHARED_EXPORT QmlDesigner::WidgetQueryView;
|
||||
friend CORESHARED_EXPORT class Preview;
|
||||
friend CORESHARED_EXPORT class NodeInstanceView;
|
||||
friend class QHash<ModelNode, NodeInstance>;
|
||||
friend CORESHARED_EXPORT uint qHash(const NodeInstance &instance);
|
||||
friend CORESHARED_EXPORT bool operator==(const NodeInstance &first, const NodeInstance &second);
|
||||
friend CORESHARED_EXPORT class NodeMetaInfo;
|
||||
friend class QmlDesigner::Internal::QmlGraphicsItemNodeInstance;
|
||||
friend class QmlDesigner::Internal::GraphicsObjectNodeInstance;
|
||||
friend class QmlDesigner::Internal::ObjectNodeInstance;
|
||||
friend class QmlDesigner::Internal::QmlPropertyChangesNodeInstance;
|
||||
friend class QmlDesigner::Internal::QmlStateNodeInstance;
|
||||
|
||||
friend class NodeInstanceView;
|
||||
public:
|
||||
static NodeInstance create(const ModelNode &node, qint32 instanceId);
|
||||
NodeInstance();
|
||||
~NodeInstance();
|
||||
NodeInstance(const NodeInstance &other);
|
||||
NodeInstance& operator=(const NodeInstance &other);
|
||||
|
||||
void paint(QPainter *painter);
|
||||
|
||||
NodeInstance parent() const;
|
||||
bool hasParent() const;
|
||||
ModelNode modelNode() const;
|
||||
|
||||
|
||||
bool isTopLevel() const;
|
||||
|
||||
bool isQmlGraphicsItem() const;
|
||||
bool isGraphicsScene() const;
|
||||
bool isGraphicsView() const;
|
||||
bool isGraphicsWidget() const;
|
||||
bool isProxyWidget() const;
|
||||
bool isWidget() const;
|
||||
bool isQDeclarativeView() const;
|
||||
bool isGraphicsObject() const;
|
||||
bool isTransition() const;
|
||||
bool isPositioner() const;
|
||||
|
||||
bool equalGraphicsItem(QGraphicsItem *item) const;
|
||||
|
||||
QRectF boundingRect() const;
|
||||
QPointF position() const;
|
||||
QSizeF size() const;
|
||||
QTransform transform() const;
|
||||
QTransform customTransform() const;
|
||||
QTransform sceneTransform() const;
|
||||
double rotation() const;
|
||||
double scale() const;
|
||||
QList<QGraphicsTransform *> transformations() const;
|
||||
QPointF transformOriginPoint() const;
|
||||
double zValue() const;
|
||||
|
||||
double opacity() const;
|
||||
QVariant property(const QString &name) const;
|
||||
QVariant defaultValue(const QString &name) const;
|
||||
QString instanceType(const QString &name) const;
|
||||
|
||||
bool hasBindingForProperty(const QString &name) const;
|
||||
|
||||
bool isValid() const;
|
||||
void makeInvalid();
|
||||
void renderPixmapNextPaint();
|
||||
QRectF boundingRect() const;
|
||||
bool hasContent() const;
|
||||
bool isResizable() const;
|
||||
bool isMovable() const;
|
||||
bool isInPositioner() const;
|
||||
|
||||
bool isWrappingThisObject(QObject *object) const;
|
||||
|
||||
QVariant resetVariant(const QString &name) const;
|
||||
|
||||
bool hasAnchor(const QString &name) const;
|
||||
bool isAnchoredBySibling() const;
|
||||
bool isAnchoredByChildren() const;
|
||||
QPair<QString, NodeInstance> anchor(const QString &name) const;
|
||||
|
||||
bool isMovable() const;
|
||||
bool isResizable() const;
|
||||
QTransform transform() const;
|
||||
QTransform sceneTransform() const;
|
||||
bool isInPositioner() const;
|
||||
QPointF position() const;
|
||||
QSizeF size() const;
|
||||
int penWidth() const;
|
||||
void paint(QPainter *painter);
|
||||
|
||||
static void registerDeclarativeTypes();
|
||||
QVariant property(const QString &name) const;
|
||||
bool hasBindingForProperty(const QString &name) const;
|
||||
QPair<QString, qint32> anchor(const QString &name) const;
|
||||
bool hasAnchor(const QString &name) const;
|
||||
QString instanceType(const QString &name) const;
|
||||
|
||||
void doComponentComplete();
|
||||
qint32 parentId() const;
|
||||
|
||||
QString id() const;
|
||||
protected:
|
||||
void setProperty(const QString &name, const QVariant &value);
|
||||
void setInformation(InformationName name,
|
||||
const QVariant &information,
|
||||
const QVariant &secondInformation,
|
||||
const QVariant &thirdInformation);
|
||||
void setRenderImage(const QImage &image);
|
||||
NodeInstance(ProxyNodeInstanceData *d);
|
||||
qint32 instanceId() const;
|
||||
|
||||
#ifdef QTCREATOR_TEST
|
||||
QObject* testHandle() const;
|
||||
Internal::ObjectNodeInstance* internalInstance() const;
|
||||
#endif
|
||||
private: // functions
|
||||
NodeInstance(const QSharedPointer<Internal::ObjectNodeInstance> &abstractInstance);
|
||||
|
||||
void setModelNode(const ModelNode &node);
|
||||
|
||||
void setPropertyVariant(const QString &name, const QVariant &value);
|
||||
void setPropertyDynamicVariant(const QString &name, const QString &typeName, const QVariant &value);
|
||||
|
||||
void setPropertyBinding(const QString &name, const QString &expression);
|
||||
void setPropertyDynamicBinding(const QString &name, const QString &typeName, const QString &expression);
|
||||
|
||||
void resetProperty(const QString &name);
|
||||
void refreshProperty(const QString &name);
|
||||
|
||||
void activateState();
|
||||
void deactivateState();
|
||||
void refreshState();
|
||||
|
||||
bool updateStateVariant(const NodeInstance &target, const QString &propertyName, const QVariant &value);
|
||||
bool updateStateBinding(const NodeInstance &target, const QString &propertyName, const QString &expression);
|
||||
bool resetStateProperty(const NodeInstance &target, const QString &propertyName, const QVariant &resetValue);
|
||||
|
||||
static NodeInstance create(NodeInstanceView *nodeInstanceView, const ModelNode &node, QObject *objectToBeWrapped);
|
||||
static NodeInstance create(NodeInstanceView *nodeInstanceView, const NodeMetaInfo &metaInfo, QDeclarativeContext *context);
|
||||
|
||||
void setDeleteHeldInstance(bool deleteInstance);
|
||||
void reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty);
|
||||
|
||||
|
||||
void setId(const QString &id);
|
||||
|
||||
static QSharedPointer<Internal::ObjectNodeInstance> createInstance(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
QSharedPointer<Internal::QmlGraphicsItemNodeInstance> qmlGraphicsItemNodeInstance() const;
|
||||
|
||||
void paintUpdate();
|
||||
|
||||
|
||||
QObject *internalObject() const; // should be not used outside of the nodeinstances!!!!
|
||||
|
||||
private: // variables
|
||||
QSharedPointer<Internal::ObjectNodeInstance> m_nodeInstance;
|
||||
private:
|
||||
QSharedPointer<ProxyNodeInstanceData> d;
|
||||
};
|
||||
|
||||
CORESHARED_EXPORT uint qHash(const NodeInstance &instance);
|
||||
CORESHARED_EXPORT bool operator==(const NodeInstance &first, const NodeInstance &second);
|
||||
}
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::NodeInstance);
|
||||
|
||||
#endif // NODEINSTANCE_H
|
||||
#endif // PROXYNODEINSTANCE_H
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#ifndef NODEINSTANCECLIENTINTERFACE_H
|
||||
#define NODEINSTANCECLIENTINTERFACE_H
|
||||
|
||||
#include <QtGlobal>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class ValuesChangedCommand;
|
||||
class PixmapChangedCommand;
|
||||
class InformationChangedCommand;
|
||||
|
||||
class NodeInstanceClientInterface
|
||||
{
|
||||
public:
|
||||
virtual void informationChanged(const InformationChangedCommand &command) = 0;
|
||||
virtual void valuesChanged(const ValuesChangedCommand &command) = 0;
|
||||
virtual void pixmapChanged(const PixmapChangedCommand &command) = 0;
|
||||
virtual void flush() {};
|
||||
virtual qint64 bytesToWrite() const {return 0;}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // NODEINSTANCECLIENTINTERFACE_H
|
||||
@@ -0,0 +1,48 @@
|
||||
#ifndef NODEINSTANCESERVERINTERFACE_H
|
||||
#define NODEINSTANCESERVERINTERFACE_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class PropertyAbstractContainer;
|
||||
class PropertyBindingContainer;
|
||||
class PropertyValueContainer;
|
||||
|
||||
class ChangeFileUrlCommand;
|
||||
class ChangeValuesCommand;
|
||||
class ChangeBindingsCommand;
|
||||
class CreateSceneCommand;
|
||||
class CreateInstancesCommand;
|
||||
class ClearSceneCommand;
|
||||
class ReparentInstancesCommand;
|
||||
class ChangeIdsCommand;
|
||||
class RemoveInstancesCommand;
|
||||
class RemovePropertiesCommand;
|
||||
class ChangeStateCommand;
|
||||
|
||||
class NodeInstanceServerInterface : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit NodeInstanceServerInterface(QObject *parent = 0);
|
||||
|
||||
virtual void createInstances(const CreateInstancesCommand &command) = 0;
|
||||
virtual void changeFileUrl(const ChangeFileUrlCommand &command) = 0;
|
||||
virtual void createScene(const CreateSceneCommand &command) = 0;
|
||||
virtual void clearScene(const ClearSceneCommand &command) = 0;
|
||||
virtual void removeInstances(const RemoveInstancesCommand &command) = 0;
|
||||
virtual void removeProperties(const RemovePropertiesCommand &command) = 0;
|
||||
virtual void changePropertyBindings(const ChangeBindingsCommand &command) = 0;
|
||||
virtual void changePropertyValues(const ChangeValuesCommand &command) = 0;
|
||||
virtual void reparentInstances(const ReparentInstancesCommand &command) = 0;
|
||||
virtual void changeIds(const ChangeIdsCommand &command) = 0;
|
||||
virtual void changeState(const ChangeStateCommand &command) = 0;
|
||||
|
||||
virtual void setBlockUpdates(bool block) {}
|
||||
|
||||
static void registerCommands();
|
||||
};
|
||||
|
||||
}
|
||||
#endif // NODEINSTANCESERVERINTERFACE_H
|
||||
@@ -35,35 +35,42 @@
|
||||
|
||||
#include <modelnode.h>
|
||||
#include <nodeinstance.h>
|
||||
#include <nodeinstanceclientinterface.h>
|
||||
|
||||
#include <QHash>
|
||||
#include <QSet>
|
||||
#include <QWeakPointer>
|
||||
#include <QRectF>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QDeclarativeEngine;
|
||||
class QGraphicsView;
|
||||
class QFileSystemWatcher;
|
||||
class QPainter;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
namespace Internal {
|
||||
class ChildrenChangeEventFilter;
|
||||
class QmlStateNodeInstance;
|
||||
}
|
||||
class NodeInstanceServerInterface;
|
||||
class CreateSceneCommand;
|
||||
class CreateInstancesCommand;
|
||||
class ClearSceneCommand;
|
||||
class ReparentInstancesCommand;
|
||||
class ChangeFileUrlCommand;
|
||||
class ChangeValuesCommand;
|
||||
class ChangeBindingsCommand;
|
||||
class ChangeIdsCommand;
|
||||
class RemoveInstancesCommand;
|
||||
class RemovePropertiesCommand;
|
||||
|
||||
class CORESHARED_EXPORT NodeInstanceView : public AbstractView
|
||||
class CORESHARED_EXPORT NodeInstanceView : public AbstractView, public NodeInstanceClientInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
friend class NodeInstance;
|
||||
friend class Internal::ObjectNodeInstance;
|
||||
friend class Internal::QmlStateNodeInstance;
|
||||
|
||||
public:
|
||||
typedef QWeakPointer<NodeInstanceView> Pointer;
|
||||
typedef QPair<QWeakPointer<QObject>, QString> ObjectPropertyPair;
|
||||
|
||||
NodeInstanceView(QObject *parent = 0);
|
||||
~NodeInstanceView();
|
||||
@@ -73,7 +80,6 @@ public:
|
||||
void nodeCreated(const ModelNode &createdNode);
|
||||
void nodeAboutToBeRemoved(const ModelNode &removedNode);
|
||||
void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange);
|
||||
void propertiesAdded(const ModelNode &node, const QList<AbstractProperty>& propertyList);
|
||||
void propertiesAboutToBeRemoved(const QList<AbstractProperty>& propertyList);
|
||||
void propertiesRemoved(const QList<AbstractProperty>& propertyList);
|
||||
void variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags propertyChange);
|
||||
@@ -89,79 +95,87 @@ public:
|
||||
|
||||
|
||||
QList<NodeInstance> instances() const;
|
||||
NodeInstance instanceForNode(const ModelNode &node);
|
||||
bool hasInstanceForNode(const ModelNode &node);
|
||||
NodeInstance instanceForNode(const ModelNode &node) const ;
|
||||
bool hasInstanceForNode(const ModelNode &node) const;
|
||||
|
||||
NodeInstance instanceForObject(QObject *object);
|
||||
bool hasInstanceForObject(QObject *object);
|
||||
NodeInstance instanceForId(qint32 id) const;
|
||||
bool hasInstanceForId(qint32 id) const;
|
||||
|
||||
void render(QPainter *painter, const QRectF &target=QRectF(), const QRectF &source=QRect(), Qt::AspectRatioMode aspectRatioMode=Qt::KeepAspectRatio);
|
||||
|
||||
QRectF sceneRect() const;
|
||||
|
||||
void notifyPropertyChange(const ModelNode &modelNode, const QString &propertyName);
|
||||
|
||||
void setBlockStatePropertyChanges(bool block);
|
||||
void setBlockUpdates(bool block);
|
||||
|
||||
NodeInstance activeStateInstance() const;
|
||||
|
||||
void activateState(const NodeInstance &instance);
|
||||
void activateBaseState();
|
||||
|
||||
private slots:
|
||||
void emitParentChanged(QObject *child);
|
||||
void refreshLocalFileProperty(const QString &path);
|
||||
void valuesChanged(const ValuesChangedCommand &command);
|
||||
void pixmapChanged(const PixmapChangedCommand &command);
|
||||
void informationChanged(const InformationChangedCommand &command);
|
||||
|
||||
private: // functions
|
||||
NodeInstance rootNodeInstance() const;
|
||||
|
||||
NodeInstance loadNode(const ModelNode &rootNode, QObject *objectToBeWrapped = 0);
|
||||
void loadModel(Model *model);
|
||||
NodeInstance loadNode(const ModelNode &node);
|
||||
|
||||
void loadNodes(const QList<ModelNode> &nodeList);
|
||||
|
||||
void removeAllInstanceNodeRelationships();
|
||||
|
||||
void removeRecursiveChildRelationship(const ModelNode &removedNode);
|
||||
|
||||
void insertInstanceNodeRelationship(const ModelNode &node, const NodeInstance &instance);
|
||||
void insertInstanceRelationships(const NodeInstance &instance);
|
||||
void removeInstanceNodeRelationship(const ModelNode &node);
|
||||
|
||||
QDeclarativeEngine *engine();
|
||||
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter();
|
||||
void removeInstanceAndSubInstances(const ModelNode &node);
|
||||
|
||||
void setInstancePropertyVariant(const VariantProperty &property);
|
||||
void setInstancePropertyBinding(const BindingProperty &property);
|
||||
void resetInstanceProperty(const AbstractProperty &property);
|
||||
|
||||
void setStateInstance(const NodeInstance &stateInstance);
|
||||
void clearStateInstance();
|
||||
|
||||
QFileSystemWatcher *fileSystemWatcher();
|
||||
NodeInstanceServerInterface *nodeInstanceServer() const;
|
||||
|
||||
void addFilePropertyToFileSystemWatcher(QObject *object, const QString &propertyName, const QString &path);
|
||||
void removeFilePropertyFromFileSystemWatcher(QObject *object, const QString &propertyName, const QString &path);
|
||||
CreateSceneCommand createCreateSceneCommand() const;
|
||||
ClearSceneCommand createClearSceneCommand() const;
|
||||
CreateInstancesCommand createCreateInstancesCommand(const QList<NodeInstance> &instanceList) const;
|
||||
ReparentInstancesCommand createReparentInstancesCommand(const QList<NodeInstance> &instanceList) const;
|
||||
ReparentInstancesCommand createReparentInstancesCommand(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent) const;
|
||||
ChangeFileUrlCommand createChangeFileUrlCommand(const QUrl &fileUrl) const;
|
||||
ChangeValuesCommand createChangeValueCommand(const QList<VariantProperty> &propertyList) const;
|
||||
ChangeBindingsCommand createChangeBindingCommand(const QList<BindingProperty> &propertyList) const;
|
||||
ChangeIdsCommand createChangeIdsCommand(const QList<NodeInstance> &instanceList) const;
|
||||
RemoveInstancesCommand createRemoveInstancesCommand(const QList<ModelNode> &nodeList) const;
|
||||
RemoveInstancesCommand createRemoveInstancesCommand(const ModelNode &node) const;
|
||||
RemovePropertiesCommand createRemovePropertiesCommand(const QList<AbstractProperty> &propertyList) const;
|
||||
|
||||
qint32 generateInstanceId();
|
||||
|
||||
void resetHorizontalAnchors(const ModelNode &node);
|
||||
void resetVerticalAnchors(const ModelNode &node);
|
||||
|
||||
private slots:
|
||||
void restartProcess();
|
||||
|
||||
private: //variables
|
||||
NodeInstance m_rootNodeInstance;
|
||||
NodeInstance m_activeStateInstance;
|
||||
QScopedPointer<QGraphicsView> m_graphicsView;
|
||||
|
||||
QHash<ModelNode, NodeInstance> m_nodeInstanceHash;
|
||||
QHash<QObject*, NodeInstance> m_objectInstanceHash; // This is purely internal. Might contain dangling pointers!
|
||||
QMultiHash<QString, ObjectPropertyPair> m_fileSystemWatcherHash;
|
||||
QWeakPointer<QDeclarativeEngine> m_engine;
|
||||
QWeakPointer<Internal::ChildrenChangeEventFilter> m_childrenChangeEventFilter;
|
||||
QHash<qint32, NodeInstance> m_idInstanceHash; // This is purely internal. Might contain dangling pointers!
|
||||
|
||||
QWeakPointer<QmlModelView> m_qmlModelView;
|
||||
|
||||
QWeakPointer<QFileSystemWatcher> m_fileSystemWatcher;
|
||||
|
||||
bool m_blockStatePropertyChanges;
|
||||
QList<QPair<ModelNode, QString> > m_valuePropertyChangeList;
|
||||
|
||||
QSet<ModelNode> m_renderImageChangeSet;
|
||||
QSet<ModelNode> m_informationChangeSet;
|
||||
|
||||
uint m_blockUpdates;
|
||||
QWeakPointer<NodeInstanceServerInterface> m_nodeInstanceServer;
|
||||
qint32 m_instanceIdCounter;
|
||||
;
|
||||
};
|
||||
|
||||
} // namespace NodeInstanceView
|
||||
} // namespace ProxyNodeInstanceView
|
||||
|
||||
#endif // NODEINSTANCEVIEW_H
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#ifndef PROPERTYABSTRACTCONTAINER_H
|
||||
#define PROPERTYABSTRACTCONTAINER_H
|
||||
|
||||
#include <QDataStream>
|
||||
#include <qmetatype.h>
|
||||
#include <QString>
|
||||
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class PropertyAbstractContainer;
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const PropertyAbstractContainer &container);
|
||||
QDataStream &operator>>(QDataStream &in, PropertyAbstractContainer &container);
|
||||
|
||||
class PropertyAbstractContainer
|
||||
{
|
||||
|
||||
friend QDataStream &operator<<(QDataStream &out, const PropertyAbstractContainer &container);
|
||||
friend QDataStream &operator>>(QDataStream &in, PropertyAbstractContainer &container);
|
||||
public:
|
||||
PropertyAbstractContainer();
|
||||
PropertyAbstractContainer(qint32 instanceId, const QString &name, const QString &dynamicTypeName);
|
||||
|
||||
qint32 instanceId() const;
|
||||
QString name() const;
|
||||
bool isDynamic() const;
|
||||
QString dynamicTypeName() const;
|
||||
|
||||
private:
|
||||
qint32 m_instanceId;
|
||||
QString m_name;
|
||||
QString m_dynamicTypeName;
|
||||
};
|
||||
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::PropertyAbstractContainer);
|
||||
#endif // PROPERTYABSTRACTCONTAINER_H
|
||||
@@ -0,0 +1,38 @@
|
||||
#ifndef PROPERTYBINDINGCONTAINER_H
|
||||
#define PROPERTYBINDINGCONTAINER_H
|
||||
|
||||
#include <QDataStream>
|
||||
#include <qmetatype.h>
|
||||
#include <QString>
|
||||
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class PropertyBindingContainer
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, PropertyBindingContainer &container);
|
||||
|
||||
public:
|
||||
PropertyBindingContainer();
|
||||
PropertyBindingContainer(qint32 instanceId, const QString &name, const QString &expression, const QString &dynamicTypeName);
|
||||
|
||||
qint32 instanceId() const;
|
||||
QString name() const;
|
||||
QString expression() const;
|
||||
bool isDynamic() const;
|
||||
QString dynamicTypeName() const;
|
||||
|
||||
private:
|
||||
qint32 m_instanceId;
|
||||
QString m_name;
|
||||
QString m_expression;
|
||||
QString m_dynamicTypeName;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const PropertyBindingContainer &container);
|
||||
QDataStream &operator>>(QDataStream &in, PropertyBindingContainer &container);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::PropertyBindingContainer);
|
||||
#endif // PROPERTYBINDINGCONTAINER_H
|
||||
@@ -0,0 +1,42 @@
|
||||
#ifndef PROPERTYVALUECONTAINER_H
|
||||
#define PROPERTYVALUECONTAINER_H
|
||||
|
||||
#include <QDataStream>
|
||||
#include <QMetaType>
|
||||
#include <QVariant>
|
||||
#include <QString>
|
||||
|
||||
#include "commondefines.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
|
||||
class PropertyValueContainer
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, PropertyValueContainer &container);
|
||||
|
||||
public:
|
||||
PropertyValueContainer();
|
||||
PropertyValueContainer(qint32 instanceId, const QString &name, const QVariant &value, const QString &dynamicTypeName);
|
||||
|
||||
qint32 instanceId() const;
|
||||
QString name() const;
|
||||
QVariant value() const;
|
||||
bool isDynamic() const;
|
||||
QString dynamicTypeName() const;
|
||||
|
||||
private:
|
||||
qint32 m_instanceId;
|
||||
QString m_name;
|
||||
QVariant m_value;
|
||||
QString m_dynamicTypeName;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const PropertyValueContainer &container);
|
||||
QDataStream &operator>>(QDataStream &in, PropertyValueContainer &container);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::PropertyValueContainer);
|
||||
|
||||
#endif // PROPERTYVALUECONTAINER_H
|
||||
@@ -35,6 +35,8 @@
|
||||
#include "qmlstate.h"
|
||||
#include "qmlchangeset.h"
|
||||
|
||||
#include <nodeinstance.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class QmlItemNode;
|
||||
|
||||
@@ -13,23 +13,15 @@ BehaviorNodeInstance::BehaviorNodeInstance(QObject *object)
|
||||
{
|
||||
}
|
||||
|
||||
BehaviorNodeInstance::Pointer BehaviorNodeInstance::create(const NodeMetaInfo &nodeMetaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
BehaviorNodeInstance::Pointer BehaviorNodeInstance::create(QObject *object)
|
||||
{
|
||||
QObject *object = 0;
|
||||
if (objectToBeWrapped)
|
||||
object = objectToBeWrapped;
|
||||
else
|
||||
object = createObject(nodeMetaInfo, context);
|
||||
|
||||
QDeclarativeBehavior* behavior = qobject_cast<QDeclarativeBehavior*>(object);
|
||||
|
||||
if (behavior == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new BehaviorNodeInstance(behavior));
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
behavior->setEnabled(false);
|
||||
|
||||
@@ -14,7 +14,7 @@ public:
|
||||
|
||||
BehaviorNodeInstance(QObject *object);
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
static Pointer create(QObject *objectToBeWrapped);
|
||||
|
||||
void setPropertyVariant(const QString &name, const QVariant &value);
|
||||
void setPropertyBinding(const QString &name, const QString &expression);
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
#include "changebindingscommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
ChangeBindingsCommand::ChangeBindingsCommand()
|
||||
{
|
||||
}
|
||||
|
||||
ChangeBindingsCommand::ChangeBindingsCommand(const QVector<PropertyBindingContainer> &bindingChangeVector)
|
||||
: m_bindingChangeVector (bindingChangeVector)
|
||||
{
|
||||
}
|
||||
|
||||
QVector<PropertyBindingContainer> ChangeBindingsCommand::bindingChanges() const
|
||||
{
|
||||
return m_bindingChangeVector;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeBindingsCommand &command)
|
||||
{
|
||||
out << command.bindingChanges();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, ChangeBindingsCommand &command)
|
||||
{
|
||||
in >> command.m_bindingChangeVector;
|
||||
|
||||
return in;
|
||||
}
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef CHANGEBINDINGSCOMMAND_H
|
||||
#define CHANGEBINDINGSCOMMAND_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include <QVector>
|
||||
|
||||
#include "propertybindingcontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class ChangeBindingsCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, ChangeBindingsCommand &command);
|
||||
|
||||
public:
|
||||
ChangeBindingsCommand();
|
||||
ChangeBindingsCommand(const QVector<PropertyBindingContainer> &bindingChangeVector);
|
||||
|
||||
QVector<PropertyBindingContainer> bindingChanges() const;
|
||||
|
||||
private:
|
||||
QVector<PropertyBindingContainer> m_bindingChangeVector;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeBindingsCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, ChangeBindingsCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::ChangeBindingsCommand);
|
||||
|
||||
#endif // CHANGEBINDINGSCOMMAND_H
|
||||
@@ -0,0 +1,33 @@
|
||||
#include "changefileurlcommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
ChangeFileUrlCommand::ChangeFileUrlCommand()
|
||||
{
|
||||
}
|
||||
|
||||
ChangeFileUrlCommand::ChangeFileUrlCommand(const QUrl &fileUrl)
|
||||
: m_fileUrl(fileUrl)
|
||||
{
|
||||
}
|
||||
|
||||
QUrl ChangeFileUrlCommand::fileUrl() const
|
||||
{
|
||||
return m_fileUrl;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeFileUrlCommand &command)
|
||||
{
|
||||
out << command.fileUrl();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, ChangeFileUrlCommand &command)
|
||||
{
|
||||
in >> command.m_fileUrl;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,30 @@
|
||||
#ifndef CHANGEFILEURLCOMMAND_H
|
||||
#define CHANGEFILEURLCOMMAND_H
|
||||
|
||||
#include <qmetatype.h>
|
||||
#include <QUrl>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class ChangeFileUrlCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, ChangeFileUrlCommand &command);
|
||||
public:
|
||||
ChangeFileUrlCommand();
|
||||
ChangeFileUrlCommand(const QUrl &fileUrl);
|
||||
|
||||
QUrl fileUrl() const;
|
||||
|
||||
private:
|
||||
QUrl m_fileUrl;
|
||||
};
|
||||
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeFileUrlCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, ChangeFileUrlCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::ChangeFileUrlCommand);
|
||||
|
||||
#endif // CHANGEFILEURLCOMMAND_H
|
||||
@@ -0,0 +1,33 @@
|
||||
#include "changeidscommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
ChangeIdsCommand::ChangeIdsCommand()
|
||||
{
|
||||
}
|
||||
|
||||
ChangeIdsCommand::ChangeIdsCommand(const QVector<IdContainer> &idVector)
|
||||
: m_idVector(idVector)
|
||||
{
|
||||
}
|
||||
|
||||
QVector<IdContainer> ChangeIdsCommand::ids() const
|
||||
{
|
||||
return m_idVector;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeIdsCommand &command)
|
||||
{
|
||||
out << command.ids();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, ChangeIdsCommand &command)
|
||||
{
|
||||
in >> command.m_idVector;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef CHANGEIDSCOMMAND_H
|
||||
#define CHANGEIDSCOMMAND_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include <QVector>
|
||||
|
||||
|
||||
#include "idcontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class ChangeIdsCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, ChangeIdsCommand &command);
|
||||
public:
|
||||
ChangeIdsCommand();
|
||||
ChangeIdsCommand(const QVector<IdContainer> &idVector);
|
||||
|
||||
QVector<IdContainer> ids() const;
|
||||
|
||||
private:
|
||||
QVector<IdContainer> m_idVector;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeIdsCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, ChangeIdsCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::ChangeIdsCommand);
|
||||
|
||||
#endif // CHANGEIDSCOMMAND_H
|
||||
@@ -0,0 +1,34 @@
|
||||
#include "changestatecommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
ChangeStateCommand::ChangeStateCommand()
|
||||
: m_stateInstanceId(-1)
|
||||
{
|
||||
}
|
||||
|
||||
ChangeStateCommand::ChangeStateCommand(qint32 stateInstanceId)
|
||||
: m_stateInstanceId(stateInstanceId)
|
||||
{
|
||||
}
|
||||
|
||||
qint32 ChangeStateCommand::stateInstanceId() const
|
||||
{
|
||||
return m_stateInstanceId;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeStateCommand &command)
|
||||
{
|
||||
out << command.stateInstanceId();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, ChangeStateCommand &command)
|
||||
{
|
||||
in >> command.m_stateInstanceId;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef CHANGESTATECOMMAND_H
|
||||
#define CHANGESTATECOMMAND_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include <QVector>
|
||||
|
||||
#include "propertyvaluecontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class ChangeStateCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, ChangeStateCommand &command);
|
||||
|
||||
public:
|
||||
ChangeStateCommand();
|
||||
ChangeStateCommand(qint32 stateInstanceId);
|
||||
|
||||
qint32 stateInstanceId() const;
|
||||
|
||||
private:
|
||||
qint32 m_stateInstanceId;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeStateCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, ChangeStateCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::ChangeStateCommand);
|
||||
|
||||
#endif // CHANGESTATECOMMAND_H
|
||||
@@ -0,0 +1,33 @@
|
||||
#include "changevaluescommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
ChangeValuesCommand::ChangeValuesCommand()
|
||||
{
|
||||
}
|
||||
|
||||
ChangeValuesCommand::ChangeValuesCommand(const QVector<PropertyValueContainer> &valueChangeVector)
|
||||
: m_valueChangeVector (valueChangeVector)
|
||||
{
|
||||
}
|
||||
|
||||
QVector<PropertyValueContainer> ChangeValuesCommand::valueChanges() const
|
||||
{
|
||||
return m_valueChangeVector;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeValuesCommand &command)
|
||||
{
|
||||
out << command.valueChanges();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, ChangeValuesCommand &command)
|
||||
{
|
||||
in >> command.m_valueChangeVector;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef CHANGEVALUESCOMMAND_H
|
||||
#define CHANGEVALUESCOMMAND_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include <QVector>
|
||||
|
||||
#include "propertyvaluecontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class ChangeValuesCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, ChangeValuesCommand &command);
|
||||
|
||||
public:
|
||||
ChangeValuesCommand();
|
||||
ChangeValuesCommand(const QVector<PropertyValueContainer> &valueChangeVector);
|
||||
|
||||
QVector<PropertyValueContainer> valueChanges() const;
|
||||
|
||||
private:
|
||||
QVector<PropertyValueContainer> m_valueChangeVector;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ChangeValuesCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, ChangeValuesCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::ChangeValuesCommand);
|
||||
|
||||
#endif // CHANGEVALUESCOMMAND_H
|
||||
@@ -0,0 +1,29 @@
|
||||
#include "childrenchangeeventfilter.h"
|
||||
|
||||
#include <QEvent>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
ChildrenChangeEventFilter::ChildrenChangeEventFilter(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool ChildrenChangeEventFilter::eventFilter(QObject * /*object*/, QEvent *event)
|
||||
{
|
||||
switch (event->type()) {
|
||||
case QEvent::ChildAdded:
|
||||
case QEvent::ChildRemoved:
|
||||
{
|
||||
QChildEvent *childEvent = static_cast<QChildEvent*>(event);
|
||||
emit childrenChanged(childEvent->child()); break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
} // namespace Internal
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,27 @@
|
||||
#ifndef CHILDRENCHANGEEVENTFILTER_H
|
||||
#define CHILDRENCHANGEEVENTFILTER_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
class ChildrenChangeEventFilter : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ChildrenChangeEventFilter(QObject *parent);
|
||||
|
||||
|
||||
signals:
|
||||
void childrenChanged(QObject *object);
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *object, QEvent *event);
|
||||
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace QmlDesigner
|
||||
|
||||
#endif // CHILDRENCHANGEEVENTFILTER_H
|
||||
@@ -0,0 +1,19 @@
|
||||
#include "clearscenecommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
ClearSceneCommand::ClearSceneCommand()
|
||||
{
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ClearSceneCommand &/*command*/)
|
||||
{
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, ClearSceneCommand &/*command*/)
|
||||
{
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,21 @@
|
||||
#ifndef CLEARSCENECOMMAND_H
|
||||
#define CLEARSCENECOMMAND_H
|
||||
|
||||
#include <qmetatype.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class ClearSceneCommand
|
||||
{
|
||||
public:
|
||||
ClearSceneCommand();
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ClearSceneCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, ClearSceneCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::ClearSceneCommand);
|
||||
|
||||
#endif // CLEARSCENECOMMAND_H
|
||||
@@ -48,23 +48,15 @@ QDeclarativeComponent *ComponentNodeInstance::component() const
|
||||
return static_cast<QDeclarativeComponent*>(object());
|
||||
}
|
||||
|
||||
ComponentNodeInstance::Pointer ComponentNodeInstance::create(const NodeMetaInfo &/*metaInfo*/, QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
ComponentNodeInstance::Pointer ComponentNodeInstance::create(QObject *object)
|
||||
{
|
||||
QDeclarativeComponent *component = 0;
|
||||
if (objectToBeWrapped)
|
||||
component = qobject_cast<QDeclarativeComponent *>(objectToBeWrapped);
|
||||
else
|
||||
component = new QDeclarativeComponent(context->engine());
|
||||
QDeclarativeComponent *component = component = qobject_cast<QDeclarativeComponent *>(object);
|
||||
|
||||
if (component == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
|
||||
Pointer instance(new ComponentNodeInstance(component));
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
return instance;
|
||||
@@ -77,24 +69,25 @@ bool ComponentNodeInstance::hasContent() const
|
||||
|
||||
void ComponentNodeInstance::setPropertyVariant(const QString &name, const QVariant &value)
|
||||
{
|
||||
if (name == "__component_data") {
|
||||
QByteArray data(value.toByteArray());
|
||||
QByteArray imports;
|
||||
foreach(const Import &import, modelNode().model()->imports()) {
|
||||
imports.append(import.toString(true).toLatin1());
|
||||
}
|
||||
// if (name == "__component_data") {
|
||||
// QByteArray data(value.toByteArray());
|
||||
// QByteArray imports;
|
||||
// foreach(const Import &import, nodeInstanceServer()->imports()) {
|
||||
// imports.append(import.toString(true).toLatin1());
|
||||
// }
|
||||
|
||||
data.prepend(imports);
|
||||
// data.prepend(imports);
|
||||
|
||||
component()->setData(data, nodeInstanceView()->model()->fileUrl());
|
||||
// component()->setData(data, nodeInstanceView()->model()->fileUrl());
|
||||
|
||||
}
|
||||
if (component()->isError()) {
|
||||
qDebug() << value;
|
||||
foreach(const QDeclarativeError &error, component()->errors())
|
||||
qDebug() << error;
|
||||
}
|
||||
// }
|
||||
// if (component()->isError()) {
|
||||
// qDebug() << value;
|
||||
// foreach(const QDeclarativeError &error, component()->errors())
|
||||
// qDebug() << error;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
} // Internal
|
||||
} // QmlDesigner
|
||||
|
||||
@@ -45,7 +45,7 @@ public:
|
||||
typedef QSharedPointer<ComponentNodeInstance> Pointer;
|
||||
typedef QWeakPointer<ComponentNodeInstance> WeakPointer;
|
||||
ComponentNodeInstance(QDeclarativeComponent *component);
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
static Pointer create(QObject *objectToBeWrapped);
|
||||
|
||||
void setPropertyVariant(const QString &name, const QVariant &value);
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
#include "createinstancescommand.h"
|
||||
|
||||
#include <QDataStream>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
CreateInstancesCommand::CreateInstancesCommand()
|
||||
{
|
||||
}
|
||||
|
||||
CreateInstancesCommand::CreateInstancesCommand(const QVector<InstanceContainer> &container)
|
||||
: m_instanceVector(container)
|
||||
{
|
||||
}
|
||||
|
||||
QVector<InstanceContainer> CreateInstancesCommand::instances() const
|
||||
{
|
||||
return m_instanceVector;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const CreateInstancesCommand &command)
|
||||
{
|
||||
out << command.instances();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, CreateInstancesCommand &command)
|
||||
{
|
||||
in >> command.m_instanceVector;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef CREATEINSTANCESCOMMAND_H
|
||||
#define CREATEINSTANCESCOMMAND_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include <QVector>
|
||||
|
||||
#include "instancecontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class CreateInstancesCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, CreateInstancesCommand &command);
|
||||
|
||||
public:
|
||||
CreateInstancesCommand();
|
||||
CreateInstancesCommand(const QVector<InstanceContainer> &container);
|
||||
|
||||
QVector<InstanceContainer> instances() const;
|
||||
|
||||
private:
|
||||
QVector<InstanceContainer> m_instanceVector;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const CreateInstancesCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, CreateInstancesCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::CreateInstancesCommand);
|
||||
|
||||
#endif // CREATEINSTANCESCOMMAND_H
|
||||
@@ -0,0 +1,19 @@
|
||||
#include "createscenecommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
CreateSceneCommand::CreateSceneCommand()
|
||||
{
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const CreateSceneCommand &command)
|
||||
{
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, CreateSceneCommand &command)
|
||||
{
|
||||
return in;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
#ifndef CREATESCENECOMMAND_H
|
||||
#define CREATESCENECOMMAND_H
|
||||
|
||||
#include <qmetatype.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class CreateSceneCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, CreateSceneCommand &command);
|
||||
|
||||
public:
|
||||
CreateSceneCommand();
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const CreateSceneCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, CreateSceneCommand &command);
|
||||
|
||||
}
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::CreateSceneCommand);
|
||||
|
||||
#endif // CREATESCENECOMMAND_H
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
#include "declarativedesignercommunicationinterface.h"
|
||||
|
||||
DeclarativeDesignerCommunicationInterface::DeclarativeDesignerCommunicationInterface(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
#ifndef DECLARATIVEDESIGNERCOMMUNICATIONINTERFACE_H
|
||||
#define DECLARATIVEDESIGNERCOMMUNICATIONINTERFACE_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class DeclarativeDesignerCommunicationInterface : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DeclarativeDesignerCommunicationInterface(QObject *parent = 0);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
};
|
||||
|
||||
#endif // DECLARATIVEDESIGNERCOMMUNICATIONINTERFACE_H
|
||||
@@ -51,11 +51,6 @@ void DummyNodeInstance::paint(QPainter * /*painter*/) const
|
||||
{
|
||||
}
|
||||
|
||||
bool DummyNodeInstance::isTopLevel() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QRectF DummyNodeInstance::boundingRect() const
|
||||
{
|
||||
return QRectF();
|
||||
|
||||
@@ -47,8 +47,6 @@ public:
|
||||
|
||||
void paint(QPainter *painter) const;
|
||||
|
||||
bool isTopLevel() const;
|
||||
|
||||
QRectF boundingRect() const;
|
||||
QPointF position() const;
|
||||
QSizeF size() const;
|
||||
|
||||
@@ -40,11 +40,9 @@
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
GraphicsObjectNodeInstance::GraphicsObjectNodeInstance(QGraphicsObject *graphicsObject, bool hasContent)
|
||||
GraphicsObjectNodeInstance::GraphicsObjectNodeInstance(QGraphicsObject *graphicsObject)
|
||||
: ObjectNodeInstance(graphicsObject),
|
||||
m_hasContent(hasContent),
|
||||
m_isMovable(true),
|
||||
m_renderPixmapIsDirty(true)
|
||||
m_isMovable(true)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -62,6 +60,11 @@ bool GraphicsObjectNodeInstance::hasContent() const
|
||||
return m_hasContent;
|
||||
}
|
||||
|
||||
void GraphicsObjectNodeInstance::setHasContent(bool hasContent)
|
||||
{
|
||||
m_hasContent = hasContent;
|
||||
}
|
||||
|
||||
QPointF GraphicsObjectNodeInstance::position() const
|
||||
{
|
||||
return graphicsObject()->pos();
|
||||
@@ -74,10 +77,10 @@ QSizeF GraphicsObjectNodeInstance::size() const
|
||||
|
||||
QTransform GraphicsObjectNodeInstance::transform() const
|
||||
{
|
||||
if (!nodeInstanceView()->hasInstanceForNode(modelNode()))
|
||||
if (!nodeInstanceServer()->hasInstanceForObject(object()))
|
||||
return sceneTransform();
|
||||
|
||||
NodeInstance nodeInstanceParent = nodeInstanceView()->instanceForNode(modelNode()).parent();
|
||||
ServerNodeInstance nodeInstanceParent = nodeInstanceServer()->instanceForObject(object()).parent();
|
||||
|
||||
if (!nodeInstanceParent.isValid())
|
||||
return sceneTransform();
|
||||
@@ -142,12 +145,6 @@ QRectF GraphicsObjectNodeInstance::boundingRect() const
|
||||
return graphicsObject()->boundingRect();
|
||||
}
|
||||
|
||||
bool GraphicsObjectNodeInstance::isTopLevel() const
|
||||
{
|
||||
Q_ASSERT(graphicsObject());
|
||||
return !graphicsObject()->parentItem();
|
||||
}
|
||||
|
||||
bool GraphicsObjectNodeInstance::isGraphicsObject() const
|
||||
{
|
||||
return true;
|
||||
@@ -158,6 +155,11 @@ void GraphicsObjectNodeInstance::setPropertyVariant(const QString &name, const Q
|
||||
ObjectNodeInstance::setPropertyVariant(name, value);
|
||||
}
|
||||
|
||||
void GraphicsObjectNodeInstance::setPropertyBinding(const QString &name, const QString &expression)
|
||||
{
|
||||
ObjectNodeInstance::setPropertyBinding(name, expression);
|
||||
}
|
||||
|
||||
QVariant GraphicsObjectNodeInstance::property(const QString &name) const
|
||||
{
|
||||
return ObjectNodeInstance::property(name);
|
||||
@@ -174,21 +176,19 @@ void initOption(QGraphicsItem *item, QStyleOptionGraphicsItem *option, const QTr
|
||||
privateItem->initStyleOption(option, transform, QRegion());
|
||||
}
|
||||
|
||||
void GraphicsObjectNodeInstance::renderPixmap()
|
||||
QImage GraphicsObjectNodeInstance::renderImage() const
|
||||
{
|
||||
QRectF boundingRect = graphicsObject()->boundingRect();
|
||||
QSize boundingSize = boundingRect.size().toSize();
|
||||
|
||||
if (m_renderPixmap.size() != boundingSize) {
|
||||
m_renderPixmap = QPixmap(boundingSize);
|
||||
}
|
||||
QImage image(boundingSize, QImage::Format_ARGB32);
|
||||
|
||||
if (m_renderPixmap.isNull())
|
||||
return;
|
||||
if (image.isNull())
|
||||
return image;
|
||||
|
||||
m_renderPixmap.fill(Qt::transparent);
|
||||
image.fill(Qt::transparent);
|
||||
|
||||
QPainter painter(&m_renderPixmap);
|
||||
QPainter painter(&image);
|
||||
painter.translate(-boundingRect.topLeft());
|
||||
|
||||
if (hasContent()) {
|
||||
@@ -200,13 +200,15 @@ void GraphicsObjectNodeInstance::renderPixmap()
|
||||
|
||||
foreach(QGraphicsItem *graphicsItem, graphicsObject()->childItems())
|
||||
paintRecursively(graphicsItem, &painter);
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
void GraphicsObjectNodeInstance::paintRecursively(QGraphicsItem *graphicsItem, QPainter *painter) const
|
||||
{
|
||||
QGraphicsObject *graphicsObject = graphicsItem->toGraphicsObject();
|
||||
if (graphicsObject) {
|
||||
if (nodeInstanceView()->hasInstanceForObject(graphicsObject))
|
||||
if (nodeInstanceServer()->hasInstanceForObject(graphicsObject))
|
||||
return; //we already keep track of this object elsewhere
|
||||
}
|
||||
|
||||
@@ -224,31 +226,6 @@ void GraphicsObjectNodeInstance::paintRecursively(QGraphicsItem *graphicsItem, Q
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsObjectNodeInstance::paint(QPainter *painter)
|
||||
{
|
||||
if (graphicsObject()) {
|
||||
if (m_renderPixmapIsDirty)
|
||||
renderPixmap();
|
||||
if (!m_renderPixmap.isNull())
|
||||
painter->drawPixmap(graphicsObject()->boundingRect().topLeft(), m_renderPixmap);
|
||||
}
|
||||
}
|
||||
|
||||
QPair<QGraphicsObject*, bool> GraphicsObjectNodeInstance::createGraphicsObject(const NodeMetaInfo &metaInfo, QDeclarativeContext *context)
|
||||
{
|
||||
QObject *object = ObjectNodeInstance::createObject(metaInfo, context);
|
||||
QGraphicsObject *graphicsObject = qobject_cast<QGraphicsObject*>(object);
|
||||
|
||||
if (graphicsObject == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
// graphicsObject->setCacheMode(QGraphicsItem::ItemCoordinateCache);
|
||||
bool hasContent = !graphicsObject->flags().testFlag(QGraphicsItem::ItemHasNoContents) || metaInfo.isComponent();
|
||||
graphicsObject->setFlag(QGraphicsItem::ItemHasNoContents, false);
|
||||
|
||||
return qMakePair(graphicsObject, hasContent);
|
||||
}
|
||||
|
||||
void GraphicsObjectNodeInstance::paintUpdate()
|
||||
{
|
||||
graphicsObject()->update();
|
||||
@@ -264,11 +241,5 @@ void GraphicsObjectNodeInstance::setMovable(bool movable)
|
||||
m_isMovable = movable;
|
||||
}
|
||||
|
||||
void GraphicsObjectNodeInstance::renderPixmapNextPaint()
|
||||
{
|
||||
if (graphicsObject() && QGraphicsItemPrivate::get(graphicsObject())->dirty /*|| QGraphicsItemPrivate::get(graphicsObject())->dirtyChildren*/)
|
||||
m_renderPixmapIsDirty = true;
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace QmlDesigner
|
||||
|
||||
@@ -42,11 +42,9 @@ namespace Internal {
|
||||
class GraphicsObjectNodeInstance : public ObjectNodeInstance
|
||||
{
|
||||
public:
|
||||
GraphicsObjectNodeInstance(QGraphicsObject *graphicsObject, bool hasContent);
|
||||
GraphicsObjectNodeInstance(QGraphicsObject *graphicsObject);
|
||||
QImage renderImage() const;
|
||||
|
||||
void paint(QPainter *painter);
|
||||
|
||||
bool isTopLevel() const;
|
||||
bool isGraphicsObject() const;
|
||||
|
||||
QRectF boundingRect() const;
|
||||
@@ -68,27 +66,26 @@ public:
|
||||
bool equalGraphicsItem(QGraphicsItem *item) const;
|
||||
|
||||
void setPropertyVariant(const QString &name, const QVariant &value);
|
||||
void setPropertyBinding(const QString &name, const QString &expression);
|
||||
QVariant property(const QString &name) const;
|
||||
|
||||
bool hasContent() const;
|
||||
|
||||
|
||||
void paintUpdate();
|
||||
|
||||
bool isMovable() const;
|
||||
void setMovable(bool movable);
|
||||
|
||||
void renderPixmapNextPaint();
|
||||
|
||||
protected:
|
||||
void renderPixmap();
|
||||
void setHasContent(bool hasContent);
|
||||
QGraphicsObject *graphicsObject() const;
|
||||
void paintRecursively(QGraphicsItem *graphicsItem, QPainter *painter) const;
|
||||
static QPair<QGraphicsObject*, bool> createGraphicsObject(const NodeMetaInfo &metaInfo, QDeclarativeContext *context);
|
||||
|
||||
private: // variables
|
||||
bool m_hasContent;
|
||||
bool m_isMovable;
|
||||
QPixmap m_renderPixmap;
|
||||
bool m_renderPixmapIsDirty;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "graphicsscenenodeinstance.h"
|
||||
|
||||
#include "graphicsviewnodeinstance.h"
|
||||
|
||||
#include <invalidnodeinstanceexception.h>
|
||||
#include <propertymetainfo.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
GraphicsSceneNodeInstance::GraphicsSceneNodeInstance(QGraphicsScene *scene)
|
||||
:ObjectNodeInstance(scene)
|
||||
{
|
||||
}
|
||||
|
||||
GraphicsSceneNodeInstance::~GraphicsSceneNodeInstance()
|
||||
{
|
||||
}
|
||||
|
||||
GraphicsSceneNodeInstance::Pointer GraphicsSceneNodeInstance::create(const NodeMetaInfo &nodeMetaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
{
|
||||
QObject *object = 0;
|
||||
if (objectToBeWrapped)
|
||||
object = objectToBeWrapped;
|
||||
else
|
||||
object = createObject(nodeMetaInfo, context);
|
||||
|
||||
QGraphicsScene* scene = qobject_cast<QGraphicsScene*>(object);
|
||||
if (scene == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new GraphicsSceneNodeInstance(scene));
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
void GraphicsSceneNodeInstance::paint(QPainter *) const
|
||||
{
|
||||
Q_ASSERT(graphicsScene());
|
||||
}
|
||||
|
||||
bool GraphicsSceneNodeInstance::isTopLevel() const
|
||||
{
|
||||
Q_ASSERT(graphicsScene());
|
||||
return graphicsScene()->views().isEmpty();
|
||||
}
|
||||
|
||||
|
||||
void GraphicsSceneNodeInstance::addItem(QGraphicsItem *item)
|
||||
{
|
||||
graphicsScene()->addItem(item);
|
||||
}
|
||||
|
||||
bool GraphicsSceneNodeInstance::isGraphicsScene() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
QRectF GraphicsSceneNodeInstance::boundingRect() const
|
||||
{
|
||||
return graphicsScene()->sceneRect();
|
||||
}
|
||||
|
||||
QPointF GraphicsSceneNodeInstance::position() const
|
||||
{
|
||||
return graphicsScene()->sceneRect().topLeft();
|
||||
}
|
||||
|
||||
QSizeF GraphicsSceneNodeInstance::size() const
|
||||
{
|
||||
return graphicsScene()->sceneRect().size();
|
||||
}
|
||||
|
||||
QGraphicsScene *GraphicsSceneNodeInstance::graphicsScene() const
|
||||
{
|
||||
Q_ASSERT(qobject_cast<QGraphicsScene*>(object()));
|
||||
return static_cast<QGraphicsScene*>(object());
|
||||
}
|
||||
|
||||
bool GraphicsSceneNodeInstance::isVisible() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void GraphicsSceneNodeInstance::setVisible(bool /*isVisible*/)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef GRAPHICSSCENENODEINSTANCE_H
|
||||
#define GRAPHICSSCENENODEINSTANCE_H
|
||||
|
||||
#include "objectnodeinstance.h"
|
||||
#include <QGraphicsScene>
|
||||
#include <QWeakPointer>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
class GraphicsSceneNodeInstance : public ObjectNodeInstance
|
||||
{
|
||||
public:
|
||||
typedef QSharedPointer<GraphicsSceneNodeInstance> Pointer;
|
||||
typedef QWeakPointer<GraphicsSceneNodeInstance> WeakPointer;
|
||||
|
||||
~GraphicsSceneNodeInstance();
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
|
||||
void paint(QPainter *painter) const;
|
||||
|
||||
bool isTopLevel() const;
|
||||
|
||||
void addItem(QGraphicsItem *item);
|
||||
|
||||
bool isGraphicsScene() const;
|
||||
|
||||
QRectF boundingRect() const;
|
||||
QPointF position() const;
|
||||
QSizeF size() const;
|
||||
|
||||
|
||||
bool isVisible() const;
|
||||
void setVisible(bool isVisible);
|
||||
|
||||
protected:
|
||||
GraphicsSceneNodeInstance(QGraphicsScene *scene);
|
||||
QGraphicsScene *graphicsScene() const;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
#endif // GRAPHICSSCENENODEINSTANCE_H
|
||||
@@ -1,108 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "graphicsviewnodeinstance.h"
|
||||
|
||||
#include <QDeclarativeEngine>
|
||||
#include <invalidnodeinstanceexception.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
GraphicsViewNodeInstance::GraphicsViewNodeInstance(QGraphicsView *view)
|
||||
: WidgetNodeInstance(view)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
GraphicsViewNodeInstance::Pointer GraphicsViewNodeInstance::create(const NodeMetaInfo &nodeMetaInfo,
|
||||
QDeclarativeContext *context,
|
||||
QObject *objectToBeWrapped)
|
||||
{
|
||||
QObject *object = 0;
|
||||
if (objectToBeWrapped)
|
||||
object = objectToBeWrapped;
|
||||
else
|
||||
object = createObject(nodeMetaInfo, context);
|
||||
|
||||
QGraphicsView* view = qobject_cast<QGraphicsView*>(object);
|
||||
if (view == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new GraphicsViewNodeInstance(view));
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
QGraphicsView* GraphicsViewNodeInstance::graphicsView() const
|
||||
{
|
||||
QGraphicsView* view = qobject_cast<QGraphicsView*>(widget());
|
||||
Q_ASSERT(view);
|
||||
return view;
|
||||
}
|
||||
|
||||
void GraphicsViewNodeInstance::setScene(QGraphicsScene *scene)
|
||||
{
|
||||
graphicsView()->setScene(scene);
|
||||
}
|
||||
|
||||
bool GraphicsViewNodeInstance::isGraphicsView() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
QSizeF GraphicsViewNodeInstance::size() const
|
||||
{
|
||||
return graphicsView()->scene()->itemsBoundingRect().size();
|
||||
}
|
||||
|
||||
QTransform GraphicsViewNodeInstance::transform() const
|
||||
{
|
||||
return graphicsView()->transform();
|
||||
}
|
||||
|
||||
void GraphicsViewNodeInstance::paint(QPainter *painter) const
|
||||
{
|
||||
painter->save();
|
||||
painter->setRenderHint(QPainter::Antialiasing, true);
|
||||
painter->setRenderHint(QPainter::TextAntialiasing, true);
|
||||
painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
|
||||
painter->setRenderHint(QPainter::HighQualityAntialiasing, true);
|
||||
painter->setRenderHint(QPainter::NonCosmeticDefaultPen, true);
|
||||
graphicsView()->render(painter, QRectF(), graphicsView()->scene()->itemsBoundingRect().toRect());
|
||||
painter->restore();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef GRAPHICSVIEWNODEINSTANCE_H
|
||||
#define GRAPHICSVIEWNODEINSTANCE_H
|
||||
|
||||
#include <QWeakPointer>
|
||||
#include <QGraphicsView>
|
||||
|
||||
#include "widgetnodeinstance.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
class GraphicsViewNodeInstance : public WidgetNodeInstance
|
||||
{
|
||||
public:
|
||||
typedef QSharedPointer<GraphicsViewNodeInstance> Pointer;
|
||||
typedef QWeakPointer<GraphicsViewNodeInstance> WeakPointer;
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
|
||||
void setScene(QGraphicsScene *scene);
|
||||
|
||||
bool isGraphicsView() const;
|
||||
|
||||
QTransform transform() const;
|
||||
QSizeF size() const;
|
||||
|
||||
|
||||
void paint(QPainter *painter) const;
|
||||
|
||||
protected:
|
||||
GraphicsViewNodeInstance(QGraphicsView *view);
|
||||
|
||||
QGraphicsView* graphicsView() const;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
#endif // GRAPHICSVIEWNODEINSTANCE_H
|
||||
@@ -1,183 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "graphicswidgetnodeinstance.h"
|
||||
#include "graphicsscenenodeinstance.h"
|
||||
|
||||
#include "objectnodeinstance.h"
|
||||
|
||||
#include <invalidnodeinstanceexception.h>
|
||||
#include <propertymetainfo.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
GraphicsWidgetNodeInstance::GraphicsWidgetNodeInstance(QGraphicsWidget *widget)
|
||||
: ObjectNodeInstance(widget)
|
||||
{
|
||||
}
|
||||
|
||||
GraphicsWidgetNodeInstance::~GraphicsWidgetNodeInstance()
|
||||
{
|
||||
}
|
||||
|
||||
GraphicsWidgetNodeInstance::Pointer GraphicsWidgetNodeInstance::create(const NodeMetaInfo &nodeMetaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
{
|
||||
QObject *object = 0;
|
||||
if (objectToBeWrapped)
|
||||
object = objectToBeWrapped;
|
||||
else
|
||||
object = createObject(nodeMetaInfo, context);
|
||||
|
||||
QGraphicsWidget* graphicsWidget = qobject_cast<QGraphicsWidget*>(object);
|
||||
if (graphicsWidget == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new GraphicsWidgetNodeInstance(graphicsWidget));
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
void GraphicsWidgetNodeInstance::paint(QPainter *painter) const
|
||||
{
|
||||
graphicsWidget()->show();
|
||||
graphicsWidget()->paint(painter, 0);
|
||||
|
||||
paintChildren(painter, graphicsWidget());
|
||||
}
|
||||
|
||||
bool GraphicsWidgetNodeInstance::isTopLevel() const
|
||||
{
|
||||
return !graphicsWidget()->parentItem();
|
||||
}
|
||||
|
||||
|
||||
bool isChildNode(QGraphicsItem *item)
|
||||
{
|
||||
// there should be a better implementation
|
||||
if (qgraphicsitem_cast<QGraphicsWidget*>(item))
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
void GraphicsWidgetNodeInstance::paintChildren(QPainter *painter, QGraphicsItem *item) const
|
||||
{
|
||||
foreach (QGraphicsItem *childItem, item->childItems()) {
|
||||
if (!isChildNode(childItem)) {
|
||||
painter->save();
|
||||
painter->setTransform(item->transform(), true);
|
||||
item->paint(painter, 0);
|
||||
paintChildren(painter, childItem);
|
||||
painter->restore();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsWidgetNodeInstance::setParentItem(QGraphicsItem *item)
|
||||
{
|
||||
graphicsWidget()->setParentItem(item);
|
||||
}
|
||||
|
||||
QGraphicsWidget* GraphicsWidgetNodeInstance::graphicsWidget() const
|
||||
{
|
||||
return static_cast<QGraphicsWidget*>(object());
|
||||
}
|
||||
|
||||
bool GraphicsWidgetNodeInstance::isGraphicsWidget() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GraphicsWidgetNodeInstance::isGraphicsItem(QGraphicsItem *item) const
|
||||
{
|
||||
return graphicsWidget() == item;
|
||||
}
|
||||
|
||||
QRectF GraphicsWidgetNodeInstance::boundingRect() const
|
||||
{
|
||||
return graphicsWidget()->boundingRect();
|
||||
}
|
||||
|
||||
void GraphicsWidgetNodeInstance::setPropertyVariant(const QString &name, const QVariant &value)
|
||||
{
|
||||
if (name == "x")
|
||||
graphicsWidget()->setPos(value.toDouble(), graphicsWidget()->y());
|
||||
else if (name == "y")
|
||||
graphicsWidget()->setPos(graphicsWidget()->x(), value.toDouble());
|
||||
else if (name == "width")
|
||||
graphicsWidget()->resize(value.toDouble(), graphicsWidget()->size().height());
|
||||
else if (name == "height")
|
||||
graphicsWidget()->resize(graphicsWidget()->size().width(), value.toDouble());
|
||||
else
|
||||
graphicsWidget()->setProperty(name.toLatin1(), value);
|
||||
}
|
||||
|
||||
QVariant GraphicsWidgetNodeInstance::property(const QString &name) const
|
||||
{
|
||||
return graphicsWidget()->property(name.toLatin1());
|
||||
}
|
||||
|
||||
bool GraphicsWidgetNodeInstance::isVisible() const
|
||||
{
|
||||
return graphicsWidget()->isVisible();
|
||||
}
|
||||
|
||||
void GraphicsWidgetNodeInstance::setVisible(bool isVisible)
|
||||
{
|
||||
graphicsWidget()->setVisible(isVisible);
|
||||
}
|
||||
|
||||
QPointF GraphicsWidgetNodeInstance::position() const
|
||||
{
|
||||
return graphicsWidget()->pos();
|
||||
}
|
||||
|
||||
QSizeF GraphicsWidgetNodeInstance::size() const
|
||||
{
|
||||
return graphicsWidget()->size();
|
||||
}
|
||||
|
||||
QTransform GraphicsWidgetNodeInstance::transform() const
|
||||
{
|
||||
return graphicsWidget()->transform();
|
||||
}
|
||||
|
||||
double GraphicsWidgetNodeInstance::opacity() const
|
||||
{
|
||||
return graphicsWidget()->opacity();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef GRAPHICSWIDGETNODEINSTANCE_H
|
||||
#define GRAPHICSWIDGETNODEINSTANCE_H
|
||||
|
||||
#include <QWeakPointer>
|
||||
#include <QGraphicsWidget>
|
||||
|
||||
#include "objectnodeinstance.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
class GraphicsWidgetNodeInstance : public ObjectNodeInstance
|
||||
{
|
||||
public:
|
||||
typedef QSharedPointer<GraphicsWidgetNodeInstance> Pointer;
|
||||
typedef QWeakPointer<GraphicsWidgetNodeInstance> WeakPointer;
|
||||
|
||||
~GraphicsWidgetNodeInstance();
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
|
||||
void paint(QPainter *painter) const;
|
||||
|
||||
bool isTopLevel() const;
|
||||
|
||||
bool isGraphicsWidget() const;
|
||||
bool isGraphicsItem(QGraphicsItem *item) const;
|
||||
|
||||
QRectF boundingRect() const;
|
||||
QPointF position() const;
|
||||
QSizeF size() const;
|
||||
QTransform transform() const;
|
||||
double opacity() const;
|
||||
|
||||
void setPropertyVariant(const QString &name, const QVariant &value);
|
||||
QVariant property(const QString &name) const;
|
||||
|
||||
bool isVisible() const;
|
||||
void setVisible(bool isVisible);
|
||||
|
||||
protected:
|
||||
GraphicsWidgetNodeInstance(QGraphicsWidget *widget);
|
||||
void paintChildren(QPainter *painter, QGraphicsItem *item) const;
|
||||
void setParentItem(QGraphicsItem *item);
|
||||
QGraphicsWidget* graphicsWidget() const;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
#endif // GRAPHICSWIDGETNODEINSTANCE_H
|
||||
@@ -0,0 +1,41 @@
|
||||
#include "idcontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
IdContainer::IdContainer()
|
||||
: m_instanceId(-1)
|
||||
{
|
||||
}
|
||||
|
||||
IdContainer::IdContainer(qint32 instanceId, const QString &id)
|
||||
: m_instanceId(instanceId),
|
||||
m_id(id)
|
||||
{
|
||||
}
|
||||
|
||||
qint32 IdContainer::instanceId() const
|
||||
{
|
||||
return m_instanceId;
|
||||
}
|
||||
|
||||
QString IdContainer::id() const
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const IdContainer &container)
|
||||
{
|
||||
out << container.instanceId();
|
||||
out << container.id();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, IdContainer &container)
|
||||
{
|
||||
in >> container.m_instanceId;
|
||||
in >> container.m_id;
|
||||
|
||||
return in;
|
||||
}
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,34 @@
|
||||
#ifndef IDCONTAINER_H
|
||||
#define IDCONTAINER_H
|
||||
|
||||
#include <QDataStream>
|
||||
#include <qmetatype.h>
|
||||
#include <QString>
|
||||
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class IdContainer
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, IdContainer &container);
|
||||
|
||||
public:
|
||||
IdContainer();
|
||||
IdContainer(qint32 instanceId, const QString &id);
|
||||
|
||||
qint32 instanceId() const;
|
||||
QString id() const;
|
||||
|
||||
private:
|
||||
qint32 m_instanceId;
|
||||
QString m_id;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const IdContainer &container);
|
||||
QDataStream &operator>>(QDataStream &in, IdContainer &container);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::IdContainer);
|
||||
|
||||
#endif // IDCONTAINER_H
|
||||
@@ -0,0 +1,37 @@
|
||||
#include "informationchangedcommand.h"
|
||||
|
||||
#include <QMetaType>
|
||||
|
||||
#include "propertyvaluecontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
InformationChangedCommand::InformationChangedCommand()
|
||||
{
|
||||
}
|
||||
|
||||
InformationChangedCommand::InformationChangedCommand(const QVector<InformationContainer> &informationVector)
|
||||
: m_informationVector(informationVector)
|
||||
{
|
||||
}
|
||||
|
||||
QVector<InformationContainer> InformationChangedCommand::informations() const
|
||||
{
|
||||
return m_informationVector;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const InformationChangedCommand &command)
|
||||
{
|
||||
out << command.informations();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, InformationChangedCommand &command)
|
||||
{
|
||||
in >> command.m_informationVector;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef INFORMATIONCHANGEDCOMMAND_H
|
||||
#define INFORMATIONCHANGEDCOMMAND_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include <QVector>
|
||||
|
||||
#include "informationcontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class InformationChangedCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, InformationChangedCommand &command);
|
||||
|
||||
public:
|
||||
InformationChangedCommand();
|
||||
InformationChangedCommand(const QVector<InformationContainer> &informationVector);
|
||||
|
||||
QVector<InformationContainer> informations() const;
|
||||
|
||||
private:
|
||||
QVector<InformationContainer> m_informationVector;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const InformationChangedCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, InformationChangedCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::InformationChangedCommand);
|
||||
|
||||
#endif // INFORMATIONCHANGEDCOMMAND_H
|
||||
@@ -0,0 +1,72 @@
|
||||
#include "informationcontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
InformationContainer::InformationContainer()
|
||||
: m_instanceId(-1),
|
||||
m_name(NoName)
|
||||
{
|
||||
}
|
||||
|
||||
InformationContainer::InformationContainer(qint32 instanceId,
|
||||
InformationName name,
|
||||
const QVariant &information,
|
||||
const QVariant &secondInformation,
|
||||
const QVariant &thirdInformation)
|
||||
: m_instanceId(instanceId),
|
||||
m_name(name),
|
||||
m_information(information),
|
||||
m_secondInformation(secondInformation),
|
||||
m_thirdInformation(thirdInformation)
|
||||
{
|
||||
}
|
||||
|
||||
qint32 InformationContainer::instanceId() const
|
||||
{
|
||||
return m_instanceId;
|
||||
}
|
||||
|
||||
InformationName InformationContainer::name() const
|
||||
{
|
||||
return InformationName(m_name);
|
||||
}
|
||||
|
||||
QVariant InformationContainer::information() const
|
||||
{
|
||||
return m_information;
|
||||
}
|
||||
|
||||
QVariant InformationContainer::secondInformation() const
|
||||
{
|
||||
return m_secondInformation;
|
||||
}
|
||||
|
||||
QVariant InformationContainer::thirdInformation() const
|
||||
{
|
||||
return m_thirdInformation;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const InformationContainer &container)
|
||||
{
|
||||
out << container.instanceId();//
|
||||
out << container.m_name;
|
||||
out << container.information();
|
||||
out << container.secondInformation();
|
||||
out << container.thirdInformation();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, InformationContainer &container)
|
||||
{
|
||||
|
||||
in >> container.m_instanceId;
|
||||
in >> container.m_name;
|
||||
in >> container.m_information;
|
||||
in >> container.m_secondInformation;
|
||||
in >> container.m_thirdInformation;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,47 @@
|
||||
#ifndef INFORMATIONCONTAINER_H
|
||||
#define INFORMATIONCONTAINER_H
|
||||
|
||||
#include <QDataStream>
|
||||
#include <QMetaType>
|
||||
#include <QVariant>
|
||||
#include <QString>
|
||||
|
||||
#include "commondefines.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class InformationContainer
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, InformationContainer &container);
|
||||
friend QDataStream &operator<<(QDataStream &out, const InformationContainer &container);
|
||||
|
||||
public:
|
||||
InformationContainer();
|
||||
InformationContainer(qint32 instanceId,
|
||||
InformationName name,
|
||||
const QVariant &information,
|
||||
const QVariant &secondInformation = QVariant(),
|
||||
const QVariant &thirdInformation = QVariant());
|
||||
|
||||
qint32 instanceId() const;
|
||||
InformationName name() const;
|
||||
QVariant information() const;
|
||||
QVariant secondInformation() const;
|
||||
QVariant thirdInformation() const;
|
||||
|
||||
private:
|
||||
qint32 m_instanceId;
|
||||
qint32 m_name;
|
||||
QVariant m_information;
|
||||
QVariant m_secondInformation;
|
||||
QVariant m_thirdInformation;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const InformationContainer &container);
|
||||
QDataStream &operator>>(QDataStream &in, InformationContainer &container);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::InformationContainer);
|
||||
|
||||
#endif // INFORMATIONCONTAINER_H
|
||||
@@ -0,0 +1,62 @@
|
||||
#include "instancecontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
InstanceContainer::InstanceContainer()
|
||||
: m_instanceId(-1), m_majorNumber(-1), m_minorNumber(-1)
|
||||
{
|
||||
}
|
||||
|
||||
InstanceContainer::InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath)
|
||||
: m_instanceId(instanceId), m_type(type), m_majorNumber(majorNumber), m_minorNumber(minorNumber), m_componentPath(componentPath)
|
||||
{
|
||||
}
|
||||
|
||||
qint32 InstanceContainer::instanceId() const
|
||||
{
|
||||
return m_instanceId;
|
||||
}
|
||||
|
||||
QString InstanceContainer::type() const
|
||||
{
|
||||
return m_type;
|
||||
}
|
||||
|
||||
int InstanceContainer::majorNumber() const
|
||||
{
|
||||
return m_majorNumber;
|
||||
}
|
||||
|
||||
int InstanceContainer::minorNumber() const
|
||||
{
|
||||
return m_minorNumber;
|
||||
}
|
||||
|
||||
QString InstanceContainer::componentPath() const
|
||||
{
|
||||
return m_componentPath;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
|
||||
{
|
||||
out << container.instanceId();
|
||||
out << container.type();
|
||||
out << container.majorNumber();
|
||||
out << container.minorNumber();
|
||||
out << container.componentPath();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, InstanceContainer &container)
|
||||
{
|
||||
in >> container.m_instanceId;
|
||||
in >> container.m_type;
|
||||
in >> container.m_majorNumber;
|
||||
in >> container.m_minorNumber;
|
||||
in >> container.m_componentPath;
|
||||
|
||||
return in;
|
||||
}
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,39 @@
|
||||
#ifndef INSTANCECONTAINER_H
|
||||
#define INSTANCECONTAINER_H
|
||||
|
||||
#include <qmetatype.h>
|
||||
#include <QString>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class InstanceContainer;
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const InstanceContainer &container);
|
||||
QDataStream &operator>>(QDataStream &in, InstanceContainer &container);
|
||||
|
||||
class InstanceContainer
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, InstanceContainer &container);
|
||||
|
||||
public:
|
||||
InstanceContainer();
|
||||
InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath);
|
||||
|
||||
qint32 instanceId() const;
|
||||
QString type() const;
|
||||
int majorNumber() const;
|
||||
int minorNumber() const;
|
||||
QString componentPath() const;
|
||||
|
||||
private:
|
||||
qint32 m_instanceId;
|
||||
QString m_type;
|
||||
int m_majorNumber;
|
||||
int m_minorNumber;
|
||||
QString m_componentPath;
|
||||
};
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::InstanceContainer);
|
||||
#endif // INSTANCECONTAINER_H
|
||||
@@ -0,0 +1,81 @@
|
||||
INCLUDEPATH += $$PWD/
|
||||
INCLUDEPATH += $$PWD/../include
|
||||
|
||||
|
||||
HEADERS += $$PWD/behaviornodeinstance.h
|
||||
HEADERS += $$PWD/changebindingscommand.h
|
||||
HEADERS += $$PWD/changefileurlcommand.h
|
||||
HEADERS += $$PWD/changeidscommand.h
|
||||
HEADERS += $$PWD/changestatecommand.h
|
||||
HEADERS += $$PWD/changevaluescommand.h
|
||||
HEADERS += $$PWD/childrenchangeeventfilter.h
|
||||
HEADERS += $$PWD/clearscenecommand.h
|
||||
HEADERS += $$PWD/componentnodeinstance.h
|
||||
HEADERS += $$PWD/createinstancescommand.h
|
||||
HEADERS += $$PWD/createscenecommand.h
|
||||
HEADERS += $$PWD/declarativedesignercommunicationinterface.h
|
||||
HEADERS += $$PWD/dummynodeinstance.h
|
||||
HEADERS += $$PWD/graphicsobjectnodeinstance.h
|
||||
HEADERS += $$PWD/idcontainer.h
|
||||
HEADERS += $$PWD/informationchangedcommand.h
|
||||
HEADERS += $$PWD/informationcontainer.h
|
||||
HEADERS += $$PWD/instancecontainer.h
|
||||
HEADERS += $$PWD/nodeinstanceclientproxy.h
|
||||
HEADERS += $$PWD/nodeinstancemetaobject.h
|
||||
HEADERS += $$PWD/nodeinstanceserver.h
|
||||
HEADERS += $$PWD/nodeinstancesignalspy.h
|
||||
HEADERS += $$PWD/objectnodeinstance.h
|
||||
HEADERS += $$PWD/pixmapchangedcommand.h
|
||||
HEADERS += $$PWD/positionernodeinstance.h
|
||||
HEADERS += $$PWD/qmlgraphicsitemnodeinstance.h
|
||||
HEADERS += $$PWD/qmlpropertychangesnodeinstance.h
|
||||
HEADERS += $$PWD/qmlstatenodeinstance.h
|
||||
HEADERS += $$PWD/qmltransitionnodeinstance.h
|
||||
HEADERS += $$PWD/removeinstancescommand.h
|
||||
HEADERS += $$PWD/removepropertiescommand.h
|
||||
HEADERS += $$PWD/reparentcontainer.h
|
||||
HEADERS += $$PWD/reparentinstancescommand.h
|
||||
HEADERS += $$PWD/servernodeinstance.h
|
||||
HEADERS += $$PWD/valueschangedcommand.h
|
||||
HEADERS += $$PWD/../include/nodeinstanceserverinterface.h
|
||||
|
||||
|
||||
SOURCES += $$PWD/behaviornodeinstance.cpp
|
||||
SOURCES += $$PWD/changebindingscommand.cpp
|
||||
SOURCES += $$PWD/changefileurlcommand.cpp
|
||||
SOURCES += $$PWD/changeidscommand.cpp
|
||||
SOURCES += $$PWD/changestatecommand.cpp
|
||||
SOURCES += $$PWD/changevaluescommand.cpp
|
||||
SOURCES += $$PWD/childrenchangeeventfilter.cpp
|
||||
SOURCES += $$PWD/clearscenecommand.cpp
|
||||
SOURCES += $$PWD/componentnodeinstance.cpp
|
||||
SOURCES += $$PWD/createinstancescommand.cpp
|
||||
SOURCES += $$PWD/createscenecommand.cpp
|
||||
SOURCES += $$PWD/declarativedesignercommunicationinterface.cpp
|
||||
SOURCES += $$PWD/dummynodeinstance.cpp
|
||||
SOURCES += $$PWD/graphicsobjectnodeinstance.cpp
|
||||
SOURCES += $$PWD/idcontainer.cpp
|
||||
SOURCES += $$PWD/informationchangedcommand.cpp
|
||||
SOURCES += $$PWD/informationcontainer.cpp
|
||||
SOURCES += $$PWD/instancecontainer.cpp
|
||||
SOURCES += $$PWD/nodeinstanceclientproxy.cpp
|
||||
SOURCES += $$PWD/nodeinstancemetaobject.cpp
|
||||
SOURCES += $$PWD/nodeinstanceserver.cpp
|
||||
SOURCES += $$PWD/nodeinstanceserverinterface.cpp
|
||||
SOURCES += $$PWD/nodeinstancesignalspy.cpp
|
||||
SOURCES += $$PWD/objectnodeinstance.cpp
|
||||
SOURCES += $$PWD/pixmapchangedcommand.cpp
|
||||
SOURCES += $$PWD/positionernodeinstance.cpp
|
||||
SOURCES += $$PWD/propertyabstractcontainer.cpp
|
||||
SOURCES += $$PWD/propertybindingcontainer.cpp
|
||||
SOURCES += $$PWD/propertyvaluecontainer.cpp
|
||||
SOURCES += $$PWD/qmlgraphicsitemnodeinstance.cpp
|
||||
SOURCES += $$PWD/qmlpropertychangesnodeinstance.cpp
|
||||
SOURCES += $$PWD/qmlstatenodeinstance.cpp
|
||||
SOURCES += $$PWD/qmltransitionnodeinstance.cpp
|
||||
SOURCES += $$PWD/removeinstancescommand.cpp
|
||||
SOURCES += $$PWD/removepropertiescommand.cpp
|
||||
SOURCES += $$PWD/reparentcontainer.cpp
|
||||
SOURCES += $$PWD/reparentinstancescommand.cpp
|
||||
SOURCES += $$PWD/servernodeinstance.cpp
|
||||
SOURCES += $$PWD/valueschangedcommand.cpp
|
||||
@@ -1,697 +1,311 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "nodeinstance.h"
|
||||
|
||||
#include "objectnodeinstance.h"
|
||||
#include "metainfo.h"
|
||||
#include "graphicswidgetnodeinstance.h"
|
||||
#include "widgetnodeinstance.h"
|
||||
#include "qmlgraphicsitemnodeinstance.h"
|
||||
#include "graphicsscenenodeinstance.h"
|
||||
#include "graphicsviewnodeinstance.h"
|
||||
#include "nodeinstanceview.h"
|
||||
#include "qmlviewnodeinstance.h"
|
||||
#include "dummynodeinstance.h"
|
||||
#include "componentnodeinstance.h"
|
||||
#include "qmltransitionnodeinstance.h"
|
||||
#include "qmlpropertychangesnodeinstance.h"
|
||||
#include "positionernodeinstance.h"
|
||||
#include "behaviornodeinstance.h"
|
||||
#include "qmlstatenodeinstance.h"
|
||||
#include "nodeabstractproperty.h"
|
||||
#include "variantproperty.h"
|
||||
#include <QPainter>
|
||||
#include <modelnode.h>
|
||||
#include "commondefines.h"
|
||||
|
||||
#include <invalidnodeinstanceexception.h>
|
||||
|
||||
#include <QHash>
|
||||
#include <QSet>
|
||||
|
||||
#include <QtDeclarative/QDeclarativeEngine>
|
||||
|
||||
/*!
|
||||
\class QmlDesigner::NodeInstance
|
||||
\ingroup CoreInstance
|
||||
\brief NodeInstance is a common handle for the actual object representation of a ModelNode.
|
||||
|
||||
NodeInstance abstracts away the differences e.g. in terms of position and size
|
||||
for QWidget, QGraphicsView, QLayout etc objects. Multiple NodeInstance objects can share
|
||||
the pointer to the same instance object. The actual instance will be deleted when
|
||||
the last NodeInstance object referencing to it is deleted. This can be disabled by
|
||||
setDeleteHeldInstance().
|
||||
|
||||
\see QmlDesigner::NodeInstanceView
|
||||
*/
|
||||
#include <QtDebug>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
/*!
|
||||
\brief Constructor - creates a invalid NodeInstance
|
||||
class ProxyNodeInstanceData
|
||||
{
|
||||
public:
|
||||
ProxyNodeInstanceData()
|
||||
: instanceId(-1),
|
||||
parentInstanceId(-1),
|
||||
penWidth(1),
|
||||
isAnchoredBySibling(false),
|
||||
isAnchoredByChildren(false),
|
||||
hasContent(false),
|
||||
isMovable(false),
|
||||
isResizable(false),
|
||||
isInPositioner(false)
|
||||
{}
|
||||
|
||||
qint32 instanceId;
|
||||
qint32 parentInstanceId;
|
||||
ModelNode modelNode;
|
||||
QRectF boundingRect;
|
||||
QPointF position;
|
||||
QSizeF size;
|
||||
QTransform transform;
|
||||
QTransform sceneTransform;
|
||||
int penWidth;
|
||||
bool isAnchoredBySibling;
|
||||
bool isAnchoredByChildren;
|
||||
bool hasContent;
|
||||
bool isMovable;
|
||||
bool isResizable;
|
||||
bool isInPositioner;
|
||||
|
||||
|
||||
\see NodeInstanceView
|
||||
*/
|
||||
QHash<QString, QVariant> propertyValues;
|
||||
QHash<QString, bool> hasBindingForProperty;
|
||||
QHash<QString, bool> hasAnchors;
|
||||
QHash<QString, QString> instanceTypes;
|
||||
|
||||
QImage renderImage;
|
||||
QHash<QString, QPair<QString, qint32> > anchors;
|
||||
};
|
||||
|
||||
NodeInstance::NodeInstance()
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Destructor
|
||||
NodeInstance::NodeInstance(ProxyNodeInstanceData *dPointer)
|
||||
: d(dPointer)
|
||||
{
|
||||
}
|
||||
|
||||
NodeInstance NodeInstance::create(const ModelNode &node, qint32 instanceId)
|
||||
{
|
||||
ProxyNodeInstanceData *d = new ProxyNodeInstanceData;
|
||||
|
||||
d->modelNode = node;
|
||||
d->instanceId = instanceId;
|
||||
|
||||
return NodeInstance(d);
|
||||
}
|
||||
|
||||
*/
|
||||
NodeInstance::~NodeInstance()
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Constructor - creates a valid NodeInstance
|
||||
|
||||
*/
|
||||
NodeInstance::NodeInstance(const Internal::ObjectNodeInstance::Pointer &abstractInstance)
|
||||
: m_nodeInstance(abstractInstance)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
NodeInstance::NodeInstance(const NodeInstance &other)
|
||||
: m_nodeInstance(other.m_nodeInstance)
|
||||
: d(other.d)
|
||||
{
|
||||
}
|
||||
|
||||
NodeInstance &NodeInstance::operator=(const NodeInstance &other)
|
||||
{
|
||||
m_nodeInstance = other.m_nodeInstance;
|
||||
d = other.d;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Paints the NodeInstance with this painter.
|
||||
\param painter used QPainter
|
||||
*/
|
||||
void NodeInstance::paint(QPainter *painter)
|
||||
{
|
||||
m_nodeInstance->paint(painter);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Creates a new NodeInstace for this NodeMetaInfo
|
||||
|
||||
\param metaInfo MetaInfo for which a Instance should be created
|
||||
\param context QDeclarativeContext which should be used
|
||||
\returns Internal Pointer of a NodeInstance
|
||||
\see NodeMetaInfo
|
||||
*/
|
||||
Internal::ObjectNodeInstance::Pointer NodeInstance::createInstance(const NodeMetaInfo &metaInfo,
|
||||
QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
{
|
||||
Internal::ObjectNodeInstance::Pointer instance;
|
||||
|
||||
qDebug() << __FUNCTION__ << metaInfo.typeName() << metaInfo.directSuperClass().typeName();
|
||||
|
||||
if (!metaInfo.isValid())
|
||||
instance = Internal::DummyNodeInstance::create();
|
||||
else if (metaInfo.isSubclassOf("Qt/QWidget", 4, 7))
|
||||
instance = Internal::DummyNodeInstance::create();
|
||||
else if (metaInfo.isSubclassOf("Qt/QGraphicsView", 4, 7))
|
||||
instance = Internal::GraphicsViewNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/QDeclarativeView", 4, 7))
|
||||
instance = Internal::QDeclarativeViewNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/QGraphicsWidget", 4, 7))
|
||||
instance = Internal::GraphicsWidgetNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("QDeclarativeBasePositioner", 4, 7))
|
||||
instance = Internal::PositionerNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/Item", 4, 7))
|
||||
instance = Internal::QmlGraphicsItemNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/QGraphicsScene", 4, 7))
|
||||
instance = Internal::GraphicsSceneNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/Component", 4, 7))
|
||||
instance = Internal::ComponentNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/PropertyChanges", 4, 7))
|
||||
instance = Internal::QmlPropertyChangesNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/State", 4, 7))
|
||||
instance = Internal::QmlStateNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/Transition", 4, 7))
|
||||
instance = Internal::QmlTransitionNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/Behavior", 4, 7))
|
||||
instance = Internal::BehaviorNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else if (metaInfo.isSubclassOf("Qt/QtObject", 4, 7))
|
||||
instance = Internal::ObjectNodeInstance::create(metaInfo, context, objectToBeWrapped);
|
||||
else
|
||||
instance = Internal::DummyNodeInstance::create();
|
||||
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NodeInstance NodeInstance::create(NodeInstanceView *nodeInstanceView, const ModelNode &node, QObject *objectToBeWrapped)
|
||||
{
|
||||
Q_ASSERT(node.isValid());
|
||||
Q_ASSERT(nodeInstanceView);
|
||||
|
||||
// For the moment just use the root context of the engine
|
||||
// for all items. However, this is a hack ... ideally we should
|
||||
// rebuild the same context hierarchy as the qml compiler does
|
||||
|
||||
QDeclarativeContext *context = nodeInstanceView->engine()->rootContext();
|
||||
|
||||
NodeInstance instance(createInstance(node.metaInfo(), context, objectToBeWrapped));
|
||||
|
||||
instance.m_nodeInstance->setModelNode(node);
|
||||
|
||||
instance.m_nodeInstance->setNodeInstanceView(nodeInstanceView);
|
||||
|
||||
instance.m_nodeInstance->initializePropertyWatcher(instance.m_nodeInstance);
|
||||
|
||||
instance.setId(node.id());
|
||||
|
||||
//QObject::connect(instance.internalObject(), SIGNAL(destroyed(QObject*)), nodeInstanceView, SLOT(removeIdFromContext(QObject*)));
|
||||
|
||||
foreach (const VariantProperty &property, node.variantProperties()) {
|
||||
if (property.isDynamic())
|
||||
instance.setPropertyDynamicVariant(property.name(), property.dynamicTypeName(), property.value());
|
||||
else
|
||||
instance.setPropertyVariant(property.name(), property.value());
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
NodeInstance NodeInstance::create(NodeInstanceView *nodeInstanceView, const NodeMetaInfo &metaInfo, QDeclarativeContext *context)
|
||||
{
|
||||
NodeInstance instance(createInstance(metaInfo, context, 0));
|
||||
instance.m_nodeInstance->setNodeInstanceView(nodeInstanceView);
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the ModelNode of this NodeInstance.
|
||||
\returns ModelNode of this NodeState
|
||||
*/
|
||||
ModelNode NodeInstance::modelNode() const
|
||||
{
|
||||
if (m_nodeInstance.isNull())
|
||||
if (isValid()) {
|
||||
return d->modelNode;
|
||||
} else {
|
||||
return ModelNode();
|
||||
|
||||
return m_nodeInstance->modelNode();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
\brief Changes the NodeState of the ModelNode of this NodeInstance.
|
||||
All properties are updated.
|
||||
\param state NodeState of this NodeInstance
|
||||
*/
|
||||
void NodeInstance::setModelNode(const ModelNode &node)
|
||||
qint32 NodeInstance::instanceId() const
|
||||
{
|
||||
Q_ASSERT(node.isValid());
|
||||
if (m_nodeInstance->modelNode() == node)
|
||||
return;
|
||||
|
||||
m_nodeInstance->setModelNode(node);
|
||||
if (d) {
|
||||
return d->instanceId;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is a top level item.
|
||||
\returns true if this NodeInstance is a top level item
|
||||
*/
|
||||
bool NodeInstance::isTopLevel() const
|
||||
{
|
||||
return m_nodeInstance->isTopLevel();
|
||||
}
|
||||
|
||||
void NodeInstance::reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty)
|
||||
{
|
||||
m_nodeInstance->reparent(oldParentInstance, oldParentProperty, newParentInstance, newParentProperty);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the parent NodeInstance of this NodeInstance.
|
||||
|
||||
If there is not parent than the parent is invalid.
|
||||
|
||||
\returns Parent NodeInstance.
|
||||
*/
|
||||
NodeInstance NodeInstance::parent() const
|
||||
{
|
||||
return m_nodeInstance->nodeInstanceParentForObject(m_nodeInstance->parent());
|
||||
}
|
||||
|
||||
bool NodeInstance::hasParent() const
|
||||
{
|
||||
return m_nodeInstance->parent();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is a QDeclarativeItem.
|
||||
\returns true if this NodeInstance is a QDeclarativeItem
|
||||
*/
|
||||
bool NodeInstance::isQmlGraphicsItem() const
|
||||
{
|
||||
return m_nodeInstance->isQmlGraphicsItem();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is a QGraphicsScene.
|
||||
\returns true if this NodeInstance is a QGraphicsScene
|
||||
*/
|
||||
bool NodeInstance::isGraphicsScene() const
|
||||
{
|
||||
return m_nodeInstance->isGraphicsScene();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is a QGraphicsView.
|
||||
\returns true if this NodeInstance is a QGraphicsView
|
||||
*/
|
||||
bool NodeInstance::isGraphicsView() const
|
||||
{
|
||||
return m_nodeInstance->isGraphicsView();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is a QGraphicsWidget.
|
||||
\returns true if this NodeInstance is a QGraphicsWidget
|
||||
*/
|
||||
bool NodeInstance::isGraphicsWidget() const
|
||||
{
|
||||
return m_nodeInstance->isGraphicsWidget();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is a QGraphicsProxyWidget.
|
||||
\returns true if this NodeInstance is a QGraphicsProxyWidget
|
||||
*/
|
||||
bool NodeInstance::isProxyWidget() const
|
||||
{
|
||||
return m_nodeInstance->isProxyWidget();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is a QWidget.
|
||||
\returns true if this NodeInstance is a QWidget
|
||||
*/
|
||||
bool NodeInstance::isWidget() const
|
||||
{
|
||||
return m_nodeInstance->isWidget();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is a QDeclarativeView.
|
||||
\returns true if this NodeInstance is a QDeclarativeView
|
||||
*/
|
||||
bool NodeInstance::isQDeclarativeView() const
|
||||
{
|
||||
return m_nodeInstance->isQDeclarativeView();
|
||||
}
|
||||
|
||||
bool NodeInstance::isGraphicsObject() const
|
||||
{
|
||||
return m_nodeInstance->isGraphicsObject();
|
||||
}
|
||||
|
||||
bool NodeInstance::isTransition() const
|
||||
{
|
||||
return m_nodeInstance->isTransition();
|
||||
}
|
||||
|
||||
bool NodeInstance::isPositioner() const
|
||||
{
|
||||
return m_nodeInstance->isPositioner();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is a QGraphicsItem.
|
||||
\returns true if this NodeInstance is a QGraphicsItem
|
||||
*/
|
||||
bool NodeInstance::equalGraphicsItem(QGraphicsItem *item) const
|
||||
{
|
||||
return m_nodeInstance->equalGraphicsItem(item);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the bounding rect of the NodeInstance.
|
||||
\returns QRectF of the NodeInstance
|
||||
*/
|
||||
QRectF NodeInstance::boundingRect() const
|
||||
{
|
||||
QRectF boundingRect(m_nodeInstance->boundingRect());
|
||||
|
||||
//
|
||||
// if (modelNode().isValid()) { // TODO implement recursiv stuff
|
||||
// if (qFuzzyIsNull(boundingRect.width()))
|
||||
// boundingRect.setWidth(nodeState().property("width").value().toDouble());
|
||||
//
|
||||
// if (qFuzzyIsNull(boundingRect.height()))
|
||||
// boundingRect.setHeight(nodeState().property("height").value().toDouble());
|
||||
// }
|
||||
|
||||
return boundingRect;
|
||||
}
|
||||
|
||||
void NodeInstance::setPropertyVariant(const QString &name, const QVariant &value)
|
||||
{
|
||||
m_nodeInstance->setPropertyVariant(name, value);
|
||||
|
||||
}
|
||||
|
||||
void NodeInstance::setPropertyDynamicVariant(const QString &name, const QString &typeName, const QVariant &value)
|
||||
{
|
||||
m_nodeInstance->createDynamicProperty(name, typeName);
|
||||
m_nodeInstance->setPropertyVariant(name, value);
|
||||
}
|
||||
|
||||
void NodeInstance::setPropertyBinding(const QString &name, const QString &expression)
|
||||
{
|
||||
m_nodeInstance->setPropertyBinding(name, expression);
|
||||
}
|
||||
|
||||
void NodeInstance::setPropertyDynamicBinding(const QString &name, const QString &typeName, const QString &expression)
|
||||
{
|
||||
m_nodeInstance->createDynamicProperty(name, typeName);
|
||||
m_nodeInstance->setPropertyBinding(name, expression);
|
||||
}
|
||||
|
||||
void NodeInstance::resetProperty(const QString &name)
|
||||
{
|
||||
m_nodeInstance->resetProperty(name);
|
||||
}
|
||||
|
||||
void NodeInstance::refreshProperty(const QString &name)
|
||||
{
|
||||
m_nodeInstance->refreshProperty(name);
|
||||
}
|
||||
|
||||
void NodeInstance::setId(const QString &id)
|
||||
{
|
||||
m_nodeInstance->setId(id);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the property value of the property of this NodeInstance.
|
||||
\returns QVariant value
|
||||
*/
|
||||
QVariant NodeInstance::property(const QString &name) const
|
||||
{
|
||||
return m_nodeInstance->property(name);
|
||||
}
|
||||
|
||||
bool NodeInstance::hasBindingForProperty(const QString &name) const
|
||||
{
|
||||
return m_nodeInstance->hasBindingForProperty(name);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the property default value of the property of this NodeInstance.
|
||||
\returns QVariant default value which is the reset value to
|
||||
*/
|
||||
QVariant NodeInstance::defaultValue(const QString &name) const
|
||||
{
|
||||
return m_nodeInstance->resetValue(name);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the type of the property of this NodeInstance.
|
||||
*/
|
||||
QString NodeInstance::instanceType(const QString &name) const
|
||||
{
|
||||
return m_nodeInstance->instanceType(name);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns if the NodeInstance is valid.
|
||||
\returns true if the NodeInstance is valid
|
||||
*/
|
||||
bool NodeInstance::isValid() const
|
||||
{
|
||||
return m_nodeInstance && internalObject();
|
||||
return instanceId() >= 0;
|
||||
}
|
||||
|
||||
void NodeInstance::makeInvalid()
|
||||
{
|
||||
if (m_nodeInstance)
|
||||
m_nodeInstance->destroy();
|
||||
m_nodeInstance.clear();
|
||||
if (d)
|
||||
d->instanceId = -1;
|
||||
}
|
||||
|
||||
void NodeInstance::renderPixmapNextPaint()
|
||||
QRectF NodeInstance::boundingRect() const
|
||||
{
|
||||
m_nodeInstance->renderPixmapNextPaint();
|
||||
if (isValid()) {
|
||||
return d->boundingRect;
|
||||
} else {
|
||||
return QRectF();
|
||||
}
|
||||
}
|
||||
|
||||
bool NodeInstance::hasContent() const
|
||||
{
|
||||
return m_nodeInstance->hasContent();
|
||||
}
|
||||
|
||||
bool NodeInstance::isResizable() const
|
||||
{
|
||||
return m_nodeInstance->isResizable();
|
||||
}
|
||||
|
||||
bool NodeInstance::isMovable() const
|
||||
{
|
||||
return m_nodeInstance->isMovable();
|
||||
}
|
||||
|
||||
bool NodeInstance::isInPositioner() const
|
||||
{
|
||||
return m_nodeInstance->isInPositioner();
|
||||
}
|
||||
|
||||
bool NodeInstance::hasAnchor(const QString &name) const
|
||||
{
|
||||
return m_nodeInstance->hasAnchor(name);
|
||||
}
|
||||
|
||||
int NodeInstance::penWidth() const
|
||||
{
|
||||
return m_nodeInstance->penWidth();
|
||||
if (isValid()) {
|
||||
return d->hasContent;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool NodeInstance::isAnchoredBySibling() const
|
||||
{
|
||||
return m_nodeInstance->isAnchoredBySibling();
|
||||
if (isValid()) {
|
||||
return d->isAnchoredBySibling;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool NodeInstance::isAnchoredByChildren() const
|
||||
{
|
||||
return m_nodeInstance->isAnchoredByChildren();
|
||||
if (isValid()) {
|
||||
return d->isAnchoredByChildren;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
QPair<QString, NodeInstance> NodeInstance::anchor(const QString &name) const
|
||||
bool NodeInstance::isMovable() const
|
||||
{
|
||||
return m_nodeInstance->anchor(name);
|
||||
if (isValid()) {
|
||||
return d->isMovable;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
uint qHash(const NodeInstance &instance)
|
||||
bool NodeInstance::isResizable() const
|
||||
{
|
||||
return ::qHash(instance.m_nodeInstance.data());
|
||||
}
|
||||
|
||||
bool operator==(const NodeInstance &first, const NodeInstance &second)
|
||||
{
|
||||
return first.m_nodeInstance.data() == second.m_nodeInstance.data();
|
||||
}
|
||||
|
||||
bool NodeInstance::isWrappingThisObject(QObject *object) const
|
||||
{
|
||||
return internalObject() && internalObject() == object;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the position in parent coordiantes.
|
||||
\returns QPointF of the position of the instance.
|
||||
*/
|
||||
QPointF NodeInstance::position() const
|
||||
{
|
||||
return m_nodeInstance->position();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the size in local coordiantes.
|
||||
\returns QSizeF of the size of the instance.
|
||||
*/
|
||||
QSizeF NodeInstance::size() const
|
||||
{
|
||||
QSizeF instanceSize = m_nodeInstance->size();
|
||||
|
||||
// if (nodeState().isValid()) {
|
||||
// if (qFuzzyIsNull(instanceSize.width()))
|
||||
// instanceSize.setWidth(nodeState().property("width").value().toDouble());
|
||||
//
|
||||
// if (qFuzzyIsNull(instanceSize.height()))
|
||||
// instanceSize.setHeight(nodeState().property("height").value().toDouble());
|
||||
// }
|
||||
return instanceSize;
|
||||
if (isValid()) {
|
||||
return d->isResizable;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
QTransform NodeInstance::transform() const
|
||||
{
|
||||
return m_nodeInstance->transform();
|
||||
if (isValid()) {
|
||||
return d->transform;
|
||||
} else {
|
||||
return QTransform();
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the transform matrix of the instance.
|
||||
\returns QTransform of the instance.
|
||||
*/
|
||||
QTransform NodeInstance::customTransform() const
|
||||
{
|
||||
return m_nodeInstance->customTransform();
|
||||
}
|
||||
|
||||
QTransform NodeInstance::sceneTransform() const
|
||||
{
|
||||
return m_nodeInstance->sceneTransform();
|
||||
if (isValid()) {
|
||||
return d->sceneTransform;
|
||||
} else {
|
||||
return QTransform();
|
||||
}
|
||||
}
|
||||
|
||||
double NodeInstance::rotation() const
|
||||
bool NodeInstance::isInPositioner() const
|
||||
{
|
||||
return m_nodeInstance->rotation();
|
||||
if (isValid()) {
|
||||
return d->isInPositioner;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
double NodeInstance::scale() const
|
||||
QPointF NodeInstance::position() const
|
||||
{
|
||||
return m_nodeInstance->scale();
|
||||
if (isValid()) {
|
||||
return d->position;
|
||||
} else {
|
||||
return QPointF();
|
||||
}
|
||||
}
|
||||
|
||||
QList<QGraphicsTransform *> NodeInstance::transformations() const
|
||||
QSizeF NodeInstance::size() const
|
||||
{
|
||||
return m_nodeInstance->transformations();
|
||||
if (isValid()) {
|
||||
return d->size;
|
||||
} else {
|
||||
return QSizeF();
|
||||
}
|
||||
}
|
||||
|
||||
QPointF NodeInstance::transformOriginPoint() const
|
||||
int NodeInstance::penWidth() const
|
||||
{
|
||||
return m_nodeInstance->transformOriginPoint();
|
||||
if (isValid()) {
|
||||
return d->penWidth;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
double NodeInstance::zValue() const
|
||||
void NodeInstance::paint(QPainter *painter)
|
||||
{
|
||||
return m_nodeInstance->zValue();
|
||||
if (isValid() && !d->renderImage.isNull())
|
||||
painter->drawImage(boundingRect().topLeft(), d->renderImage);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Returns the opacity of the instance.
|
||||
\returns 0.0 mean transparent and 1.0 opaque.
|
||||
*/
|
||||
double NodeInstance::opacity() const
|
||||
QVariant NodeInstance::property(const QString &name) const
|
||||
{
|
||||
return m_nodeInstance->opacity();
|
||||
if (isValid())
|
||||
return d->propertyValues.value(name);
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
|
||||
void NodeInstance::setDeleteHeldInstance(bool deleteInstance)
|
||||
bool NodeInstance::hasBindingForProperty(const QString &name) const
|
||||
{
|
||||
m_nodeInstance->setDeleteHeldInstance(deleteInstance);
|
||||
if (isValid())
|
||||
return d->hasBindingForProperty.value(name, false);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void NodeInstance::paintUpdate()
|
||||
QString NodeInstance::instanceType(const QString &name) const
|
||||
{
|
||||
m_nodeInstance->paintUpdate();
|
||||
if (isValid())
|
||||
return d->instanceTypes.value(name);
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
|
||||
Internal::QmlGraphicsItemNodeInstance::Pointer NodeInstance::qmlGraphicsItemNodeInstance() const
|
||||
qint32 NodeInstance::parentId() const
|
||||
{
|
||||
return m_nodeInstance.dynamicCast<Internal::QmlGraphicsItemNodeInstance>();
|
||||
if (isValid()) {
|
||||
return d->parentInstanceId;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
QObject *NodeInstance::internalObject() const
|
||||
bool NodeInstance::hasAnchor(const QString &name) const
|
||||
{
|
||||
if (m_nodeInstance.isNull())
|
||||
return 0;
|
||||
if (isValid())
|
||||
return d->hasAnchors.value(name, false);
|
||||
|
||||
return m_nodeInstance->object();
|
||||
return false;
|
||||
}
|
||||
|
||||
void NodeInstance::activateState()
|
||||
QPair<QString, qint32> NodeInstance::anchor(const QString &name) const
|
||||
{
|
||||
m_nodeInstance->activateState();
|
||||
if (isValid())
|
||||
return d->anchors.value(name, QPair<QString, qint32>(QString(), qint32(-1)));
|
||||
|
||||
return QPair<QString, qint32>(QString(), -1);
|
||||
}
|
||||
|
||||
void NodeInstance::deactivateState()
|
||||
void NodeInstance::setProperty(const QString &name, const QVariant &value)
|
||||
{
|
||||
m_nodeInstance->deactivateState();
|
||||
d->propertyValues.insert(name, value);
|
||||
}
|
||||
|
||||
bool NodeInstance::updateStateVariant(const NodeInstance &target, const QString &propertyName, const QVariant &value)
|
||||
void NodeInstance::setRenderImage(const QImage &image)
|
||||
{
|
||||
return m_nodeInstance->updateStateVariant(target, propertyName, value);
|
||||
d->renderImage = image;
|
||||
}
|
||||
|
||||
bool NodeInstance::updateStateBinding(const NodeInstance &target, const QString &propertyName, const QString &expression)
|
||||
void NodeInstance::setInformation(InformationName name, const QVariant &information, const QVariant &secondInformation, const QVariant &thirdInformation)
|
||||
{
|
||||
return m_nodeInstance->updateStateBinding(target, propertyName, expression);
|
||||
switch (name) {
|
||||
case Size: d->size = information.toSizeF(); break;
|
||||
case BoundingRect: d->boundingRect = information.toRectF(); break;
|
||||
case Transform: d->transform = information.value<QTransform>(); break;
|
||||
case PenWidth: d->penWidth = information.toInt(); break;
|
||||
case Position: d->position = information.toPointF(); break;
|
||||
case IsInPositioner: d->isInPositioner = information.toBool(); break;
|
||||
case SceneTransform: d->sceneTransform = information.value<QTransform>(); break;
|
||||
case IsResizable: d->isResizable = information.toBool(); break;
|
||||
case IsMovable: d->isMovable = information.toBool(); break;
|
||||
case IsAnchoredByChildren: d->isAnchoredByChildren = information.toBool(); break;
|
||||
case IsAnchoredBySibling: d->isAnchoredBySibling = information.toBool(); break;
|
||||
case HasContent: d->hasContent = information.toBool(); break;
|
||||
case HasAnchor: d->hasAnchors.insert(information.toString(), secondInformation.toBool());break;
|
||||
case Anchor: d->anchors.insert(information.toString(), qMakePair(secondInformation.toString(), thirdInformation.value<qint32>())); break;
|
||||
case InstanceTypeForProperty: d->instanceTypes.insert(information.toString(), secondInformation.toString()); break;
|
||||
case HasBindingForProperty: d->hasBindingForProperty.insert(information.toString(), secondInformation.toBool()); break;
|
||||
case Parent: d->parentInstanceId = information.toInt();
|
||||
case NoName:
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
QVariant NodeInstance::resetVariant(const QString &propertyName) const
|
||||
{
|
||||
return m_nodeInstance->resetValue(propertyName);
|
||||
}
|
||||
|
||||
bool NodeInstance::resetStateProperty(const NodeInstance &target, const QString &propertyName, const QVariant &resetValue)
|
||||
{
|
||||
return m_nodeInstance->resetStateProperty(target, propertyName, resetValue);
|
||||
}
|
||||
|
||||
/*!
|
||||
Makes types used in node instances known to the Qml engine. To be called once at initialization time.
|
||||
*/
|
||||
void NodeInstance::registerDeclarativeTypes()
|
||||
{
|
||||
// qmlRegisterType<QmlDesigner::Internal::QmlPropertyChangesObject>();
|
||||
}
|
||||
|
||||
void NodeInstance::doComponentComplete()
|
||||
{
|
||||
m_nodeInstance->doComponentComplete();
|
||||
}
|
||||
|
||||
QString NodeInstance::id() const
|
||||
{
|
||||
return m_nodeInstance->id();
|
||||
}
|
||||
|
||||
#ifdef QTCREATOR_TEST
|
||||
QObject* NodeInstance::testHandle() const
|
||||
{
|
||||
return internalObject();
|
||||
}
|
||||
Internal::ObjectNodeInstance* NodeInstance::internalInstance() const
|
||||
{
|
||||
return m_nodeInstance.data();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
#include "nodeinstanceclientproxy.h"
|
||||
|
||||
#include <QLocalSocket>
|
||||
#include <QVariant>
|
||||
#include <QCoreApplication>
|
||||
#include <QStringList>
|
||||
|
||||
#include "nodeinstanceserver.h"
|
||||
|
||||
#include "propertyabstractcontainer.h"
|
||||
#include "propertyvaluecontainer.h"
|
||||
#include "propertybindingcontainer.h"
|
||||
#include "instancecontainer.h"
|
||||
#include "createinstancescommand.h"
|
||||
#include "createscenecommand.h"
|
||||
#include "changevaluescommand.h"
|
||||
#include "changebindingscommand.h"
|
||||
#include "changefileurlcommand.h"
|
||||
#include "removeinstancescommand.h"
|
||||
#include "clearscenecommand.h"
|
||||
#include "removepropertiescommand.h"
|
||||
#include "reparentinstancescommand.h"
|
||||
#include "changeidscommand.h"
|
||||
#include "changestatecommand.h"
|
||||
|
||||
#include "informationchangedcommand.h"
|
||||
#include "pixmapchangedcommand.h"
|
||||
#include "valueschangedcommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
NodeInstanceClientProxy::NodeInstanceClientProxy(QObject *parent)
|
||||
: QObject(parent),
|
||||
m_nodeinstanceServer(new NodeInstanceServer(this)),
|
||||
m_blockSize(0)
|
||||
{
|
||||
m_socket = new QLocalSocket(this);
|
||||
connect(m_socket, SIGNAL(readyRead()), this, SLOT(readDataStream()));
|
||||
connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), QCoreApplication::instance(), SLOT(quit()));
|
||||
connect(m_socket, SIGNAL(disconnected()), QCoreApplication::instance(), SLOT(quit()));
|
||||
m_socket->connectToServer(QCoreApplication::arguments().at(1), QIODevice::ReadWrite | QIODevice::Unbuffered);
|
||||
m_socket->waitForConnected(-1);
|
||||
}
|
||||
|
||||
void NodeInstanceClientProxy::writeCommand(const QVariant &command)
|
||||
{
|
||||
QByteArray block;
|
||||
QDataStream out(&block, QIODevice::WriteOnly);
|
||||
out << quint32(0);
|
||||
out << command;
|
||||
out.device()->seek(0);
|
||||
out << quint32(block.size() - sizeof(quint32));
|
||||
|
||||
m_socket->write(block);
|
||||
}
|
||||
|
||||
void NodeInstanceClientProxy::informationChanged(const InformationChangedCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceClientProxy::valuesChanged(const ValuesChangedCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceClientProxy::pixmapChanged(const PixmapChangedCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceClientProxy::flush()
|
||||
{
|
||||
}
|
||||
|
||||
qint64 NodeInstanceClientProxy::bytesToWrite() const
|
||||
{
|
||||
return m_socket->bytesToWrite();
|
||||
}
|
||||
|
||||
void NodeInstanceClientProxy::readDataStream()
|
||||
{
|
||||
QList<QVariant> commandList;
|
||||
|
||||
while (!m_socket->atEnd()) {
|
||||
if (m_socket->bytesAvailable() < int(sizeof(quint32)))
|
||||
break;
|
||||
|
||||
QDataStream in(m_socket);
|
||||
|
||||
if (m_blockSize == 0) {
|
||||
in >> m_blockSize;
|
||||
}
|
||||
|
||||
if (m_socket->bytesAvailable() < m_blockSize)
|
||||
break;
|
||||
|
||||
QVariant command;
|
||||
in >> command;
|
||||
m_blockSize = 0;
|
||||
|
||||
Q_ASSERT(in.status() == QDataStream::Ok);
|
||||
|
||||
commandList.append(command);
|
||||
}
|
||||
|
||||
foreach (const QVariant &command, commandList) {
|
||||
dispatchCommand(command);
|
||||
}
|
||||
}
|
||||
|
||||
NodeInstanceServerInterface *NodeInstanceClientProxy::nodeInstanceServer() const
|
||||
{
|
||||
return m_nodeinstanceServer;
|
||||
}
|
||||
|
||||
void NodeInstanceClientProxy::dispatchCommand(const QVariant &command)
|
||||
{
|
||||
static const int createInstancesCommandType = QMetaType::type("CreateInstancesCommand");
|
||||
static const int changeFileUrlCommandType = QMetaType::type("ChangeFileUrlCommand");
|
||||
static const int createSceneCommandType = QMetaType::type("CreateSceneCommand");
|
||||
static const int clearSceneCommandType = QMetaType::type("ClearSceneCommand");
|
||||
static const int removeInstancesCommandType = QMetaType::type("RemoveInstancesCommand");
|
||||
static const int removePropertiesCommandType = QMetaType::type("RemovePropertiesCommand");
|
||||
static const int changeBindingsCommandType = QMetaType::type("ChangeBindingsCommand");
|
||||
static const int changeValuesCommandType = QMetaType::type("ChangeValuesCommand");
|
||||
static const int reparentInstancesCommandType = QMetaType::type("ReparentInstancesCommand");
|
||||
static const int changeIdsCommandType = QMetaType::type("ChangeIdsCommand");
|
||||
static const int changeStateCommandType = QMetaType::type("ChangeStateCommand");
|
||||
|
||||
if (command.userType() == createInstancesCommandType)
|
||||
nodeInstanceServer()->createInstances(command.value<CreateInstancesCommand>());
|
||||
else if (command.userType() == changeFileUrlCommandType)
|
||||
nodeInstanceServer()->changeFileUrl(command.value<ChangeFileUrlCommand>());
|
||||
else if (command.userType() == createSceneCommandType)
|
||||
nodeInstanceServer()->createScene(command.value<CreateSceneCommand>());
|
||||
else if (command.userType() == clearSceneCommandType)
|
||||
nodeInstanceServer()->clearScene(command.value<ClearSceneCommand>());
|
||||
else if (command.userType() == removeInstancesCommandType)
|
||||
nodeInstanceServer()->removeInstances(command.value<RemoveInstancesCommand>());
|
||||
else if (command.userType() == removePropertiesCommandType)
|
||||
nodeInstanceServer()->removeProperties(command.value<RemovePropertiesCommand>());
|
||||
else if (command.userType() == changeBindingsCommandType)
|
||||
nodeInstanceServer()->changePropertyBindings(command.value<ChangeBindingsCommand>());
|
||||
else if (command.userType() == changeValuesCommandType)
|
||||
nodeInstanceServer()->changePropertyValues(command.value<ChangeValuesCommand>());
|
||||
else if (command.userType() == reparentInstancesCommandType)
|
||||
nodeInstanceServer()->reparentInstances(command.value<ReparentInstancesCommand>());
|
||||
else if (command.userType() == changeIdsCommandType)
|
||||
nodeInstanceServer()->changeIds(command.value<ChangeIdsCommand>());
|
||||
else if (command.userType() == changeStateCommandType)
|
||||
nodeInstanceServer()->changeState(command.value<ChangeStateCommand>());
|
||||
else
|
||||
Q_ASSERT(false);
|
||||
}
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,45 @@
|
||||
#ifndef NODEINSTANCECLIENTPROXY_H
|
||||
#define NODEINSTANCECLIENTPROXY_H
|
||||
|
||||
#include "nodeinstanceclientinterface.h"
|
||||
|
||||
#include <QObject>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QLocalSocket;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class NodeInstanceServerInterface;
|
||||
|
||||
class NodeInstanceClientProxy : public QObject, public NodeInstanceClientInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
NodeInstanceClientProxy(QObject *parent = 0);
|
||||
|
||||
void informationChanged(const InformationChangedCommand &command);
|
||||
void valuesChanged(const ValuesChangedCommand &command);
|
||||
void pixmapChanged(const PixmapChangedCommand &command);
|
||||
void flush();
|
||||
qint64 bytesToWrite() const;
|
||||
|
||||
protected:
|
||||
void writeCommand(const QVariant &command);
|
||||
void dispatchCommand(const QVariant &command);
|
||||
NodeInstanceServerInterface *nodeInstanceServer() const;
|
||||
|
||||
private slots:
|
||||
void readDataStream();
|
||||
|
||||
private:
|
||||
QLocalSocket *m_socket;
|
||||
NodeInstanceServerInterface *m_nodeinstanceServer;
|
||||
quint32 m_blockSize;
|
||||
};
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
#endif // NODEINSTANCECLIENTPROXY_H
|
||||
@@ -11,7 +11,7 @@ namespace Internal {
|
||||
NodeInstanceMetaObject::NodeInstanceMetaObject(const ObjectNodeInstance::Pointer &nodeInstance, QDeclarativeEngine *engine)
|
||||
: QDeclarativeOpenMetaObject(nodeInstance->object(), new QDeclarativeOpenMetaObjectType(nodeInstance->object()->metaObject(), engine)),
|
||||
m_nodeInstance(nodeInstance),
|
||||
m_context(nodeInstance->modelNode().isRootNode() ? nodeInstance->context() : 0)
|
||||
m_context(nodeInstance->isRootNodeInstance() ? nodeInstance->context() : 0)
|
||||
{
|
||||
setCached(true);
|
||||
}
|
||||
@@ -59,55 +59,29 @@ int NodeInstanceMetaObject::metaCall(QMetaObject::Call call, int id, void **a)
|
||||
oldValue = property(id).read(m_nodeInstance->object());
|
||||
}
|
||||
|
||||
if (( call == QMetaObject::ReadProperty || call == QMetaObject::WriteProperty)
|
||||
&& id >= type()->propertyOffset()) {
|
||||
int propId = id - type()->propertyOffset();
|
||||
if (call == QMetaObject::ReadProperty) {
|
||||
propertyRead(propId);
|
||||
*reinterpret_cast<QVariant *>(a[0]) = value(propId);
|
||||
} else if (call == QMetaObject::WriteProperty) {
|
||||
if (value(propId) != *reinterpret_cast<QVariant *>(a[0])) {
|
||||
propertyWrite(propId);
|
||||
setValue(propId, *reinterpret_cast<QVariant *>(a[0]));
|
||||
dynamicPropertyWritten(propId);
|
||||
notifyPropertyChange(id);
|
||||
activate(object(), type()->signalOffset() + propId, 0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!QObjectPrivate::get(object())->wasDeleted) {
|
||||
if (parent())
|
||||
metaCallReturnValue = parent()->metaCall(call, id, a);
|
||||
else
|
||||
metaCallReturnValue = object()->qt_metacall(call, id, a);
|
||||
}
|
||||
if (parent() && id < parent()->propertyOffset())
|
||||
metaCallReturnValue = parent()->metaCall(call, id, a);
|
||||
else
|
||||
metaCallReturnValue = QDeclarativeOpenMetaObject::metaCall(call, id, a);
|
||||
|
||||
if (call == QMetaObject::WriteProperty
|
||||
if (metaCallReturnValue >= 0
|
||||
&& call == QMetaObject::WriteProperty
|
||||
&& !property(id).hasNotifySignal()
|
||||
&& oldValue != property(id).read(m_nodeInstance->object()))
|
||||
notifyPropertyChange(id);
|
||||
}
|
||||
notifyPropertyChange(id);
|
||||
|
||||
return metaCallReturnValue;
|
||||
|
||||
}
|
||||
|
||||
void NodeInstanceMetaObject::dynamicPropertyWritten(int propertyId)
|
||||
{
|
||||
|
||||
if (m_context)
|
||||
m_context->setContextProperty(name(propertyId), value(propertyId));
|
||||
}
|
||||
|
||||
void NodeInstanceMetaObject::notifyPropertyChange(int id)
|
||||
{
|
||||
ObjectNodeInstance::Pointer objectNodeInstance = m_nodeInstance.toStrongRef();
|
||||
|
||||
if (objectNodeInstance && objectNodeInstance->nodeInstanceView()) {
|
||||
if (objectNodeInstance && objectNodeInstance->nodeInstanceServer()) {
|
||||
if (id < type()->propertyOffset()) {
|
||||
objectNodeInstance->nodeInstanceView()->notifyPropertyChange(objectNodeInstance->modelNode(), m_prefix + property(id).name());
|
||||
objectNodeInstance->nodeInstanceServer()->notifyPropertyChange(objectNodeInstance->instanceId(), m_prefix + property(id).name());
|
||||
} else {
|
||||
objectNodeInstance->nodeInstanceView()->notifyPropertyChange(objectNodeInstance->modelNode(), m_prefix + name(id - type()->propertyOffset()));
|
||||
objectNodeInstance->nodeInstanceServer()->notifyPropertyChange(objectNodeInstance->instanceId(), m_prefix + name(id - type()->propertyOffset()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ public:
|
||||
|
||||
protected:
|
||||
int metaCall(QMetaObject::Call _c, int _id, void **_a);
|
||||
void dynamicPropertyWritten(int);
|
||||
void notifyPropertyChange(int id);
|
||||
|
||||
private:
|
||||
|
||||
@@ -0,0 +1,716 @@
|
||||
#include "nodeinstanceserver.h"
|
||||
|
||||
#include <QGraphicsItem>
|
||||
#include <private/qgraphicsitem_p.h>
|
||||
#include <private/qgraphicsscene_p.h>
|
||||
#include <QDeclarativeEngine>
|
||||
#include <QDeclarativeView>
|
||||
#include <QFileSystemWatcher>
|
||||
#include <QUrl>
|
||||
#include <QSet>
|
||||
#include <QVariant>
|
||||
#include <QMetaType>
|
||||
|
||||
#include "servernodeinstance.h"
|
||||
#include "childrenchangeeventfilter.h"
|
||||
#include "propertyabstractcontainer.h"
|
||||
#include "propertybindingcontainer.h"
|
||||
#include "propertyvaluecontainer.h"
|
||||
#include "instancecontainer.h"
|
||||
#include "createinstancescommand.h"
|
||||
#include "changefileurlcommand.h"
|
||||
#include "clearscenecommand.h"
|
||||
#include "reparentinstancescommand.h"
|
||||
#include "changevaluescommand.h"
|
||||
#include "changebindingscommand.h"
|
||||
#include "changeidscommand.h"
|
||||
#include "removeinstancescommand.h"
|
||||
#include "nodeinstanceclientinterface.h"
|
||||
#include "removepropertiescommand.h"
|
||||
#include "valueschangedcommand.h"
|
||||
#include "informationchangedcommand.h"
|
||||
#include "pixmapchangedcommand.h"
|
||||
#include "commondefines.h"
|
||||
#include "childrenchangeeventfilter.h"
|
||||
#include "changestatecommand.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
NodeInstanceServer::NodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) :
|
||||
NodeInstanceServerInterface(),
|
||||
m_childrenChangeEventFilter(new Internal::ChildrenChangeEventFilter(this)),
|
||||
m_nodeInstanceClient(nodeInstanceClient),
|
||||
m_timer(0)
|
||||
{
|
||||
connect(m_childrenChangeEventFilter.data(), SIGNAL(childrenChanged(QObject*)), this, SLOT(emitParentChanged(QObject*)));
|
||||
}
|
||||
|
||||
NodeInstanceServer::~NodeInstanceServer()
|
||||
{
|
||||
delete m_declarativeView.data();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::createInstances(const CreateInstancesCommand &command)
|
||||
{
|
||||
Q_ASSERT(m_declarativeView);
|
||||
QList<ServerNodeInstance> instanceList;
|
||||
foreach(const InstanceContainer &instanceContainer, command.instances()) {
|
||||
ServerNodeInstance instance = ServerNodeInstance::create(this, instanceContainer);
|
||||
insertInstanceRelationship(instance);
|
||||
instanceList.append(instance);
|
||||
instance.internalObject()->installEventFilter(childrenChangeEventFilter());
|
||||
if (instanceContainer.instanceId() == 0) {
|
||||
m_rootNodeInstance = instance;
|
||||
QGraphicsObject *rootGraphicsObject = qobject_cast<QGraphicsObject*>(instance.internalObject());
|
||||
if (rootGraphicsObject) {
|
||||
m_declarativeView->scene()->addItem(rootGraphicsObject);
|
||||
m_declarativeView->setSceneRect(rootGraphicsObject->boundingRect());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
instance.doComponentComplete();
|
||||
}
|
||||
|
||||
nodeInstanceClient()->valuesChanged(createValuesChangedCommand(instanceList));
|
||||
nodeInstanceClient()->informationChanged(createAllInformationChangedCommand(instanceList, true));
|
||||
foreach(const ServerNodeInstance &instance, instanceList)
|
||||
nodeInstanceClient()->pixmapChanged(createPixmapChangedCommand(instance));
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
ServerNodeInstance NodeInstanceServer::instanceForId(qint32 id) const
|
||||
{
|
||||
if (id < 0)
|
||||
return ServerNodeInstance();
|
||||
|
||||
Q_ASSERT(m_idInstanceHash.contains(id));
|
||||
return m_idInstanceHash.value(id);
|
||||
}
|
||||
|
||||
bool NodeInstanceServer::hasInstanceForId(qint32 id) const
|
||||
{
|
||||
if (id < 0)
|
||||
return false;
|
||||
|
||||
return m_idInstanceHash.contains(id);
|
||||
}
|
||||
|
||||
ServerNodeInstance NodeInstanceServer::instanceForObject(QObject *object) const
|
||||
{
|
||||
Q_ASSERT(m_objectInstanceHash.contains(object));
|
||||
return m_objectInstanceHash.value(object);
|
||||
}
|
||||
|
||||
bool NodeInstanceServer::hasInstanceForObject(QObject *object) const
|
||||
{
|
||||
if (object == 0)
|
||||
return false;
|
||||
|
||||
return m_objectInstanceHash.contains(object);
|
||||
}
|
||||
|
||||
void NodeInstanceServer::startRenderTimer()
|
||||
{
|
||||
if (m_timer == 0)
|
||||
m_timer = startTimer(16);
|
||||
}
|
||||
|
||||
void NodeInstanceServer::stopRenderTimer()
|
||||
{
|
||||
if (m_timer) {
|
||||
killTimer(m_timer);
|
||||
m_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceServer::createScene(const CreateSceneCommand &/*command*/)
|
||||
{
|
||||
Q_ASSERT(!m_declarativeView);
|
||||
m_declarativeView = new QDeclarativeView;
|
||||
m_declarativeView->setAttribute(Qt::WA_DontShowOnScreen, true);
|
||||
m_declarativeView->setViewportUpdateMode(QGraphicsView::NoViewportUpdate);
|
||||
m_declarativeView->viewport()->setUpdatesEnabled(false);
|
||||
m_declarativeView->show();
|
||||
|
||||
if (!m_fileUrl.isEmpty())
|
||||
engine()->setBaseUrl(m_fileUrl);
|
||||
|
||||
static_cast<QGraphicsScenePrivate*>(QObjectPrivate::get(m_declarativeView->scene()))->processDirtyItemsEmitted = true;
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::clearScene(const ClearSceneCommand &/*command*/)
|
||||
{
|
||||
stopRenderTimer();
|
||||
|
||||
removeAllInstanceRelationships();
|
||||
m_fileSystemWatcherHash.clear();
|
||||
m_rootNodeInstance.makeInvalid();
|
||||
m_changedPropertyList.clear();
|
||||
m_fileUrl.clear();
|
||||
|
||||
delete m_declarativeView.data();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::removeInstances(const RemoveInstancesCommand &command)
|
||||
{
|
||||
foreach(qint32 instanceId, command.instanceIds()) {
|
||||
removeInstanceRelationsip(instanceId);
|
||||
}
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::removeProperties(const RemovePropertiesCommand &command)
|
||||
{
|
||||
foreach(const PropertyAbstractContainer &container, command.properties())
|
||||
resetInstanceProperty(container);
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::reparentInstances(const ReparentInstancesCommand &command)
|
||||
{
|
||||
foreach(const ReparentContainer &container, command.reparentInstances()) {
|
||||
ServerNodeInstance instance = instanceForId(container.instanceId());
|
||||
if (instance.isValid()) {
|
||||
instance.reparent(instanceForId(container.oldParentInstanceId()), container.oldParentProperty(), instanceForId(container.newParentInstanceId()), container.newParentProperty());
|
||||
}
|
||||
}
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::changeState(const ChangeStateCommand &command)
|
||||
{
|
||||
if (hasInstanceForId(command.stateInstanceId())) {
|
||||
ServerNodeInstance instance = instanceForId(command.stateInstanceId());
|
||||
instance.activateState();
|
||||
} else {
|
||||
if (activeStateInstance().isValid())
|
||||
activeStateInstance().deactivateState();
|
||||
}
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::changeFileUrl(const ChangeFileUrlCommand &command)
|
||||
{
|
||||
m_fileUrl = command.fileUrl();
|
||||
|
||||
if (engine())
|
||||
engine()->setBaseUrl(m_fileUrl);
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::changePropertyValues(const ChangeValuesCommand &command)
|
||||
{
|
||||
foreach(const PropertyValueContainer &container, command.valueChanges())
|
||||
setInstancePropertyVariant(container);
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
|
||||
void NodeInstanceServer::changePropertyBindings(const ChangeBindingsCommand &command)
|
||||
{
|
||||
foreach(const PropertyBindingContainer &container, command.bindingChanges())
|
||||
setInstancePropertyBinding(container);
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::changeIds(const ChangeIdsCommand &command)
|
||||
{
|
||||
foreach(const IdContainer &container, command.ids()) {
|
||||
if (hasInstanceForId(container.instanceId()))
|
||||
instanceForId(container.instanceId()).setId(container.id());
|
||||
}
|
||||
|
||||
startRenderTimer();
|
||||
}
|
||||
|
||||
QDeclarativeEngine *NodeInstanceServer::engine() const
|
||||
{
|
||||
if (m_declarativeView)
|
||||
return m_declarativeView->engine();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void NodeInstanceServer::removeAllInstanceRelationships()
|
||||
{
|
||||
// prevent destroyed() signals calling back
|
||||
|
||||
foreach (ServerNodeInstance instance, m_objectInstanceHash.values()) {
|
||||
if (instance.isValid())
|
||||
instance.setId(QString());
|
||||
}
|
||||
|
||||
//first the root object
|
||||
if (rootNodeInstance().internalObject())
|
||||
rootNodeInstance().internalObject()->disconnect();
|
||||
|
||||
rootNodeInstance().makeInvalid();
|
||||
|
||||
|
||||
foreach (ServerNodeInstance instance, m_objectInstanceHash.values()) {
|
||||
if (instance.internalObject())
|
||||
instance.internalObject()->disconnect();
|
||||
instance.makeInvalid();
|
||||
}
|
||||
|
||||
m_idInstanceHash.clear();
|
||||
m_objectInstanceHash.clear();
|
||||
}
|
||||
|
||||
|
||||
QFileSystemWatcher *NodeInstanceServer::fileSystemWatcher()
|
||||
{
|
||||
if (m_fileSystemWatcher.isNull()) {
|
||||
m_fileSystemWatcher = new QFileSystemWatcher(this);
|
||||
connect(m_fileSystemWatcher.data(), SIGNAL(fileChanged(QString)), this, SLOT(refreshLocalFileProperty(QString)));
|
||||
}
|
||||
|
||||
return m_fileSystemWatcher.data();
|
||||
}
|
||||
|
||||
Internal::ChildrenChangeEventFilter *NodeInstanceServer::childrenChangeEventFilter() const
|
||||
{
|
||||
return m_childrenChangeEventFilter.data();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::addFilePropertyToFileSystemWatcher(QObject *object, const QString &propertyName, const QString &path)
|
||||
{
|
||||
m_fileSystemWatcherHash.insert(path, ObjectPropertyPair(object, propertyName));
|
||||
fileSystemWatcher()->addPath(path);
|
||||
|
||||
}
|
||||
|
||||
void NodeInstanceServer::removeFilePropertyFromFileSystemWatcher(QObject *object, const QString &propertyName, const QString &path)
|
||||
{
|
||||
fileSystemWatcher()->removePath(path);
|
||||
m_fileSystemWatcherHash.remove(path, ObjectPropertyPair(object, propertyName));
|
||||
}
|
||||
|
||||
void NodeInstanceServer::refreshLocalFileProperty(const QString &path)
|
||||
{
|
||||
if (m_fileSystemWatcherHash.contains(path)) {
|
||||
QList<ObjectPropertyPair> objectPropertyPairList = m_fileSystemWatcherHash.values();
|
||||
foreach(const ObjectPropertyPair &objectPropertyPair, objectPropertyPairList) {
|
||||
QObject *object = objectPropertyPair.first.data();
|
||||
QString propertyName = objectPropertyPair.second;
|
||||
|
||||
if (hasInstanceForObject(object)) {
|
||||
instanceForObject(object).refreshProperty(propertyName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceServer::addChangedProperty(const InstancePropertyPair &property)
|
||||
{
|
||||
if (!m_changedPropertyList.contains(property))
|
||||
m_changedPropertyList.append(property);
|
||||
}
|
||||
|
||||
void NodeInstanceServer::emitParentChanged(QObject *child)
|
||||
{
|
||||
if (hasInstanceForObject(child)) {
|
||||
addChangedProperty(InstancePropertyPair(instanceForObject(child), "parent"));
|
||||
}
|
||||
}
|
||||
|
||||
Internal::ChildrenChangeEventFilter *NodeInstanceServer::childrenChangeEventFilter()
|
||||
{
|
||||
if (m_childrenChangeEventFilter.isNull()) {
|
||||
m_childrenChangeEventFilter = new Internal::ChildrenChangeEventFilter(this);
|
||||
connect(m_childrenChangeEventFilter.data(), SIGNAL(childrenChanged(QObject*)), this, SLOT(emitParentChanged(QObject*)));
|
||||
}
|
||||
|
||||
return m_childrenChangeEventFilter.data();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::resetInstanceProperty(const PropertyAbstractContainer &propertyContainer)
|
||||
{
|
||||
if (hasInstanceForId(propertyContainer.instanceId())) { // TODO ugly workaround
|
||||
ServerNodeInstance instance = instanceForId(propertyContainer.instanceId());
|
||||
Q_ASSERT(instance.isValid());
|
||||
|
||||
const QString name = propertyContainer.name();
|
||||
|
||||
if (activeStateInstance().isValid() && !instance.isSubclassOf("Qt/PropertyChanges")) {
|
||||
bool statePropertyWasReseted = activeStateInstance().resetStateProperty(instance, name, instance.resetVariant(name));
|
||||
if (!statePropertyWasReseted)
|
||||
instance.resetProperty(name);
|
||||
} else {
|
||||
instance.resetProperty(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void NodeInstanceServer::setInstancePropertyBinding(const PropertyBindingContainer &bindingContainer)
|
||||
{
|
||||
if (hasInstanceForId(bindingContainer.instanceId())) {
|
||||
ServerNodeInstance instance = instanceForId(bindingContainer.instanceId());
|
||||
|
||||
const QString name = bindingContainer.name();
|
||||
const QString expression = bindingContainer.expression();
|
||||
|
||||
|
||||
if (activeStateInstance().isValid() && !instance.isSubclassOf("Qt/PropertyChanges")) {
|
||||
bool stateBindingWasUpdated = activeStateInstance().updateStateBinding(instance, name, expression);
|
||||
if (!stateBindingWasUpdated) {
|
||||
if (bindingContainer.isDynamic())
|
||||
instance.setPropertyDynamicBinding(name, bindingContainer.dynamicTypeName(), expression);
|
||||
else
|
||||
instance.setPropertyBinding(name, expression);
|
||||
}
|
||||
} else {
|
||||
if (bindingContainer.isDynamic())
|
||||
instance.setPropertyDynamicBinding(name, bindingContainer.dynamicTypeName(), expression);
|
||||
else
|
||||
instance.setPropertyBinding(name, expression);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void NodeInstanceServer::removeProperties(const QList<PropertyAbstractContainer> &propertyList)
|
||||
{
|
||||
foreach (const PropertyAbstractContainer &property, propertyList)
|
||||
resetInstanceProperty(property);
|
||||
}
|
||||
|
||||
void NodeInstanceServer::setInstancePropertyVariant(const PropertyValueContainer &valueContainer)
|
||||
{
|
||||
if (hasInstanceForId(valueContainer.instanceId())) {
|
||||
ServerNodeInstance instance = instanceForId(valueContainer.instanceId());
|
||||
|
||||
|
||||
const QString name = valueContainer.name();
|
||||
const QVariant value = valueContainer.value();
|
||||
|
||||
|
||||
if (activeStateInstance().isValid() && !instance.isSubclassOf("Qt/PropertyChanges")) {
|
||||
bool stateValueWasUpdated = activeStateInstance().updateStateVariant(instance, name, value);
|
||||
if (!stateValueWasUpdated) {
|
||||
if (valueContainer.isDynamic())
|
||||
instance.setPropertyDynamicVariant(name, valueContainer.dynamicTypeName(), value);
|
||||
else
|
||||
instance.setPropertyVariant(name, value);
|
||||
}
|
||||
} else { //base state
|
||||
if (valueContainer.isDynamic())
|
||||
instance.setPropertyDynamicVariant(name, valueContainer.dynamicTypeName(), value);
|
||||
else
|
||||
instance.setPropertyVariant(name, value);
|
||||
}
|
||||
|
||||
// instance.paintUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
QUrl NodeInstanceServer::fileUrl() const
|
||||
{
|
||||
return m_fileUrl;
|
||||
}
|
||||
|
||||
ServerNodeInstance NodeInstanceServer::activeStateInstance() const
|
||||
{
|
||||
return m_activeStateInstance;
|
||||
}
|
||||
|
||||
ServerNodeInstance NodeInstanceServer::rootNodeInstance() const
|
||||
{
|
||||
return m_rootNodeInstance;
|
||||
}
|
||||
|
||||
void NodeInstanceServer::setStateInstance(const ServerNodeInstance &stateInstance)
|
||||
{
|
||||
m_activeStateInstance = stateInstance;
|
||||
}
|
||||
|
||||
void NodeInstanceServer::clearStateInstance()
|
||||
{
|
||||
m_activeStateInstance = ServerNodeInstance();
|
||||
}
|
||||
|
||||
void NodeInstanceServer::timerEvent(QTimerEvent *event)
|
||||
{
|
||||
if (event->timerId() == m_timer) {
|
||||
findItemChangesAndSendChangeCommands();
|
||||
}
|
||||
|
||||
NodeInstanceServerInterface::timerEvent(event);
|
||||
}
|
||||
|
||||
NodeInstanceClientInterface *NodeInstanceServer::nodeInstanceClient() const
|
||||
{
|
||||
return m_nodeInstanceClient;
|
||||
}
|
||||
|
||||
InformationChangedCommand NodeInstanceServer::createAllInformationChangedCommand(const QList<ServerNodeInstance> &instanceList, bool initial) const
|
||||
{
|
||||
QVector<InformationContainer> informationVector;
|
||||
|
||||
foreach(const ServerNodeInstance &instance, instanceList) {
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Position, instance.position()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Transform, instance.transform()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), SceneTransform, instance.sceneTransform()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Size, instance.size()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), BoundingRect, instance.boundingRect()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Transform, instance.transform()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasContent, instance.hasContent()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), IsMovable, instance.isMovable()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), IsResizable, instance.isResizable()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), IsInPositioner, instance.isInPositioner()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), PenWidth, instance.penWidth()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Parent, instance.parent().instanceId()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), IsAnchoredByChildren, instance.isAnchoredByChildren()));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), IsAnchoredBySibling, instance.isAnchoredBySibling()));
|
||||
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasAnchor, QString("anchors.fill"), instance.hasAnchor("anchors.fill")));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasAnchor, QString("anchors.centerIn"), instance.hasAnchor("anchors.centerIn")));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasAnchor, QString("anchors.right"), instance.hasAnchor("anchors.right")));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasAnchor, QString("anchors.top"), instance.hasAnchor("anchors.top")));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasAnchor, QString("anchors.left"), instance.hasAnchor("anchors.left")));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasAnchor, QString("anchors.bottom"), instance.hasAnchor("anchors.bottom")));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasAnchor, QString("anchors.horizontalCenter"), instance.hasAnchor("anchors.horizontalCenter")));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasAnchor, QString("anchors.verticalCenter"), instance.hasAnchor("anchors.verticalCenter")));
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasAnchor, QString("anchors.baseline"), instance.hasAnchor("anchors.baseline")));
|
||||
|
||||
QPair<QString, ServerNodeInstance> anchorPair = instance.anchor("anchors.fill");
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Anchor, QString("anchors.fill"), anchorPair.first, anchorPair.second.instanceId()));
|
||||
|
||||
anchorPair = instance.anchor("anchors.centerIn");
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Anchor, QString("anchors.centerIn"), anchorPair.first, anchorPair.second.instanceId()));
|
||||
|
||||
anchorPair = instance.anchor("anchors.right");
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Anchor, QString("anchors.right"), anchorPair.first, anchorPair.second.instanceId()));
|
||||
|
||||
anchorPair = instance.anchor("anchors.top");
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Anchor, QString("anchors.top"), anchorPair.first, anchorPair.second.instanceId()));
|
||||
|
||||
anchorPair = instance.anchor("anchors.left");
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Anchor, QString("anchors.left"), anchorPair.first, anchorPair.second.instanceId()));
|
||||
|
||||
anchorPair = instance.anchor("anchors.bottom");
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Anchor, QString("anchors.bottom"), anchorPair.first, anchorPair.second.instanceId()));
|
||||
|
||||
anchorPair = instance.anchor("anchors.horizontalCenter");
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Anchor, QString("anchors.horizontalCenter"), anchorPair.first, anchorPair.second.instanceId()));
|
||||
|
||||
anchorPair = instance.anchor("anchors.verticalCenter");
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Anchor, QString("anchors.verticalCenter"), anchorPair.first, anchorPair.second.instanceId()));
|
||||
|
||||
anchorPair = instance.anchor("anchors.baseline");
|
||||
informationVector.append(InformationContainer(instance.instanceId(), Anchor, QString("anchors.baseline"), anchorPair.first, anchorPair.second.instanceId()));
|
||||
|
||||
QStringList propertyNames = instance.propertyNames();
|
||||
|
||||
if (initial) {
|
||||
foreach (const QString &propertyName,propertyNames)
|
||||
informationVector.append(InformationContainer(instance.instanceId(), InstanceTypeForProperty, propertyName, instance.instanceType(propertyName)));
|
||||
}
|
||||
|
||||
foreach (const QString &propertyName,instance.propertyNames()) {
|
||||
bool hasChanged = false;
|
||||
bool hasBinding = instance.hasBindingForProperty(propertyName, &hasChanged);
|
||||
if (hasChanged)
|
||||
informationVector.append(InformationContainer(instance.instanceId(), HasBindingForProperty, propertyName, hasBinding));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return InformationChangedCommand(informationVector);
|
||||
}
|
||||
|
||||
ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const
|
||||
{
|
||||
QVector<PropertyValueContainer> valueVector;
|
||||
|
||||
foreach(const ServerNodeInstance &instance, instanceList) {
|
||||
foreach(const QString &propertyName, instance.propertyNames()) {
|
||||
QVariant propertyValue = instance.property(propertyName);
|
||||
if (propertyValue.type() < QVariant::UserType)
|
||||
valueVector.append(PropertyValueContainer(instance.instanceId(), propertyName, propertyValue, QString()));
|
||||
}
|
||||
}
|
||||
|
||||
return ValuesChangedCommand(valueVector);
|
||||
}
|
||||
|
||||
ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const
|
||||
{
|
||||
QVector<PropertyValueContainer> valueVector;
|
||||
|
||||
foreach (const InstancePropertyPair &property, propertyList) {
|
||||
const QString propertyName = property.second;
|
||||
const ServerNodeInstance instance = property.first;
|
||||
|
||||
if( instance.isValid()) {
|
||||
QVariant propertyValue = instance.property(propertyName);
|
||||
if (propertyValue.type() < QVariant::UserType)
|
||||
valueVector.append(PropertyValueContainer(instance.instanceId(), propertyName, propertyValue, QString()));
|
||||
}
|
||||
}
|
||||
|
||||
return ValuesChangedCommand(valueVector);
|
||||
}
|
||||
|
||||
void NodeInstanceServer::notifyPropertyChange(qint32 instanceid, const QString &propertyName)
|
||||
{
|
||||
if (hasInstanceForId(instanceid))
|
||||
addChangedProperty(InstancePropertyPair(instanceForId(instanceid), propertyName));
|
||||
}
|
||||
|
||||
void NodeInstanceServer::insertInstanceRelationship(const ServerNodeInstance &instance)
|
||||
{
|
||||
Q_ASSERT(instance.isValid());
|
||||
Q_ASSERT(!m_idInstanceHash.contains(instance.instanceId()));
|
||||
Q_ASSERT(!m_objectInstanceHash.contains(instance.internalObject()));
|
||||
m_objectInstanceHash.insert(instance.internalObject(), instance);
|
||||
m_idInstanceHash.insert(instance.instanceId(), instance);
|
||||
}
|
||||
|
||||
void NodeInstanceServer::removeInstanceRelationsip(qint32 instanceId)
|
||||
{
|
||||
if (hasInstanceForId(instanceId)) {
|
||||
ServerNodeInstance instance = instanceForId(instanceId);
|
||||
if (instance.isValid())
|
||||
instance.setId(QString());
|
||||
m_idInstanceHash.remove(instanceId);
|
||||
m_objectInstanceHash.remove(instance.internalObject());
|
||||
instance.makeInvalid();
|
||||
}
|
||||
}
|
||||
|
||||
PixmapChangedCommand NodeInstanceServer::createPixmapChangedCommand(const ServerNodeInstance &instance) const
|
||||
{
|
||||
return PixmapChangedCommand(instance.instanceId(), instance.renderImage());
|
||||
}
|
||||
|
||||
bool NodeInstanceServer::nonInstanceChildIsDirty(QGraphicsObject *graphicsObject) const
|
||||
{
|
||||
QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(graphicsObject);
|
||||
if (d->dirtyChildren) {
|
||||
foreach(QGraphicsItem *child, graphicsObject->childItems()) {
|
||||
QGraphicsObject *childGraphicsObject = child->toGraphicsObject();
|
||||
if (hasInstanceForObject(childGraphicsObject))
|
||||
continue;
|
||||
|
||||
QGraphicsItemPrivate *childPrivate = QGraphicsItemPrivate::get(child);
|
||||
if (childPrivate->dirty || childPrivate->dirtyChildren || nonInstanceChildIsDirty(childGraphicsObject))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void NodeInstanceServer::resetAllItems()
|
||||
{
|
||||
// m_declarativeView->scene()->update();
|
||||
// m_declarativeView->viewport()->repaint();
|
||||
static_cast<QGraphicsScenePrivate*>(QObjectPrivate::get(m_declarativeView->scene()))->processDirtyItemsEmitted = true;
|
||||
|
||||
foreach (QGraphicsItem *item, m_declarativeView->items())
|
||||
static_cast<QGraphicsScenePrivate*>(QObjectPrivate::get(m_declarativeView->scene()))->resetDirtyItem(item);
|
||||
}
|
||||
|
||||
void NodeInstanceServer::findItemChangesAndSendChangeCommands()
|
||||
{
|
||||
static bool inFunction = false;
|
||||
if (!inFunction && nodeInstanceClient()->bytesToWrite() < 100000) {
|
||||
inFunction = true;
|
||||
|
||||
QSet<ServerNodeInstance> dirtyInstanceSet;
|
||||
QSet<ServerNodeInstance> informationChangedInstanceSet;
|
||||
QVector<InstancePropertyPair> propertyChangedList;
|
||||
bool adjustSceneRect = false;
|
||||
|
||||
if (m_declarativeView) {
|
||||
foreach (QGraphicsItem *item, m_declarativeView->items()) {
|
||||
QGraphicsObject *graphicsObject = item->toGraphicsObject();
|
||||
if (graphicsObject && hasInstanceForObject(graphicsObject)) {
|
||||
ServerNodeInstance instance = instanceForObject(graphicsObject);
|
||||
QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(item);
|
||||
|
||||
if (d->dirtySceneTransform || d->geometryChanged || d->dirty)
|
||||
informationChangedInstanceSet.insert(instance);
|
||||
|
||||
if((d->dirty && d->notifyBoundingRectChanged)|| (d->dirty && !d->dirtySceneTransform) || nonInstanceChildIsDirty(graphicsObject))
|
||||
dirtyInstanceSet.insert(instance);
|
||||
|
||||
|
||||
|
||||
if (d->geometryChanged) {
|
||||
if (instance.isRootNodeInstance())
|
||||
m_declarativeView->scene()->setSceneRect(item->boundingRect());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
foreach (const InstancePropertyPair& property, m_changedPropertyList) {
|
||||
const ServerNodeInstance instance = property.first;
|
||||
const QString propertyName = property.second;
|
||||
|
||||
if (instance.isRootNodeInstance() && (propertyName == "width" || propertyName == "height"))
|
||||
adjustSceneRect = true;
|
||||
|
||||
if (propertyName.contains("anchors") && informationChangedInstanceSet.contains(instance))
|
||||
informationChangedInstanceSet.insert(instance);
|
||||
|
||||
if (propertyName == "width" || propertyName == "height")
|
||||
dirtyInstanceSet.insert(instance);
|
||||
|
||||
if (propertyName == "parent") {
|
||||
informationChangedInstanceSet.insert(instance);
|
||||
} else {
|
||||
propertyChangedList.append(property);
|
||||
}
|
||||
}
|
||||
|
||||
m_changedPropertyList.clear();
|
||||
resetAllItems();
|
||||
|
||||
if (!informationChangedInstanceSet.isEmpty())
|
||||
nodeInstanceClient()->informationChanged(createAllInformationChangedCommand(informationChangedInstanceSet.toList()));
|
||||
|
||||
if (!propertyChangedList.isEmpty())
|
||||
nodeInstanceClient()->valuesChanged(createValuesChangedCommand(propertyChangedList));
|
||||
|
||||
foreach(const ServerNodeInstance &instance, dirtyInstanceSet)
|
||||
nodeInstanceClient()->pixmapChanged(createPixmapChangedCommand(instance));
|
||||
|
||||
if (adjustSceneRect) {
|
||||
QRectF boundingRect = m_rootNodeInstance.boundingRect();
|
||||
if (boundingRect.isValid()) {
|
||||
m_declarativeView->setSceneRect(boundingRect);
|
||||
}
|
||||
}
|
||||
|
||||
stopRenderTimer();
|
||||
nodeInstanceClient()->flush();
|
||||
}
|
||||
|
||||
inFunction = false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
#ifndef NODEINSTANCESERVER_H
|
||||
#define NODEINSTANCESERVER_H
|
||||
|
||||
#include <QUrl>
|
||||
#include <QVector>
|
||||
|
||||
#include <nodeinstanceserverinterface.h>
|
||||
#include "servernodeinstance.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QFileSystemWatcher;
|
||||
class QDeclarativeView;
|
||||
class QDeclarativeEngine;
|
||||
class QGraphicsObject;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class NodeInstanceClientInterface;
|
||||
class ValuesChangedCommand;
|
||||
class PixmapChangedCommand;
|
||||
class InformationChangedCommand;
|
||||
|
||||
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;
|
||||
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 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);
|
||||
|
||||
|
||||
ServerNodeInstance instanceForId(qint32 id) const;
|
||||
bool hasInstanceForId(qint32 id) const;
|
||||
|
||||
ServerNodeInstance instanceForObject(QObject *object) const;
|
||||
bool hasInstanceForObject(QObject *object) const;
|
||||
|
||||
QDeclarativeEngine *engine() const;
|
||||
|
||||
void removeAllInstanceRelationships();
|
||||
|
||||
QFileSystemWatcher *fileSystemWatcher();
|
||||
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);
|
||||
|
||||
public slots:
|
||||
void refreshLocalFileProperty(const QString &path);
|
||||
void emitParentChanged(QObject *child);
|
||||
|
||||
protected:
|
||||
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter();
|
||||
void resetInstanceProperty(const PropertyAbstractContainer &propertyContainer);
|
||||
void setInstancePropertyBinding(const PropertyBindingContainer &bindingContainer);
|
||||
void setInstancePropertyVariant(const PropertyValueContainer &valueContainer);
|
||||
void removeProperties(const QList<PropertyAbstractContainer> &propertyList);
|
||||
|
||||
void insertInstanceRelationship(const ServerNodeInstance &instance);
|
||||
void removeInstanceRelationsip(qint32 instanceId);
|
||||
|
||||
NodeInstanceClientInterface *nodeInstanceClient() const;
|
||||
|
||||
void timerEvent(QTimerEvent *);
|
||||
|
||||
bool nonInstanceChildIsDirty(QGraphicsObject *graphicsObject) const;
|
||||
void findItemChangesAndSendChangeCommands();
|
||||
void resetAllItems();
|
||||
|
||||
ValuesChangedCommand createValuesChangedCommand(const QList<ServerNodeInstance> &instanceList) const;
|
||||
ValuesChangedCommand createValuesChangedCommand(const QVector<InstancePropertyPair> &propertyList) const;
|
||||
PixmapChangedCommand createPixmapChangedCommand(const ServerNodeInstance &instance) const;
|
||||
InformationChangedCommand createAllInformationChangedCommand(const QList<ServerNodeInstance> &instanceList, bool initial = false) const;
|
||||
|
||||
void addChangedProperty(const InstancePropertyPair &property);
|
||||
|
||||
void startRenderTimer();
|
||||
void stopRenderTimer();
|
||||
|
||||
private:
|
||||
ServerNodeInstance m_rootNodeInstance;
|
||||
ServerNodeInstance m_activeStateInstance;
|
||||
QHash<qint32, ServerNodeInstance> m_idInstanceHash;
|
||||
QHash<QObject*, ServerNodeInstance> m_objectInstanceHash;
|
||||
QMultiHash<QString, ObjectPropertyPair> m_fileSystemWatcherHash;
|
||||
QWeakPointer<QFileSystemWatcher> m_fileSystemWatcher;
|
||||
QWeakPointer<QDeclarativeView> m_declarativeView;
|
||||
QWeakPointer<Internal::ChildrenChangeEventFilter> m_childrenChangeEventFilter;
|
||||
QUrl m_fileUrl;
|
||||
NodeInstanceClientInterface *m_nodeInstanceClient;
|
||||
int m_timer;
|
||||
QVector<InstancePropertyPair> m_changedPropertyList;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // NODEINSTANCESERVER_H
|
||||
@@ -0,0 +1,106 @@
|
||||
#include "nodeinstanceserverinterface.h"
|
||||
#include <qmetatype.h>
|
||||
|
||||
#include "propertyabstractcontainer.h"
|
||||
#include "propertyvaluecontainer.h"
|
||||
#include "propertybindingcontainer.h"
|
||||
#include "instancecontainer.h"
|
||||
#include "createinstancescommand.h"
|
||||
#include "createscenecommand.h"
|
||||
#include "changevaluescommand.h"
|
||||
#include "changebindingscommand.h"
|
||||
#include "changefileurlcommand.h"
|
||||
#include "removeinstancescommand.h"
|
||||
#include "clearscenecommand.h"
|
||||
#include "removepropertiescommand.h"
|
||||
#include "reparentinstancescommand.h"
|
||||
#include "changeidscommand.h"
|
||||
#include "changestatecommand.h"
|
||||
|
||||
#include "informationchangedcommand.h"
|
||||
#include "pixmapchangedcommand.h"
|
||||
#include "valueschangedcommand.h"
|
||||
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
static bool isRegistered=false;
|
||||
|
||||
NodeInstanceServerInterface::NodeInstanceServerInterface(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
registerCommands();
|
||||
}
|
||||
|
||||
void NodeInstanceServerInterface::registerCommands()
|
||||
{
|
||||
if (isRegistered)
|
||||
return;
|
||||
|
||||
isRegistered = true;
|
||||
|
||||
qRegisterMetaType<CreateInstancesCommand>("CreateInstancesCommand");
|
||||
qRegisterMetaTypeStreamOperators<CreateInstancesCommand>("CreateInstancesCommand");
|
||||
|
||||
qRegisterMetaType<ClearSceneCommand>("ClearSceneCommand");
|
||||
qRegisterMetaTypeStreamOperators<ClearSceneCommand>("ClearSceneCommand");
|
||||
|
||||
qRegisterMetaType<CreateSceneCommand>("CreateSceneCommand");
|
||||
qRegisterMetaTypeStreamOperators<CreateSceneCommand>("CreateSceneCommand");
|
||||
|
||||
qRegisterMetaType<ChangeBindingsCommand>("ChangeBindingsCommand");
|
||||
qRegisterMetaTypeStreamOperators<ChangeBindingsCommand>("ChangeBindingsCommand");
|
||||
|
||||
qRegisterMetaType<ChangeValuesCommand>("ChangeValuesCommand");
|
||||
qRegisterMetaTypeStreamOperators<ChangeValuesCommand>("ChangeValuesCommand");
|
||||
|
||||
qRegisterMetaType<ChangeFileUrlCommand>("ChangeFileUrlCommand");
|
||||
qRegisterMetaTypeStreamOperators<ChangeFileUrlCommand>("ChangeFileUrlCommand");
|
||||
|
||||
qRegisterMetaType<ChangeStateCommand>("ChangeStateCommand");
|
||||
qRegisterMetaTypeStreamOperators<PropertyAbstractContainer>("ChangeStateCommand");
|
||||
|
||||
qRegisterMetaType<RemoveInstancesCommand>("RemoveInstancesCommand");
|
||||
qRegisterMetaTypeStreamOperators<RemoveInstancesCommand>("RemoveInstancesCommand");
|
||||
|
||||
qRegisterMetaType<RemovePropertiesCommand>("RemovePropertiesCommand");
|
||||
qRegisterMetaTypeStreamOperators<RemovePropertiesCommand>("RemovePropertiesCommand");
|
||||
|
||||
qRegisterMetaType<ReparentInstancesCommand>("ReparentInstancesCommand");
|
||||
qRegisterMetaTypeStreamOperators<ReparentInstancesCommand>("ReparentInstancesCommand");
|
||||
|
||||
qRegisterMetaType<ChangeIdsCommand>("ChangeIdsCommand");
|
||||
qRegisterMetaTypeStreamOperators<ChangeIdsCommand>("ChangeIdsCommand");
|
||||
|
||||
qRegisterMetaType<ChangeStateCommand>("ChangeStateCommand");
|
||||
qRegisterMetaTypeStreamOperators<ChangeStateCommand>("ChangeStateCommand");
|
||||
|
||||
qRegisterMetaType<InformationChangedCommand>("InformationChangedCommand");
|
||||
qRegisterMetaTypeStreamOperators<InformationChangedCommand>("InformationChangedCommand");
|
||||
|
||||
qRegisterMetaType<ValuesChangedCommand>("ValuesChangedCommand");
|
||||
qRegisterMetaTypeStreamOperators<ValuesChangedCommand>("ValuesChangedCommand");
|
||||
|
||||
qRegisterMetaType<PixmapChangedCommand>("PixmapChangedCommand");
|
||||
qRegisterMetaTypeStreamOperators<PixmapChangedCommand>("PixmapChangedCommand");
|
||||
|
||||
qRegisterMetaType<InformationContainer>("InformationContainer");
|
||||
qRegisterMetaTypeStreamOperators<InformationContainer>("InformationContainer");
|
||||
|
||||
qRegisterMetaType<PropertyValueContainer>("PropertyValueContainer");
|
||||
qRegisterMetaTypeStreamOperators<PropertyValueContainer>("PropertyValueContainer");
|
||||
|
||||
qRegisterMetaType<PropertyBindingContainer>("PropertyBindingContainer");
|
||||
qRegisterMetaTypeStreamOperators<PropertyBindingContainer>("PropertyBindingContainer");
|
||||
|
||||
qRegisterMetaType<PropertyAbstractContainer>("PropertyAbstractContainer");
|
||||
qRegisterMetaTypeStreamOperators<PropertyAbstractContainer>("PropertyAbstractContainer");
|
||||
|
||||
qRegisterMetaType<InstanceContainer>("InstanceContainer");
|
||||
qRegisterMetaTypeStreamOperators<InstanceContainer>("InstanceContainer");
|
||||
|
||||
qRegisterMetaType<IdContainer>("IdContainer");
|
||||
qRegisterMetaTypeStreamOperators<IdContainer>("IdContainer");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
#include "nodeinstanceserverproxy.h"
|
||||
|
||||
#include <QLocalServer>
|
||||
#include <QLocalSocket>
|
||||
#include <QProcess>
|
||||
#include <QCoreApplication>
|
||||
#include <QUuid>
|
||||
|
||||
#include "propertyabstractcontainer.h"
|
||||
#include "propertyvaluecontainer.h"
|
||||
#include "propertybindingcontainer.h"
|
||||
#include "instancecontainer.h"
|
||||
#include "createinstancescommand.h"
|
||||
#include "createscenecommand.h"
|
||||
#include "changevaluescommand.h"
|
||||
#include "changebindingscommand.h"
|
||||
#include "changefileurlcommand.h"
|
||||
#include "removeinstancescommand.h"
|
||||
#include "clearscenecommand.h"
|
||||
#include "removepropertiescommand.h"
|
||||
#include "reparentinstancescommand.h"
|
||||
#include "changeidscommand.h"
|
||||
#include "changestatecommand.h"
|
||||
|
||||
#include "informationchangedcommand.h"
|
||||
#include "pixmapchangedcommand.h"
|
||||
#include "valueschangedcommand.h"
|
||||
|
||||
#include "nodeinstanceview.h"
|
||||
#include "nodeinstanceclientproxy.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceView)
|
||||
: NodeInstanceServerInterface(nodeInstanceView),
|
||||
m_localServer(new QLocalServer(this)),
|
||||
m_nodeInstanceView(nodeInstanceView),
|
||||
m_blockSize(0)
|
||||
{
|
||||
QString socketToken(QUuid::createUuid().toString());
|
||||
|
||||
m_localServer->listen(socketToken);
|
||||
m_localServer->setMaxPendingConnections(1);
|
||||
|
||||
m_qmlPuppetProcess = new QProcess(QCoreApplication::instance());
|
||||
connect(m_qmlPuppetProcess.data(), SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(processFinished(int,QProcess::ExitStatus)));
|
||||
m_qmlPuppetProcess->setProcessChannelMode(QProcess::ForwardedChannels);
|
||||
m_qmlPuppetProcess->start(QString("%1/%2").arg(QCoreApplication::applicationDirPath()).arg("qmlpuppet"), QStringList() << socketToken);
|
||||
connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(deleteLater()));
|
||||
m_qmlPuppetProcess->waitForStarted();
|
||||
Q_ASSERT(m_qmlPuppetProcess->state() == QProcess::Running);
|
||||
|
||||
if (!m_localServer->hasPendingConnections())
|
||||
m_localServer->waitForNewConnection(-1);
|
||||
|
||||
m_socket = m_localServer->nextPendingConnection();
|
||||
Q_ASSERT(m_socket);
|
||||
connect(m_socket.data(), SIGNAL(readyRead()), this, SLOT(readDataStream()));
|
||||
m_localServer->close();
|
||||
}
|
||||
|
||||
NodeInstanceServerProxy::~NodeInstanceServerProxy()
|
||||
{
|
||||
if (m_qmlPuppetProcess) {
|
||||
m_qmlPuppetProcess->blockSignals(true);
|
||||
m_qmlPuppetProcess->terminate();
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::dispatchCommand(const QVariant &command)
|
||||
{
|
||||
static const int informationChangedCommandType = QMetaType::type("InformationChangedCommand");
|
||||
static const int valuesChangedCommandType = QMetaType::type("ValuesChangedCommand");
|
||||
static const int pixmapChangedCommandType = QMetaType::type("PixmapChangedCommand");
|
||||
|
||||
if (command.userType() == informationChangedCommandType)
|
||||
nodeInstanceClient()->informationChanged(command.value<InformationChangedCommand>());
|
||||
else if (command.userType() == valuesChangedCommandType)
|
||||
nodeInstanceClient()->valuesChanged(command.value<ValuesChangedCommand>());
|
||||
else if (command.userType() == pixmapChangedCommandType)
|
||||
nodeInstanceClient()->pixmapChanged(command.value<PixmapChangedCommand>());
|
||||
else
|
||||
Q_ASSERT(false);
|
||||
}
|
||||
|
||||
NodeInstanceClientInterface *NodeInstanceServerProxy::nodeInstanceClient() const
|
||||
{
|
||||
return m_nodeInstanceView.data();
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::setBlockUpdates(bool block)
|
||||
{
|
||||
m_socket->blockSignals(block);
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::writeCommand(const QVariant &command)
|
||||
{
|
||||
Q_ASSERT(m_socket.data());
|
||||
|
||||
QByteArray block;
|
||||
QDataStream out(&block, QIODevice::WriteOnly);
|
||||
out << quint32(0);
|
||||
out << command;
|
||||
out.device()->seek(0);
|
||||
out << quint32(block.size() - sizeof(quint32));
|
||||
|
||||
m_socket->write(block);
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::processFinished(int /*exitCode*/, QProcess::ExitStatus /* exitStatus */)
|
||||
{
|
||||
m_socket->close();
|
||||
emit processCrashed();
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::readDataStream()
|
||||
{
|
||||
QList<QVariant> commandList;
|
||||
|
||||
while (!m_socket->atEnd()) {
|
||||
if (m_socket->bytesAvailable() < int(sizeof(quint32)))
|
||||
break;
|
||||
|
||||
QDataStream in(m_socket.data());
|
||||
|
||||
if (m_blockSize == 0) {
|
||||
in >> m_blockSize;
|
||||
}
|
||||
|
||||
if (m_socket->bytesAvailable() < m_blockSize)
|
||||
break;
|
||||
|
||||
QVariant command;
|
||||
in >> command;
|
||||
m_blockSize = 0;
|
||||
|
||||
Q_ASSERT(in.status() == QDataStream::Ok);
|
||||
|
||||
commandList.append(command);
|
||||
}
|
||||
|
||||
foreach (const QVariant &command, commandList) {
|
||||
dispatchCommand(command);
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::createInstances(const CreateInstancesCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::changeFileUrl(const ChangeFileUrlCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::createScene(const CreateSceneCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::clearScene(const ClearSceneCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::removeInstances(const RemoveInstancesCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::removeProperties(const RemovePropertiesCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::changePropertyBindings(const ChangeBindingsCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::changePropertyValues(const ChangeValuesCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::reparentInstances(const ReparentInstancesCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::changeIds(const ChangeIdsCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
void NodeInstanceServerProxy::changeState(const ChangeStateCommand &command)
|
||||
{
|
||||
writeCommand(QVariant::fromValue(command));
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,64 @@
|
||||
#ifndef NODEINSTANCESERVERPROXY_H
|
||||
#define NODEINSTANCESERVERPROXY_H
|
||||
|
||||
#include "nodeinstanceserverinterface.h"
|
||||
|
||||
#include <QDataStream>
|
||||
#include <QWeakPointer>
|
||||
#include <QProcess>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QLocalServer;
|
||||
class QLocalSocket;
|
||||
class QProcess;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class NodeInstanceClientInterface;
|
||||
class NodeInstanceView;
|
||||
class NodeInstanceClientProxy;
|
||||
|
||||
class NodeInstanceServerProxy : public NodeInstanceServerInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit NodeInstanceServerProxy(NodeInstanceView *nodeInstanceView);
|
||||
~NodeInstanceServerProxy();
|
||||
void createInstances(const CreateInstancesCommand &command);
|
||||
void changeFileUrl(const ChangeFileUrlCommand &command);
|
||||
void createScene(const CreateSceneCommand &command);
|
||||
void clearScene(const ClearSceneCommand &command);
|
||||
void removeInstances(const RemoveInstancesCommand &command);
|
||||
void removeProperties(const RemovePropertiesCommand &command);
|
||||
void changePropertyBindings(const ChangeBindingsCommand &command);
|
||||
void changePropertyValues(const ChangeValuesCommand &command);
|
||||
void reparentInstances(const ReparentInstancesCommand &command);
|
||||
void changeIds(const ChangeIdsCommand &command);
|
||||
void changeState(const ChangeStateCommand &command);
|
||||
|
||||
void setBlockUpdates(bool block);
|
||||
|
||||
protected:
|
||||
void writeCommand(const QVariant &command);
|
||||
void dispatchCommand(const QVariant &command);
|
||||
NodeInstanceClientInterface *nodeInstanceClient() const;
|
||||
|
||||
signals:
|
||||
void processCrashed();
|
||||
|
||||
private slots:
|
||||
void processFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
||||
void readDataStream();
|
||||
|
||||
private:
|
||||
QWeakPointer<QLocalServer> m_localServer;
|
||||
QWeakPointer<QLocalSocket> m_socket;
|
||||
QWeakPointer<NodeInstanceView> m_nodeInstanceView;
|
||||
QWeakPointer<QProcess> m_qmlPuppetProcess;
|
||||
quint32 m_blockSize;
|
||||
};
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
#endif // NODEINSTANCESERVERPROXY_H
|
||||
@@ -79,8 +79,8 @@ int NodeInstanceSignalSpy::qt_metacall(QMetaObject::Call call, int methodId, voi
|
||||
if (call == QMetaObject::InvokeMetaMethod && methodId > QObject::staticMetaObject.methodCount()) {
|
||||
ObjectNodeInstance::Pointer nodeInstance = m_objectNodeInstance.toStrongRef();
|
||||
|
||||
if (nodeInstance && nodeInstance->nodeInstanceView() && nodeInstance->modelNode().isValid()) {
|
||||
nodeInstance->nodeInstanceView()->notifyPropertyChange(nodeInstance->modelNode(), m_indexPropertyHash.value(methodId));
|
||||
if (nodeInstance && nodeInstance->nodeInstanceServer() && nodeInstance->isValid()) {
|
||||
nodeInstance->nodeInstanceServer()->notifyPropertyChange(nodeInstance->instanceId(), m_indexPropertyHash.value(methodId));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
#include <modelnode.h>
|
||||
#include <propertymetainfo.h>
|
||||
#include <metainfo.h>
|
||||
#include <nodeinstance.h>
|
||||
|
||||
#include <typeinfo>
|
||||
#include <iwidgetplugin.h>
|
||||
@@ -55,9 +54,24 @@
|
||||
#include "nodeabstractproperty.h"
|
||||
#include "nodelistproperty.h"
|
||||
|
||||
#include "objectnodeinstance.h"
|
||||
#include <nodeinstanceserverinterface.h>
|
||||
|
||||
#include "qmlmodelview.h"
|
||||
#include "createscenecommand.h"
|
||||
#include "createinstancescommand.h"
|
||||
#include "clearscenecommand.h"
|
||||
#include "changefileurlcommand.h"
|
||||
#include "reparentinstancescommand.h"
|
||||
#include "changevaluescommand.h"
|
||||
#include "changebindingscommand.h"
|
||||
#include "changeidscommand.h"
|
||||
#include "removeinstancescommand.h"
|
||||
#include "removepropertiescommand.h"
|
||||
#include "valueschangedcommand.h"
|
||||
#include "pixmapchangedcommand.h"
|
||||
#include "informationchangedcommand.h"
|
||||
#include "changestatecommand.h"
|
||||
|
||||
#include "nodeinstanceserverproxy.h"
|
||||
|
||||
enum {
|
||||
debug = false
|
||||
@@ -91,14 +105,8 @@ d too.
|
||||
*/
|
||||
NodeInstanceView::NodeInstanceView(QObject *parent)
|
||||
: AbstractView(parent),
|
||||
m_graphicsView(new QGraphicsView),
|
||||
m_blockStatePropertyChanges(false)
|
||||
m_blockUpdates(false)
|
||||
{
|
||||
m_graphicsView->setAttribute(Qt::WA_DontShowOnScreen, true);
|
||||
m_graphicsView->setOptimizationFlags(QGraphicsView::DontSavePainterState);
|
||||
m_graphicsView->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
|
||||
m_graphicsView->setScene(new QGraphicsScene(m_graphicsView.data()));
|
||||
m_graphicsView->scene()->setItemIndexMethod(QGraphicsScene::NoIndex);
|
||||
}
|
||||
|
||||
|
||||
@@ -108,6 +116,7 @@ NodeInstanceView::NodeInstanceView(QObject *parent)
|
||||
NodeInstanceView::~NodeInstanceView()
|
||||
{
|
||||
removeAllInstanceNodeRelationships();
|
||||
delete nodeInstanceServer();
|
||||
}
|
||||
|
||||
/*! \name Overloaded Notifiers
|
||||
@@ -122,18 +131,42 @@ NodeInstanceView::~NodeInstanceView()
|
||||
void NodeInstanceView::modelAttached(Model *model)
|
||||
{
|
||||
AbstractView::modelAttached(model);
|
||||
engine()->setBaseUrl(model->fileUrl());
|
||||
loadModel(model);
|
||||
m_nodeInstanceServer = new NodeInstanceServerProxy(this);
|
||||
connect(m_nodeInstanceServer.data(), SIGNAL(processCrashed()), this, SLOT(restartProcess()));
|
||||
m_instanceIdCounter = 1;
|
||||
|
||||
setBlockUpdates(true);
|
||||
nodeInstanceServer()->createScene(createCreateSceneCommand());
|
||||
|
||||
nodeInstanceServer()->changeFileUrl(createChangeFileUrlCommand(model->fileUrl()));
|
||||
|
||||
loadNodes(allModelNodes());
|
||||
setBlockUpdates(false);
|
||||
}
|
||||
|
||||
void NodeInstanceView::modelAboutToBeDetached(Model * model)
|
||||
{
|
||||
removeAllInstanceNodeRelationships();
|
||||
nodeInstanceServer()->clearScene(createClearSceneCommand());
|
||||
delete nodeInstanceServer();
|
||||
AbstractView::modelAboutToBeDetached(model);
|
||||
delete m_engine.data();
|
||||
}
|
||||
|
||||
|
||||
void NodeInstanceView::restartProcess()
|
||||
{
|
||||
setBlockUpdates(true);
|
||||
Model *oldModel = model();
|
||||
if (oldModel) {
|
||||
oldModel->detachView(this);
|
||||
m_valuePropertyChangeList.clear();
|
||||
m_renderImageChangeSet.clear();
|
||||
m_informationChangeSet.clear();
|
||||
oldModel->attachView(this);
|
||||
}
|
||||
setBlockUpdates(false);
|
||||
}
|
||||
|
||||
/*! \brief Notifing the view that a node was created.
|
||||
A NodeInstance will be created for the new created ModelNode.
|
||||
\param createdNode New created ModelNode.
|
||||
@@ -141,9 +174,8 @@ void NodeInstanceView::modelAboutToBeDetached(Model * model)
|
||||
void NodeInstanceView::nodeCreated(const ModelNode &createdNode)
|
||||
{
|
||||
NodeInstance instance = loadNode(createdNode);
|
||||
|
||||
if (instance.isValid())
|
||||
instance.doComponentComplete();
|
||||
nodeInstanceServer()->createInstances(createCreateInstancesCommand(QList<NodeInstance>() << instance));
|
||||
nodeInstanceServer()->changePropertyValues(createChangeValueCommand(createdNode.variantProperties()));
|
||||
}
|
||||
|
||||
/*! \brief Notifing the view that a node was created.
|
||||
@@ -151,6 +183,7 @@ void NodeInstanceView::nodeCreated(const ModelNode &createdNode)
|
||||
*/
|
||||
void NodeInstanceView::nodeAboutToBeRemoved(const ModelNode &removedNode)
|
||||
{
|
||||
nodeInstanceServer()->removeInstances(createRemoveInstancesCommand(removedNode));
|
||||
removeInstanceAndSubInstances(removedNode);
|
||||
}
|
||||
|
||||
@@ -158,118 +191,105 @@ void NodeInstanceView::nodeRemoved(const ModelNode &/*removedNode*/, const NodeA
|
||||
{
|
||||
}
|
||||
|
||||
/*! \brief Notifing the view that a AbstractProperty was added to a ModelNode.
|
||||
void NodeInstanceView::resetHorizontalAnchors(const ModelNode &modelNode)
|
||||
{
|
||||
QList<BindingProperty> bindingList;
|
||||
QList<VariantProperty> valueList;
|
||||
|
||||
The property will be set for the NodeInstance.
|
||||
if (modelNode.hasBindingProperty("x")) {
|
||||
bindingList.append(modelNode.bindingProperty("x"));
|
||||
} else if (modelNode.hasVariantProperty("x")) {
|
||||
valueList.append(modelNode.variantProperty("x"));
|
||||
}
|
||||
|
||||
\param state ModelNode to which the Property belongs
|
||||
\param property AbstractProperty which was added
|
||||
\see AbstractProperty NodeInstance ModelNode
|
||||
*/
|
||||
if (modelNode.hasBindingProperty("width")) {
|
||||
bindingList.append(modelNode.bindingProperty("width"));
|
||||
} else if (modelNode.hasVariantProperty("width")) {
|
||||
valueList.append(modelNode.variantProperty("width"));
|
||||
}
|
||||
|
||||
if (!valueList.isEmpty())
|
||||
nodeInstanceServer()->changePropertyValues(createChangeValueCommand(valueList));
|
||||
|
||||
if (!bindingList.isEmpty())
|
||||
nodeInstanceServer()->changePropertyBindings(createChangeBindingCommand(bindingList));
|
||||
|
||||
}
|
||||
|
||||
void NodeInstanceView::resetVerticalAnchors(const ModelNode &modelNode)
|
||||
{
|
||||
QList<BindingProperty> bindingList;
|
||||
QList<VariantProperty> valueList;
|
||||
|
||||
if (modelNode.hasBindingProperty("yx")) {
|
||||
bindingList.append(modelNode.bindingProperty("yx"));
|
||||
} else if (modelNode.hasVariantProperty("y")) {
|
||||
valueList.append(modelNode.variantProperty("y"));
|
||||
}
|
||||
|
||||
if (modelNode.hasBindingProperty("height")) {
|
||||
bindingList.append(modelNode.bindingProperty("height"));
|
||||
} else if (modelNode.hasVariantProperty("height")) {
|
||||
valueList.append(modelNode.variantProperty("height"));
|
||||
}
|
||||
|
||||
if (!valueList.isEmpty())
|
||||
nodeInstanceServer()->changePropertyValues(createChangeValueCommand(valueList));
|
||||
|
||||
if (!bindingList.isEmpty())
|
||||
nodeInstanceServer()->changePropertyBindings(createChangeBindingCommand(bindingList));
|
||||
}
|
||||
|
||||
void NodeInstanceView::propertiesAboutToBeRemoved(const QList<AbstractProperty>& propertyList)
|
||||
{
|
||||
foreach (const AbstractProperty &property, propertyList) {
|
||||
resetInstanceProperty(property);
|
||||
|
||||
QList<ModelNode> nodeList;
|
||||
QList<AbstractProperty> nonNodePropertyList;
|
||||
|
||||
foreach (const AbstractProperty &property, propertyList) {
|
||||
if (property.isNodeAbstractProperty()) {
|
||||
foreach (const ModelNode &subNode, property.toNodeAbstractProperty().allSubNodes())
|
||||
removeInstanceNodeRelationship(subNode);
|
||||
nodeList.append(property.toNodeAbstractProperty().allSubNodes());
|
||||
} else {
|
||||
nonNodePropertyList.append(property);
|
||||
}
|
||||
}
|
||||
|
||||
nodeInstanceServer()->removeInstances(createRemoveInstancesCommand(nodeList));
|
||||
nodeInstanceServer()->removeProperties(createRemovePropertiesCommand(nonNodePropertyList));
|
||||
|
||||
foreach (const AbstractProperty &property, propertyList) {
|
||||
const QString &name = property.name();
|
||||
if (name == "anchors.fill") {
|
||||
resetHorizontalAnchors(property.parentModelNode());
|
||||
resetVerticalAnchors(property.parentModelNode());
|
||||
} else if (name == "anchors.centerIn") {
|
||||
resetHorizontalAnchors(property.parentModelNode());
|
||||
resetVerticalAnchors(property.parentModelNode());
|
||||
} else if (name == "anchors.top") {
|
||||
resetVerticalAnchors(property.parentModelNode());
|
||||
} else if (name == "anchors.left") {
|
||||
resetHorizontalAnchors(property.parentModelNode());
|
||||
} else if (name == "anchors.right") {
|
||||
resetHorizontalAnchors(property.parentModelNode());
|
||||
} else if (name == "anchors.bottom") {
|
||||
resetVerticalAnchors(property.parentModelNode());
|
||||
} else if (name == "anchors.horizontalCenter") {
|
||||
resetHorizontalAnchors(property.parentModelNode());
|
||||
} else if (name == "anchors.verticalCenter") {
|
||||
resetVerticalAnchors(property.parentModelNode());
|
||||
} else if (name == "anchors.baseline") {
|
||||
resetVerticalAnchors(property.parentModelNode());
|
||||
}
|
||||
}
|
||||
|
||||
foreach (const ModelNode &node, nodeList)
|
||||
removeInstanceNodeRelationship(node);
|
||||
}
|
||||
|
||||
void NodeInstanceView::propertiesRemoved(const QList<AbstractProperty>& /*propertyList*/)
|
||||
{
|
||||
}
|
||||
|
||||
void NodeInstanceView::resetInstanceProperty(const AbstractProperty &property)
|
||||
{
|
||||
if (hasInstanceForNode(property.parentModelNode())) { // TODO ugly workaround
|
||||
NodeInstance instance = instanceForNode(property.parentModelNode());
|
||||
Q_ASSERT(instance.isValid());
|
||||
const QString name = property.name();
|
||||
if (activeStateInstance().isValid() && !property.parentModelNode().metaInfo().isSubclassOf("PropertyChange", 4, 7)) {
|
||||
bool statePropertyWasReseted = activeStateInstance().resetStateProperty(instance, name, instance.resetVariant(name));
|
||||
if (!statePropertyWasReseted)
|
||||
instance.resetProperty(name);
|
||||
} else {
|
||||
instance.resetProperty(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceView::setInstancePropertyBinding(const BindingProperty &property)
|
||||
{
|
||||
NodeInstance instance = instanceForNode(property.parentModelNode());
|
||||
|
||||
const QString name = property.name();
|
||||
const QString expression = property.expression();
|
||||
|
||||
|
||||
if (activeStateInstance().isValid() && !property.parentModelNode().metaInfo().isSubclassOf("PropertyChange", 4, 7)) {
|
||||
bool stateBindingWasUpdated = activeStateInstance().updateStateBinding(instance, name, expression);
|
||||
if (!stateBindingWasUpdated) {
|
||||
if (property.isDynamic())
|
||||
instance.setPropertyDynamicBinding(name, property.dynamicTypeName(), expression);
|
||||
else
|
||||
instance.setPropertyBinding(name, expression);
|
||||
}
|
||||
} else {
|
||||
if (property.isDynamic())
|
||||
instance.setPropertyDynamicBinding(name, property.dynamicTypeName(), expression);
|
||||
else
|
||||
instance.setPropertyBinding(name, expression);
|
||||
}
|
||||
|
||||
|
||||
if (property.parentModelNode().isRootNode()
|
||||
&& (name == "width" || name == "height")) {
|
||||
QGraphicsObject *rootGraphicsObject = qobject_cast<QGraphicsObject*>(instance.internalObject());
|
||||
if (rootGraphicsObject) {
|
||||
m_graphicsView->setSceneRect(rootGraphicsObject->boundingRect());
|
||||
}
|
||||
}
|
||||
|
||||
instance.paintUpdate();
|
||||
|
||||
}
|
||||
|
||||
void NodeInstanceView::setInstancePropertyVariant(const VariantProperty &property)
|
||||
{
|
||||
NodeInstance instance = instanceForNode(property.parentModelNode());
|
||||
|
||||
const QString name = property.name();
|
||||
const QVariant value = property.value();
|
||||
|
||||
|
||||
if (activeStateInstance().isValid() && !property.parentModelNode().metaInfo().isSubclassOf("PropertyChange", 4, 7)) {
|
||||
bool stateValueWasUpdated = activeStateInstance().updateStateVariant(instance, name, value);
|
||||
if (!stateValueWasUpdated) {
|
||||
if (property.isDynamic())
|
||||
instance.setPropertyDynamicVariant(name, property.dynamicTypeName(), value);
|
||||
else
|
||||
instance.setPropertyVariant(name, value);
|
||||
}
|
||||
} else { //base state
|
||||
if (property.isDynamic())
|
||||
instance.setPropertyDynamicVariant(name, property.dynamicTypeName(), value);
|
||||
else
|
||||
instance.setPropertyVariant(name, value);
|
||||
}
|
||||
|
||||
|
||||
if (property.parentModelNode().isRootNode()
|
||||
&& (name == "width" || name == "height")) {
|
||||
QGraphicsObject *rootGraphicsObject = qobject_cast<QGraphicsObject*>(instance.internalObject());
|
||||
if (rootGraphicsObject) {
|
||||
m_graphicsView->setSceneRect(rootGraphicsObject->boundingRect());
|
||||
}
|
||||
}
|
||||
|
||||
instance.paintUpdate();
|
||||
}
|
||||
|
||||
void NodeInstanceView::removeInstanceAndSubInstances(const ModelNode &node)
|
||||
{
|
||||
foreach(const ModelNode &subNode, node.allSubModelNodes()) {
|
||||
@@ -283,19 +303,20 @@ void NodeInstanceView::removeInstanceAndSubInstances(const ModelNode &node)
|
||||
|
||||
void NodeInstanceView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/)
|
||||
{
|
||||
nodeInstanceServer()->clearScene(createClearSceneCommand());
|
||||
removeAllInstanceNodeRelationships();
|
||||
|
||||
QList<ModelNode> nodeList;
|
||||
|
||||
nodeList.append(allModelNodes());
|
||||
|
||||
nodeInstanceServer()->createScene(createCreateSceneCommand());
|
||||
loadNodes(nodeList);
|
||||
}
|
||||
|
||||
void NodeInstanceView::bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags /*propertyChange*/)
|
||||
{
|
||||
foreach (const BindingProperty &property, propertyList)
|
||||
setInstancePropertyBinding(property);
|
||||
nodeInstanceServer()->changePropertyBindings(createChangeBindingCommand(propertyList));
|
||||
}
|
||||
|
||||
/*! \brief Notifing the view that a AbstractProperty value was changed to a ModelNode.
|
||||
@@ -311,8 +332,7 @@ void NodeInstanceView::bindingPropertiesChanged(const QList<BindingProperty>& pr
|
||||
|
||||
void NodeInstanceView::variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags /*propertyChange*/)
|
||||
{
|
||||
foreach (const VariantProperty &property, propertyList)
|
||||
setInstancePropertyVariant(property);
|
||||
nodeInstanceServer()->changePropertyValues(createChangeValueCommand(propertyList));
|
||||
}
|
||||
/*! \brief Notifing the view that a ModelNode has a new Parent.
|
||||
|
||||
@@ -328,39 +348,54 @@ void NodeInstanceView::variantPropertiesChanged(const QList<VariantProperty>& pr
|
||||
|
||||
void NodeInstanceView::nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags /*propertyChange*/)
|
||||
{
|
||||
NodeInstance nodeInstance(instanceForNode(node));
|
||||
NodeInstance oldParentInstance;
|
||||
if (hasInstanceForNode(oldPropertyParent.parentModelNode()))
|
||||
oldParentInstance = instanceForNode(oldPropertyParent.parentModelNode());
|
||||
NodeInstance newParentInstance;
|
||||
if (hasInstanceForNode(newPropertyParent.parentModelNode()))
|
||||
newParentInstance = instanceForNode(newPropertyParent.parentModelNode());
|
||||
nodeInstance.reparent(oldParentInstance, oldPropertyParent.name(), newParentInstance, newPropertyParent.name());
|
||||
nodeInstanceServer()->reparentInstances(createReparentInstancesCommand(node, newPropertyParent, oldPropertyParent));
|
||||
// NodeInstance nodeInstance(instanceForNode(node));
|
||||
// NodeInstance oldParentInstance;
|
||||
// if (hasInstanceForNode(oldPropertyParent.parentModelNode()))
|
||||
// oldParentInstance = instanceForNode(oldPropertyParent.parentModelNode());
|
||||
// NodeInstance newParentInstance;
|
||||
// if (hasInstanceForNode(newPropertyParent.parentModelNode()))
|
||||
// newParentInstance = instanceForNode(newPropertyParent.parentModelNode());
|
||||
// nodeInstance.reparent(oldParentInstance, oldPropertyParent.name(), newParentInstance, newPropertyParent.name());
|
||||
}
|
||||
|
||||
void NodeInstanceView::fileUrlChanged(const QUrl &/*oldUrl*/, const QUrl &/*newUrl*/)
|
||||
void NodeInstanceView::fileUrlChanged(const QUrl &/*oldUrl*/, const QUrl &newUrl)
|
||||
{
|
||||
// TODO: We have to probably reload everything, so that images etc are updated!!!
|
||||
engine()->setBaseUrl(model()->fileUrl());
|
||||
//engine()->setBaseUrl(model()->fileUrl());
|
||||
|
||||
//TODO reload the whole scene
|
||||
nodeInstanceServer()->changeFileUrl(createChangeFileUrlCommand(newUrl));
|
||||
}
|
||||
|
||||
void NodeInstanceView::nodeIdChanged(const ModelNode& node, const QString& newId, const QString& /*oldId*/)
|
||||
void NodeInstanceView::nodeIdChanged(const ModelNode& node, const QString& /*newId*/, const QString& /*oldId*/)
|
||||
{
|
||||
if (hasInstanceForNode(node)) {
|
||||
NodeInstance instance = instanceForNode(node);
|
||||
|
||||
instance.setId(newId);
|
||||
nodeInstanceServer()->changeIds(createChangeIdsCommand(QList<NodeInstance>() << instance));
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceView::nodeOrderChanged(const NodeListProperty & listProperty,
|
||||
const ModelNode & /*movedNode*/, int /*oldIndex*/)
|
||||
{
|
||||
QVector<ReparentContainer> containerList;
|
||||
QString propertyName = listProperty.name();
|
||||
qint32 containerInstanceId = -1;
|
||||
ModelNode containerNode = listProperty.parentModelNode();
|
||||
if (hasInstanceForNode(containerNode))
|
||||
containerInstanceId = instanceForNode(containerNode).instanceId();
|
||||
|
||||
foreach(const ModelNode &node, listProperty.toModelNodeList()) {
|
||||
NodeInstance instance = instanceForNode(node);
|
||||
if (instance.isValid())
|
||||
instance.reparent(instance.parent(), listProperty.name(), instance.parent(), listProperty.name());
|
||||
qint32 instanceId = -1;
|
||||
if (hasInstanceForNode(node)) {
|
||||
instanceId = instanceForNode(node).instanceId();
|
||||
ReparentContainer container(instanceId, containerInstanceId, propertyName, containerInstanceId, propertyName);
|
||||
containerList.append(container);
|
||||
}
|
||||
}
|
||||
|
||||
nodeInstanceServer()->reparentInstances(ReparentInstancesCommand(containerList));
|
||||
}
|
||||
|
||||
/*! \brief Notifing the view that the selection has been changed.
|
||||
@@ -393,60 +428,57 @@ void NodeInstanceView::instancePropertyChange(const QList<QPair<ModelNode, QStri
|
||||
|
||||
void NodeInstanceView::loadNodes(const QList<ModelNode> &nodeList)
|
||||
{
|
||||
QList<NodeInstance> instanceList;
|
||||
|
||||
foreach (const ModelNode &node, nodeList)
|
||||
loadNode(node);
|
||||
instanceList.append(loadNode(node));
|
||||
|
||||
|
||||
QList<VariantProperty> variantPropertyList;
|
||||
QList<BindingProperty> bindingPropertyList;
|
||||
|
||||
foreach (const ModelNode &node, nodeList) {
|
||||
if (node.hasParentProperty())
|
||||
instanceForNode(node).reparent(NodeInstance(), QString(), instanceForNode(node.parentProperty().parentModelNode()), node.parentProperty().name());
|
||||
variantPropertyList.append(node.variantProperties());
|
||||
bindingPropertyList.append(node.bindingProperties());
|
||||
}
|
||||
|
||||
foreach (const ModelNode &node, nodeList) {
|
||||
foreach (const BindingProperty &property, node.bindingProperties())
|
||||
instanceForNode(node).setPropertyBinding(property.name(), property.expression());
|
||||
}
|
||||
// QListIterator<ModelNode> listIterator(nodeList);
|
||||
// listIterator.toBack();
|
||||
|
||||
QListIterator<ModelNode> listIterator(nodeList);
|
||||
listIterator.toBack();
|
||||
// while (listIterator.hasPrevious())
|
||||
// instanceForNode(listIterator.previous()).doComponentComplete();
|
||||
|
||||
while (listIterator.hasPrevious())
|
||||
instanceForNode(listIterator.previous()).doComponentComplete();
|
||||
}
|
||||
|
||||
// TODO: Set base state as current model state
|
||||
void NodeInstanceView::loadModel(Model *model)
|
||||
{
|
||||
removeAllInstanceNodeRelationships();
|
||||
|
||||
engine()->rootContext()->setBaseUrl(model->fileUrl());
|
||||
|
||||
loadNodes(allModelNodes());
|
||||
nodeInstanceServer()->createInstances(createCreateInstancesCommand(instanceList));
|
||||
nodeInstanceServer()->reparentInstances(createReparentInstancesCommand(instanceList));
|
||||
nodeInstanceServer()->changeIds(createChangeIdsCommand(instanceList));
|
||||
nodeInstanceServer()->changePropertyValues(createChangeValueCommand(variantPropertyList));
|
||||
nodeInstanceServer()->changePropertyBindings(createChangeBindingCommand(bindingPropertyList));
|
||||
}
|
||||
|
||||
void NodeInstanceView::removeAllInstanceNodeRelationships()
|
||||
{
|
||||
// prevent destroyed() signals calling back
|
||||
|
||||
foreach (NodeInstance instance, m_objectInstanceHash.values()) {
|
||||
if (instance.isValid())
|
||||
instance.setId(QString());
|
||||
}
|
||||
// foreach (NodeInstance instance, m_objectInstanceHash.values()) {
|
||||
// if (instance.isValid())
|
||||
// instance.setId(QString());
|
||||
// }
|
||||
|
||||
//first the root object
|
||||
if (rootNodeInstance().internalObject())
|
||||
rootNodeInstance().internalObject()->disconnect();
|
||||
// //first the root object
|
||||
// if (rootNodeInstance().internalObject())
|
||||
// rootNodeInstance().internalObject()->disconnect();
|
||||
|
||||
rootNodeInstance().makeInvalid();
|
||||
// rootNodeInstance().makeInvalid();
|
||||
|
||||
|
||||
foreach (NodeInstance instance, m_objectInstanceHash.values()) {
|
||||
if (instance.internalObject())
|
||||
instance.internalObject()->disconnect();
|
||||
foreach (NodeInstance instance, m_idInstanceHash.values()) {
|
||||
// if (instance.internalObject())
|
||||
// instance.internalObject()->disconnect();
|
||||
instance.makeInvalid();
|
||||
}
|
||||
}
|
||||
|
||||
m_nodeInstanceHash.clear();
|
||||
m_objectInstanceHash.clear();
|
||||
m_idInstanceHash.clear();
|
||||
}
|
||||
|
||||
/*! \brief Returns a List of all NodeInstances
|
||||
@@ -467,7 +499,7 @@ QList<NodeInstance> NodeInstanceView::instances() const
|
||||
\returns NodeStance for ModelNode.
|
||||
\see NodeInstance
|
||||
*/
|
||||
NodeInstance NodeInstanceView::instanceForNode(const ModelNode &node)
|
||||
NodeInstance NodeInstanceView::instanceForNode(const ModelNode &node) const
|
||||
{
|
||||
Q_ASSERT(node.isValid());
|
||||
Q_ASSERT(m_nodeInstanceHash.contains(node));
|
||||
@@ -475,25 +507,25 @@ NodeInstance NodeInstanceView::instanceForNode(const ModelNode &node)
|
||||
return m_nodeInstanceHash.value(node);
|
||||
}
|
||||
|
||||
bool NodeInstanceView::hasInstanceForNode(const ModelNode &node)
|
||||
bool NodeInstanceView::hasInstanceForNode(const ModelNode &node) const
|
||||
{
|
||||
return m_nodeInstanceHash.contains(node);
|
||||
}
|
||||
|
||||
NodeInstance NodeInstanceView::instanceForObject(QObject *object)
|
||||
NodeInstance NodeInstanceView::instanceForId(qint32 id) const
|
||||
{
|
||||
if (object == 0)
|
||||
if (id < 0)
|
||||
return NodeInstance();
|
||||
|
||||
return m_objectInstanceHash.value(object);
|
||||
return m_idInstanceHash.value(id);
|
||||
}
|
||||
|
||||
bool NodeInstanceView::hasInstanceForObject(QObject *object)
|
||||
bool NodeInstanceView::hasInstanceForId(qint32 id) const
|
||||
{
|
||||
if (object == 0)
|
||||
if (id < 0)
|
||||
return false;
|
||||
|
||||
return m_objectInstanceHash.contains(object);
|
||||
return m_idInstanceHash.contains(id);
|
||||
}
|
||||
|
||||
|
||||
@@ -536,63 +568,54 @@ NodeInstance NodeInstanceView::rootNodeInstance() const
|
||||
|
||||
|
||||
|
||||
void NodeInstanceView::insertInstanceNodeRelationship(const ModelNode &node, const NodeInstance &instance)
|
||||
void NodeInstanceView::insertInstanceRelationships(const NodeInstance &instance)
|
||||
{
|
||||
instance.internalObject()->installEventFilter(childrenChangeEventFilter());
|
||||
|
||||
|
||||
Q_ASSERT(!m_nodeInstanceHash.contains(node));
|
||||
m_nodeInstanceHash.insert(node, instance);
|
||||
m_objectInstanceHash.insert(instance.internalObject(), instance);
|
||||
}
|
||||
|
||||
QDeclarativeEngine *NodeInstanceView::engine()
|
||||
{
|
||||
if (m_engine.isNull())
|
||||
m_engine = new QDeclarativeEngine(this);
|
||||
return m_engine.data();
|
||||
}
|
||||
|
||||
Internal::ChildrenChangeEventFilter *NodeInstanceView::childrenChangeEventFilter()
|
||||
{
|
||||
if (m_childrenChangeEventFilter.isNull()) {
|
||||
m_childrenChangeEventFilter = new Internal::ChildrenChangeEventFilter(this);
|
||||
connect(m_childrenChangeEventFilter.data(), SIGNAL(childrenChanged(QObject*)), this, SLOT(emitParentChanged(QObject*)));
|
||||
}
|
||||
|
||||
return m_childrenChangeEventFilter.data();
|
||||
Q_ASSERT(instance.instanceId() >=0);
|
||||
Q_ASSERT(!m_nodeInstanceHash.contains(instance.modelNode()));
|
||||
Q_ASSERT(!m_idInstanceHash.contains(instance.instanceId()));
|
||||
m_nodeInstanceHash.insert(instance.modelNode(), instance);
|
||||
m_idInstanceHash.insert(instance.instanceId(), instance);
|
||||
}
|
||||
|
||||
void NodeInstanceView::removeInstanceNodeRelationship(const ModelNode &node)
|
||||
{
|
||||
Q_ASSERT(m_nodeInstanceHash.contains(node));
|
||||
NodeInstance instance = instanceForNode(node);
|
||||
if (instance.isValid())
|
||||
instance.setId(QString());
|
||||
m_objectInstanceHash.remove(instanceForNode(node).internalObject());
|
||||
// if (instance.isValid())
|
||||
// instance.setId(QString());
|
||||
m_idInstanceHash.remove(instanceForNode(node).instanceId());
|
||||
m_nodeInstanceHash.remove(node);
|
||||
instance.makeInvalid();
|
||||
}
|
||||
|
||||
void NodeInstanceView::notifyPropertyChange(const ModelNode &node, const QString &propertyName)
|
||||
void NodeInstanceView::setBlockUpdates(bool block)
|
||||
{
|
||||
if (m_blockStatePropertyChanges)
|
||||
return;
|
||||
if (m_blockUpdates == 0 && block == true)
|
||||
m_nodeInstanceServer->setBlockUpdates(true);
|
||||
|
||||
if (!node.isValid())
|
||||
return;
|
||||
if (block) {
|
||||
m_blockUpdates++;
|
||||
} else if (m_blockUpdates > 0) {
|
||||
m_blockUpdates--;
|
||||
}
|
||||
|
||||
if (hasInstanceForNode(node))
|
||||
instanceForNode(node).renderPixmapNextPaint();
|
||||
if (m_blockUpdates == 0) {
|
||||
m_nodeInstanceServer->setBlockUpdates(false);
|
||||
if (!m_valuePropertyChangeList.isEmpty()) {
|
||||
emitInstancePropertyChange(m_valuePropertyChangeList);
|
||||
m_valuePropertyChangeList.clear();
|
||||
}
|
||||
|
||||
if (!m_informationChangeSet.isEmpty()) {
|
||||
emitCustomNotification("__instance information changed__", m_informationChangeSet.toList());
|
||||
m_informationChangeSet.clear();
|
||||
}
|
||||
|
||||
emitInstancePropertyChange(QList<QPair<ModelNode, QString> >() << qMakePair(node, propertyName));
|
||||
}
|
||||
|
||||
|
||||
void NodeInstanceView::setBlockStatePropertyChanges(bool block)
|
||||
{
|
||||
m_blockStatePropertyChanges = block;
|
||||
if (!m_renderImageChangeSet.isEmpty()) {
|
||||
emitCustomNotification("__instance render pixmap changed__", m_renderImageChangeSet.toList());
|
||||
m_renderImageChangeSet.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceView::setStateInstance(const NodeInstance &stateInstance)
|
||||
@@ -610,26 +633,25 @@ NodeInstance NodeInstanceView::activeStateInstance() const
|
||||
return m_activeStateInstance;
|
||||
}
|
||||
|
||||
void NodeInstanceView::emitParentChanged(QObject *child)
|
||||
NodeInstanceServerInterface *NodeInstanceView::nodeInstanceServer() const
|
||||
{
|
||||
if (hasInstanceForObject(child)) {
|
||||
notifyPropertyChange(instanceForObject(child).modelNode(), "parent");
|
||||
}
|
||||
return m_nodeInstanceServer.data();
|
||||
}
|
||||
|
||||
NodeInstance NodeInstanceView::loadNode(const ModelNode &node, QObject *objectToBeWrapped)
|
||||
{
|
||||
NodeInstance instance(NodeInstance::create(this, node, objectToBeWrapped));
|
||||
|
||||
insertInstanceNodeRelationship(node, instance);
|
||||
NodeInstance NodeInstanceView::loadNode(const ModelNode &node)
|
||||
{
|
||||
qint32 instanceId = 0;
|
||||
|
||||
if (!node.isRootNode())
|
||||
instanceId = generateInstanceId();
|
||||
|
||||
NodeInstance instance(NodeInstance::create(node, instanceId));
|
||||
|
||||
insertInstanceRelationships(instance);
|
||||
|
||||
if (node.isRootNode()) {
|
||||
m_rootNodeInstance = instance;
|
||||
QGraphicsObject *rootGraphicsObject = qobject_cast<QGraphicsObject*>(instance.internalObject());
|
||||
if (rootGraphicsObject) {
|
||||
m_graphicsView->scene()->addItem(rootGraphicsObject);
|
||||
m_graphicsView->setSceneRect(rootGraphicsObject->boundingRect());
|
||||
}
|
||||
}
|
||||
|
||||
return instance;
|
||||
@@ -637,22 +659,24 @@ NodeInstance NodeInstanceView::loadNode(const ModelNode &node, QObject *objectTo
|
||||
|
||||
void NodeInstanceView::activateState(const NodeInstance &instance)
|
||||
{
|
||||
activateBaseState();
|
||||
NodeInstance stateInstance(instance);
|
||||
stateInstance.activateState();
|
||||
nodeInstanceServer()->changeState(ChangeStateCommand(instance.instanceId()));
|
||||
// activateBaseState();
|
||||
// NodeInstance stateInstance(instance);
|
||||
// stateInstance.activateState();
|
||||
}
|
||||
|
||||
void NodeInstanceView::activateBaseState()
|
||||
{
|
||||
if (activeStateInstance().isValid())
|
||||
activeStateInstance().deactivateState();
|
||||
nodeInstanceServer()->changeState(ChangeStateCommand(-1));
|
||||
// if (activeStateInstance().isValid())
|
||||
// activeStateInstance().deactivateState();
|
||||
}
|
||||
|
||||
void NodeInstanceView::removeRecursiveChildRelationship(const ModelNode &removedNode)
|
||||
{
|
||||
if (hasInstanceForNode(removedNode)) {
|
||||
instanceForNode(removedNode).setId(QString());
|
||||
}
|
||||
// if (hasInstanceForNode(removedNode)) {
|
||||
// instanceForNode(removedNode).setId(QString());
|
||||
// }
|
||||
|
||||
foreach (const ModelNode &childNode, removedNode.allDirectSubModelNodes())
|
||||
removeRecursiveChildRelationship(childNode);
|
||||
@@ -662,64 +686,238 @@ void NodeInstanceView::removeRecursiveChildRelationship(const ModelNode &removed
|
||||
|
||||
void NodeInstanceView::render(QPainter * painter, const QRectF &target, const QRectF &source, Qt::AspectRatioMode aspectRatioMode)
|
||||
{
|
||||
if (m_graphicsView) {
|
||||
painter->save();
|
||||
painter->setRenderHint(QPainter::Antialiasing, true);
|
||||
painter->setRenderHint(QPainter::TextAntialiasing, true);
|
||||
painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
|
||||
painter->setRenderHint(QPainter::HighQualityAntialiasing, true);
|
||||
painter->setRenderHint(QPainter::NonCosmeticDefaultPen, true);
|
||||
m_graphicsView->scene()->render(painter, target, source, aspectRatioMode);
|
||||
painter->restore();
|
||||
}
|
||||
// if (m_graphicsView) {
|
||||
// painter->save();
|
||||
// painter->setRenderHint(QPainter::Antialiasing, true);
|
||||
// painter->setRenderHint(QPainter::TextAntialiasing, true);
|
||||
// painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
|
||||
// painter->setRenderHint(QPainter::HighQualityAntialiasing, true);
|
||||
// painter->setRenderHint(QPainter::NonCosmeticDefaultPen, true);
|
||||
// m_graphicsView->scene()->render(painter, target, source, aspectRatioMode);
|
||||
// painter->restore();
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
QRectF NodeInstanceView::sceneRect() const
|
||||
{
|
||||
if (m_graphicsView)
|
||||
if (rootNodeInstance().isValid())
|
||||
return rootNodeInstance().boundingRect();
|
||||
|
||||
return QRectF();
|
||||
}
|
||||
|
||||
|
||||
QFileSystemWatcher *NodeInstanceView::fileSystemWatcher()
|
||||
CreateSceneCommand NodeInstanceView::createCreateSceneCommand() const
|
||||
{
|
||||
if (m_fileSystemWatcher.isNull()) {
|
||||
m_fileSystemWatcher = new QFileSystemWatcher(this);
|
||||
connect(m_fileSystemWatcher.data(), SIGNAL(fileChanged(QString)), this, SLOT(refreshLocalFileProperty(QString)));
|
||||
return CreateSceneCommand();
|
||||
}
|
||||
ClearSceneCommand NodeInstanceView::createClearSceneCommand() const
|
||||
{
|
||||
return ClearSceneCommand();
|
||||
}
|
||||
|
||||
CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QList<NodeInstance> &instanceList) const
|
||||
{
|
||||
QVector<InstanceContainer> containerList;
|
||||
foreach(const NodeInstance &instance, instanceList) {
|
||||
InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(), instance.modelNode().metaInfo().componentString());
|
||||
containerList.append(container);
|
||||
}
|
||||
|
||||
return m_fileSystemWatcher.data();
|
||||
return CreateInstancesCommand(containerList);
|
||||
}
|
||||
|
||||
void NodeInstanceView::addFilePropertyToFileSystemWatcher(QObject *object, const QString &propertyName, const QString &path)
|
||||
ReparentInstancesCommand NodeInstanceView::createReparentInstancesCommand(const QList<NodeInstance> &instanceList) const
|
||||
{
|
||||
m_fileSystemWatcherHash.insert(path, ObjectPropertyPair(object, propertyName));
|
||||
fileSystemWatcher()->addPath(path);
|
||||
QVector<ReparentContainer> containerList;
|
||||
foreach(const NodeInstance &instance, instanceList) {
|
||||
if (instance.modelNode().hasParentProperty()) {
|
||||
NodeAbstractProperty parentProperty = instance.modelNode().parentProperty();
|
||||
ReparentContainer container(instance.instanceId(), -1, QString(), instanceForNode(parentProperty.parentModelNode()).instanceId(), parentProperty.name());
|
||||
containerList.append(container);
|
||||
}
|
||||
}
|
||||
|
||||
return ReparentInstancesCommand(containerList);
|
||||
}
|
||||
|
||||
void NodeInstanceView::removeFilePropertyFromFileSystemWatcher(QObject *object, const QString &propertyName, const QString &path)
|
||||
ReparentInstancesCommand NodeInstanceView::createReparentInstancesCommand(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent) const
|
||||
{
|
||||
fileSystemWatcher()->removePath(path);
|
||||
m_fileSystemWatcherHash.remove(path, ObjectPropertyPair(object, propertyName));
|
||||
QVector<ReparentContainer> containerList;
|
||||
|
||||
qint32 newParentInstanceId = -1;
|
||||
qint32 oldParentInstanceId = -1;
|
||||
|
||||
if (newPropertyParent.isValid() && hasInstanceForNode(newPropertyParent.parentModelNode()))
|
||||
newParentInstanceId = instanceForNode(newPropertyParent.parentModelNode()).instanceId();
|
||||
|
||||
|
||||
if (oldPropertyParent.isValid() && hasInstanceForNode(oldPropertyParent.parentModelNode()))
|
||||
oldParentInstanceId = instanceForNode(oldPropertyParent.parentModelNode()).instanceId();
|
||||
|
||||
|
||||
ReparentContainer container(instanceForNode(node).instanceId(), oldParentInstanceId, oldPropertyParent.name(), newParentInstanceId, newPropertyParent.name());
|
||||
|
||||
containerList.append(container);
|
||||
|
||||
return ReparentInstancesCommand(containerList);
|
||||
}
|
||||
|
||||
void NodeInstanceView::refreshLocalFileProperty(const QString &path)
|
||||
ChangeFileUrlCommand NodeInstanceView::createChangeFileUrlCommand(const QUrl &fileUrl) const
|
||||
{
|
||||
if (m_fileSystemWatcherHash.contains(path)) {
|
||||
QList<ObjectPropertyPair> objectPropertyPairList = m_fileSystemWatcherHash.values();
|
||||
foreach(const ObjectPropertyPair &objectPropertyPair, objectPropertyPairList) {
|
||||
QObject *object = objectPropertyPair.first.data();
|
||||
QString propertyName = objectPropertyPair.second;
|
||||
return ChangeFileUrlCommand(fileUrl);
|
||||
}
|
||||
|
||||
if (hasInstanceForObject(object)) {
|
||||
instanceForObject(object).refreshProperty(propertyName);
|
||||
ChangeValuesCommand NodeInstanceView::createChangeValueCommand(const QList<VariantProperty>& propertyList) const
|
||||
{
|
||||
QVector<PropertyValueContainer> containerList;
|
||||
|
||||
foreach(const VariantProperty &property, propertyList) {
|
||||
ModelNode node = property.parentModelNode();
|
||||
if (node.isValid() && hasInstanceForNode(node)) {
|
||||
NodeInstance instance = instanceForNode(node);
|
||||
PropertyValueContainer container(instance.instanceId(), property.name(), property.value(), property.dynamicTypeName());
|
||||
containerList.append(container);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return ChangeValuesCommand(containerList);
|
||||
}
|
||||
|
||||
ChangeBindingsCommand NodeInstanceView::createChangeBindingCommand(const QList<BindingProperty> &propertyList) const
|
||||
{
|
||||
QVector<PropertyBindingContainer> containerList;
|
||||
|
||||
foreach(const BindingProperty &property, propertyList) {
|
||||
ModelNode node = property.parentModelNode();
|
||||
if (node.isValid() && hasInstanceForNode(node)) {
|
||||
NodeInstance instance = instanceForNode(node);
|
||||
PropertyBindingContainer container(instance.instanceId(), property.name(), property.expression(), property.dynamicTypeName());
|
||||
containerList.append(container);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return ChangeBindingsCommand(containerList);
|
||||
}
|
||||
|
||||
ChangeIdsCommand NodeInstanceView::createChangeIdsCommand(const QList<NodeInstance> &instanceList) const
|
||||
{
|
||||
QVector<IdContainer> containerList;
|
||||
foreach(const NodeInstance &instance, instanceList) {
|
||||
QString id = instance.modelNode().id();
|
||||
if (!id.isEmpty()) {
|
||||
IdContainer container(instance.instanceId(), id);
|
||||
containerList.append(container);
|
||||
}
|
||||
}
|
||||
|
||||
return ChangeIdsCommand(containerList);
|
||||
}
|
||||
|
||||
|
||||
|
||||
RemoveInstancesCommand NodeInstanceView::createRemoveInstancesCommand(const QList<ModelNode> &nodeList) const
|
||||
{
|
||||
QVector<qint32> idList;
|
||||
foreach(const ModelNode &node, nodeList) {
|
||||
if (node.isValid() && hasInstanceForNode(node)) {
|
||||
NodeInstance instance = instanceForNode(node);
|
||||
|
||||
if (instance.instanceId() >= 0) {
|
||||
idList.append(instance.instanceId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return RemoveInstancesCommand(idList);
|
||||
}
|
||||
|
||||
RemoveInstancesCommand NodeInstanceView::createRemoveInstancesCommand(const ModelNode &node) const
|
||||
{
|
||||
QVector<qint32> idList;
|
||||
|
||||
if (node.isValid() && hasInstanceForNode(node))
|
||||
idList.append(instanceForNode(node).instanceId());
|
||||
|
||||
return RemoveInstancesCommand(idList);
|
||||
}
|
||||
|
||||
RemovePropertiesCommand NodeInstanceView::createRemovePropertiesCommand(const QList<AbstractProperty> &propertyList) const
|
||||
{
|
||||
QVector<PropertyAbstractContainer> containerList;
|
||||
|
||||
foreach(const AbstractProperty &property, propertyList) {
|
||||
ModelNode node = property.parentModelNode();
|
||||
if (node.isValid() && hasInstanceForNode(node)) {
|
||||
NodeInstance instance = instanceForNode(node);
|
||||
PropertyAbstractContainer container(instance.instanceId(), property.name(), property.dynamicTypeName());
|
||||
containerList.append(container);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return RemovePropertiesCommand(containerList);
|
||||
}
|
||||
|
||||
void NodeInstanceView::valuesChanged(const ValuesChangedCommand &command)
|
||||
{
|
||||
foreach(const PropertyValueContainer &container, command.valueChanges()) {
|
||||
if (hasInstanceForId(container.instanceId())) {
|
||||
NodeInstance instance = instanceForId(container.instanceId());
|
||||
if (instance.isValid()) {
|
||||
instance.setProperty(container.name(), container.value());
|
||||
m_valuePropertyChangeList.append(qMakePair(instance.modelNode(), container.name()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_blockUpdates && !m_valuePropertyChangeList.isEmpty()) {
|
||||
emitInstancePropertyChange(m_valuePropertyChangeList);
|
||||
m_valuePropertyChangeList.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceView::pixmapChanged(const PixmapChangedCommand &command)
|
||||
{
|
||||
|
||||
if (hasInstanceForId(command.instanceId())) {
|
||||
NodeInstance instance = instanceForId(command.instanceId());
|
||||
if (instance.isValid()) {
|
||||
instance.setRenderImage(command.renderImage());
|
||||
m_renderImageChangeSet.insert(instance.modelNode());
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_blockUpdates && !m_renderImageChangeSet.isEmpty()) {
|
||||
emitCustomNotification("__instance render pixmap changed__", m_renderImageChangeSet.toList());
|
||||
m_renderImageChangeSet.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void NodeInstanceView::informationChanged(const InformationChangedCommand &command)
|
||||
{
|
||||
foreach(const InformationContainer &container, command.informations()) {
|
||||
if (hasInstanceForId(container.instanceId())) {
|
||||
NodeInstance instance = instanceForId(container.instanceId());
|
||||
if (instance.isValid()) {
|
||||
instance.setInformation(container.name(), container.information(), container.secondInformation(), container.thirdInformation());
|
||||
m_informationChangeSet.insert(instance.modelNode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_blockUpdates && !m_informationChangeSet.isEmpty()) {
|
||||
emitCustomNotification("__instance information changed__", m_informationChangeSet.toList());
|
||||
m_informationChangeSet.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
qint32 NodeInstanceView::generateInstanceId()
|
||||
{
|
||||
return m_instanceIdCounter++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -31,12 +31,6 @@
|
||||
|
||||
#include "qmlgraphicsitemnodeinstance.h"
|
||||
#include "graphicsobjectnodeinstance.h"
|
||||
#include "graphicsviewnodeinstance.h"
|
||||
#include "graphicsscenenodeinstance.h"
|
||||
#include "graphicswidgetnodeinstance.h"
|
||||
#include "qmlviewnodeinstance.h"
|
||||
#include "widgetnodeinstance.h"
|
||||
#include "proxywidgetnodeinstance.h"
|
||||
|
||||
#include <invalidreparentingexception.h>
|
||||
#include <invalidnodeinstanceexception.h>
|
||||
@@ -61,6 +55,7 @@
|
||||
#ifndef QT_NO_WEBKIT
|
||||
#include <QGraphicsWebView>
|
||||
#endif
|
||||
#include <QGraphicsObject>
|
||||
|
||||
#include <QTextDocument>
|
||||
|
||||
@@ -76,30 +71,9 @@
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
|
||||
ChildrenChangeEventFilter::ChildrenChangeEventFilter(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool ChildrenChangeEventFilter::eventFilter(QObject * /*object*/, QEvent *event)
|
||||
{
|
||||
switch (event->type()) {
|
||||
case QEvent::ChildAdded:
|
||||
case QEvent::ChildRemoved:
|
||||
{
|
||||
QChildEvent *childEvent = static_cast<QChildEvent*>(event);
|
||||
emit childrenChanged(childEvent->child()); break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
ObjectNodeInstance::ObjectNodeInstance(QObject *object)
|
||||
: m_deleteHeldInstance(true),
|
||||
: m_instanceId(-1),
|
||||
m_deleteHeldInstance(true),
|
||||
m_object(object),
|
||||
m_metaObject(0),
|
||||
m_isInPositioner(false)
|
||||
@@ -118,13 +92,8 @@ void ObjectNodeInstance::destroy()
|
||||
// Remove from old property
|
||||
if (object()) {
|
||||
setId(QString());
|
||||
if (modelNode().isValid() && modelNode().parentProperty().isValid()) {
|
||||
NodeAbstractProperty parentProperty = modelNode().parentProperty();
|
||||
ModelNode parentNode = parentProperty.parentModelNode();
|
||||
if (parentNode.isValid() && nodeInstanceView()->hasInstanceForNode(parentNode)) {
|
||||
NodeInstance parentInstance = nodeInstanceView()->instanceForNode(parentNode);
|
||||
reparent(parentInstance, parentProperty.name(), NodeInstance() , QString());
|
||||
}
|
||||
if (m_instanceId >= 0) {
|
||||
reparent(parentInstance(), m_parentProperty, ObjectNodeInstance::Pointer(), QString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,28 +105,29 @@ void ObjectNodeInstance::destroy()
|
||||
}
|
||||
|
||||
m_metaObject = 0;
|
||||
m_instanceId = -1;
|
||||
}
|
||||
|
||||
ModelNode ObjectNodeInstance::modelNode() const
|
||||
void ObjectNodeInstance::setInstanceId(qint32 id)
|
||||
{
|
||||
return m_modelNode;
|
||||
m_instanceId = id;
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::setModelNode(const ModelNode &node)
|
||||
qint32 ObjectNodeInstance::instanceId() const
|
||||
{
|
||||
m_modelNode = node;
|
||||
return m_instanceId;
|
||||
}
|
||||
|
||||
NodeInstanceView *ObjectNodeInstance::nodeInstanceView() const
|
||||
NodeInstanceServer *ObjectNodeInstance::nodeInstanceServer() const
|
||||
{
|
||||
return m_nodeInstanceView.data();
|
||||
return m_nodeInstanceServer.data();
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::setNodeInstanceView(NodeInstanceView *view)
|
||||
void ObjectNodeInstance::setNodeInstanceServer(NodeInstanceServer *server)
|
||||
{
|
||||
Q_ASSERT(!m_nodeInstanceView.data());
|
||||
Q_ASSERT(!m_nodeInstanceServer.data());
|
||||
|
||||
m_nodeInstanceView = view;
|
||||
m_nodeInstanceServer = server;
|
||||
}
|
||||
|
||||
static bool hasPropertiesWitoutNotifications(const QMetaObject *metaObject)
|
||||
@@ -172,19 +142,15 @@ static bool hasPropertiesWitoutNotifications(const QMetaObject *metaObject)
|
||||
|
||||
void ObjectNodeInstance::initializePropertyWatcher(const ObjectNodeInstance::Pointer &objectNodeInstance)
|
||||
{
|
||||
if (!objectNodeInstance->modelNode().metaInfo().isComponent()) { // TODO: this is a nasty workaround which needs to be removed
|
||||
const QMetaObject *metaObject = objectNodeInstance->object()->metaObject();
|
||||
m_metaObject = new NodeInstanceMetaObject(objectNodeInstance, nodeInstanceView()->engine());
|
||||
for(int propertyIndex = QObject::staticMetaObject.propertyCount(); propertyIndex < metaObject->propertyCount(); propertyIndex++) {
|
||||
if (QDeclarativeMetaType::isQObject(metaObject->property(propertyIndex).userType())) {
|
||||
QObject *propertyObject = QDeclarativeMetaType::toQObject(metaObject->property(propertyIndex).read(objectNodeInstance->object()));
|
||||
if (propertyObject && hasPropertiesWitoutNotifications(propertyObject->metaObject())) {
|
||||
new NodeInstanceMetaObject(objectNodeInstance, propertyObject, metaObject->property(propertyIndex).name(), nodeInstanceView()->engine());
|
||||
}
|
||||
const QMetaObject *metaObject = objectNodeInstance->object()->metaObject();
|
||||
m_metaObject = new NodeInstanceMetaObject(objectNodeInstance, nodeInstanceServer()->engine());
|
||||
for(int propertyIndex = QObject::staticMetaObject.propertyCount(); propertyIndex < metaObject->propertyCount(); propertyIndex++) {
|
||||
if (QDeclarativeMetaType::isQObject(metaObject->property(propertyIndex).userType())) {
|
||||
QObject *propertyObject = QDeclarativeMetaType::toQObject(metaObject->property(propertyIndex).read(objectNodeInstance->object()));
|
||||
if (propertyObject && hasPropertiesWitoutNotifications(propertyObject->metaObject())) {
|
||||
new NodeInstanceMetaObject(objectNodeInstance, propertyObject, metaObject->property(propertyIndex).name(), nodeInstanceServer()->engine());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
qWarning() << "dynamic properties are not supported for components";
|
||||
}
|
||||
|
||||
m_signalSpy.setObjectNodeInstance(objectNodeInstance);
|
||||
@@ -213,35 +179,6 @@ bool ObjectNodeInstance::isQmlGraphicsItem() const
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::isGraphicsScene() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::isGraphicsView() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::isGraphicsWidget() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::isProxyWidget() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::isWidget() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::isQDeclarativeView() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::isGraphicsObject() const
|
||||
{
|
||||
@@ -325,9 +262,9 @@ bool ObjectNodeInstance::isAnchoredByChildren() const
|
||||
return false;
|
||||
}
|
||||
|
||||
QPair<QString, NodeInstance> ObjectNodeInstance::anchor(const QString &/*name*/) const
|
||||
QPair<QString, ServerNodeInstance> ObjectNodeInstance::anchor(const QString &/*name*/) const
|
||||
{
|
||||
return qMakePair(QString(), NodeInstance());
|
||||
return qMakePair(QString(), ServerNodeInstance());
|
||||
}
|
||||
|
||||
|
||||
@@ -384,10 +321,10 @@ void ObjectNodeInstance::removeFromOldProperty(QObject *object, QObject *oldPare
|
||||
return;
|
||||
|
||||
if (isList(property)) {
|
||||
removeObjectFromList(property, object, nodeInstanceView()->engine());
|
||||
removeObjectFromList(property, object, nodeInstanceServer()->engine());
|
||||
} else if (isObject(property)) {
|
||||
if (nodeInstanceView()->hasInstanceForObject(oldParent)) {
|
||||
nodeInstanceView()->instanceForObject(oldParent).resetProperty(oldParentProperty);
|
||||
if (nodeInstanceServer()->hasInstanceForObject(oldParent)) {
|
||||
nodeInstanceServer()->instanceForObject(oldParent).resetProperty(oldParentProperty);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,14 +357,16 @@ void ObjectNodeInstance::addToNewProperty(QObject *object, QObject *newParent, c
|
||||
Q_ASSERT(objectToVariant(object).isValid());
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty)
|
||||
void ObjectNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParentInstance, const QString &oldParentProperty, const ObjectNodeInstance::Pointer &newParentInstance, const QString &newParentProperty)
|
||||
{
|
||||
if (oldParentInstance.isValid()) {
|
||||
removeFromOldProperty(object(), oldParentInstance.internalObject(), oldParentProperty);
|
||||
if (oldParentInstance) {
|
||||
removeFromOldProperty(object(), oldParentInstance->object(), oldParentProperty);
|
||||
m_parentProperty.clear();
|
||||
}
|
||||
|
||||
if (newParentInstance.isValid()) {
|
||||
addToNewProperty(object(), newParentInstance.internalObject(), newParentProperty);
|
||||
if (newParentInstance) {
|
||||
m_parentProperty = newParentProperty;
|
||||
addToNewProperty(object(), newParentInstance->object(), newParentProperty);
|
||||
}
|
||||
|
||||
refreshBindings(context()->engine()->rootContext());
|
||||
@@ -444,22 +383,23 @@ void ObjectNodeInstance::setPropertyVariant(const QString &name, const QVariant
|
||||
if (oldValue.type() == QVariant::Url) {
|
||||
QUrl url = oldValue.toUrl();
|
||||
QString path = url.toLocalFile();
|
||||
if (QFileInfo(path).exists() && nodeInstanceView() && !path.isEmpty())
|
||||
nodeInstanceView()->removeFilePropertyFromFileSystemWatcher(object(), name, path);
|
||||
if (QFileInfo(path).exists() && nodeInstanceServer() && !path.isEmpty())
|
||||
nodeInstanceServer()->removeFilePropertyFromFileSystemWatcher(object(), name, path);
|
||||
}
|
||||
|
||||
|
||||
property.write(value);
|
||||
bool isWritten = property.write(value);
|
||||
|
||||
if (!isWritten)
|
||||
qDebug() << "ObjectNodeInstance.setPropertyVariant: Cannot be written: " << object() << name << value;
|
||||
|
||||
QVariant newValue = property.read();
|
||||
if (newValue.type() == QVariant::Url) {
|
||||
QUrl url = newValue.toUrl();
|
||||
QString path = url.toLocalFile();
|
||||
if (QFileInfo(path).exists() && nodeInstanceView() && !path.isEmpty())
|
||||
nodeInstanceView()->addFilePropertyToFileSystemWatcher(object(), name, path);
|
||||
if (QFileInfo(path).exists() && nodeInstanceServer() && !path.isEmpty())
|
||||
nodeInstanceServer()->addFilePropertyToFileSystemWatcher(object(), name, path);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::setPropertyBinding(const QString &name, const QString &expression)
|
||||
@@ -470,16 +410,17 @@ void ObjectNodeInstance::setPropertyBinding(const QString &name, const QString &
|
||||
return;
|
||||
|
||||
if (property.isProperty()) {
|
||||
QDeclarativeBinding *binding = new QDeclarativeBinding(expression, object(), context());
|
||||
QDeclarativeBinding *binding = new QDeclarativeBinding(expression, object(), context(), object());
|
||||
binding->setTarget(property);
|
||||
binding->setNotifyOnValueChanged(true);
|
||||
QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::setBinding(property, binding);
|
||||
if (oldBinding)
|
||||
oldBinding->destroy();
|
||||
binding->update();
|
||||
if (binding->hasError())
|
||||
qDebug() <<" ObjectNodeInstance.setPropertyBinding has Error: " << object() << name << expression;
|
||||
} else {
|
||||
qWarning() << "Cannot set binding for property" << name << ": property is unknown for type"
|
||||
<< (modelNode().isValid() ? modelNode().type() : "unknown");
|
||||
qWarning() << "ObjectNodeInstance.setPropertyBinding: Cannot set binding for property" << name << ": property is unknown for type";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -511,17 +452,6 @@ void ObjectNodeInstance::resetProperty(const QString &name)
|
||||
doResetProperty("font.pixelSize");
|
||||
}
|
||||
|
||||
NodeInstance ObjectNodeInstance::instanceForNode(const ModelNode &node, const QString &fullname)
|
||||
{
|
||||
if (nodeInstanceView()->hasInstanceForNode(node)) {
|
||||
return nodeInstanceView()->instanceForNode(node);
|
||||
} else {
|
||||
NodeInstance instance(nodeInstanceView()->loadNode(node));
|
||||
m_modelAbstractPropertyHash.insert(fullname, instance);
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::refreshProperty(const QString &name)
|
||||
{
|
||||
QDeclarativeProperty property(object(), name, context());
|
||||
@@ -545,10 +475,18 @@ void ObjectNodeInstance::refreshProperty(const QString &name)
|
||||
property.write(oldValue);
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::hasBindingForProperty(const QString &name) const
|
||||
bool ObjectNodeInstance::hasBindingForProperty(const QString &name, bool *hasChanged) const
|
||||
{
|
||||
QDeclarativeProperty property(object(), name, context());
|
||||
|
||||
bool hasBinding = QDeclarativePropertyPrivate::binding(property);
|
||||
|
||||
if (hasChanged) {
|
||||
*hasChanged = hasBinding != m_hasBindingHash.value(name, false);
|
||||
if (*hasChanged)
|
||||
m_hasBindingHash.insert(name, hasBinding);
|
||||
}
|
||||
|
||||
return QDeclarativePropertyPrivate::binding(property);
|
||||
}
|
||||
|
||||
@@ -565,8 +503,8 @@ void ObjectNodeInstance::doResetProperty(const QString &propertyName)
|
||||
if (oldValue.type() == QVariant::Url) {
|
||||
QUrl url = oldValue.toUrl();
|
||||
QString path = url.toLocalFile();
|
||||
if (QFileInfo(path).exists() && nodeInstanceView())
|
||||
nodeInstanceView()->removeFilePropertyFromFileSystemWatcher(object(), propertyName, path);
|
||||
if (QFileInfo(path).exists() && nodeInstanceServer())
|
||||
nodeInstanceServer()->removeFilePropertyFromFileSystemWatcher(object(), propertyName, path);
|
||||
}
|
||||
|
||||
|
||||
@@ -590,6 +528,7 @@ void ObjectNodeInstance::doResetProperty(const QString &propertyName)
|
||||
} else if (property.isWritable()) {
|
||||
if (property.read() == resetValue(propertyName))
|
||||
return;
|
||||
|
||||
property.write(resetValue(propertyName));
|
||||
}
|
||||
}
|
||||
@@ -613,7 +552,7 @@ QVariant ObjectNodeInstance::property(const QString &name) const
|
||||
return QVariant();
|
||||
|
||||
if (url.scheme() == "file") {
|
||||
int basePathLength = nodeInstanceView()->model()->fileUrl().toLocalFile().lastIndexOf('/');
|
||||
int basePathLength = nodeInstanceServer()->fileUrl().toLocalFile().lastIndexOf('/');
|
||||
return QUrl(url.toLocalFile().mid(basePathLength + 1));
|
||||
}
|
||||
}
|
||||
@@ -621,6 +560,42 @@ QVariant ObjectNodeInstance::property(const QString &name) const
|
||||
return property.read();
|
||||
}
|
||||
|
||||
QStringList allPropertyNames(QObject *object, const QString &baseName = QString(), QObjectList *inspectedObjects = new QObjectList)
|
||||
{
|
||||
QStringList propertyNameList;
|
||||
|
||||
|
||||
if (inspectedObjects->contains(object))
|
||||
return propertyNameList;
|
||||
|
||||
inspectedObjects->append(object);
|
||||
|
||||
|
||||
const QMetaObject *metaObject = object->metaObject();
|
||||
for (int index = 0; index < metaObject->propertyCount(); ++index) {
|
||||
QMetaProperty metaProperty = metaObject->property(index);
|
||||
QDeclarativeProperty declarativeProperty(object, QLatin1String(metaProperty.name()));
|
||||
if (declarativeProperty.isValid() && declarativeProperty.propertyTypeCategory() == QDeclarativeProperty::Object) {
|
||||
QObject *childObject = QDeclarativeMetaType::toQObject(declarativeProperty.read());
|
||||
if (childObject)
|
||||
propertyNameList.append(allPropertyNames(childObject, baseName + QString::fromUtf8(metaProperty.name()) + '.', inspectedObjects));
|
||||
} else if (QDeclarativeValueTypeFactory::valueType(metaProperty.userType())) {
|
||||
QDeclarativeValueType *valueType = QDeclarativeValueTypeFactory::valueType(metaProperty.userType());
|
||||
valueType->setValue(metaProperty.read(object));
|
||||
propertyNameList.append(allPropertyNames(valueType, baseName + QString::fromUtf8(metaProperty.name()) + '.', inspectedObjects));
|
||||
} else {
|
||||
propertyNameList.append(baseName + QString::fromUtf8(metaProperty.name()));
|
||||
}
|
||||
}
|
||||
|
||||
return propertyNameList;
|
||||
}
|
||||
|
||||
QStringList ObjectNodeInstance::propertyNames() const
|
||||
{
|
||||
return allPropertyNames(object());
|
||||
}
|
||||
|
||||
QString ObjectNodeInstance::instanceType(const QString &name) const
|
||||
{
|
||||
QDeclarativeProperty property(object(), name, context());
|
||||
@@ -640,19 +615,10 @@ bool ObjectNodeInstance::deleteHeldInstance() const
|
||||
return m_deleteHeldInstance;
|
||||
}
|
||||
|
||||
ObjectNodeInstance::Pointer ObjectNodeInstance::create(const NodeMetaInfo &nodeMetaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
ObjectNodeInstance::Pointer ObjectNodeInstance::create(QObject *object)
|
||||
{
|
||||
QObject *object = 0;
|
||||
if (objectToBeWrapped)
|
||||
object = objectToBeWrapped;
|
||||
else
|
||||
object = createObject(nodeMetaInfo, context);
|
||||
|
||||
Pointer instance(new ObjectNodeInstance(object));
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
return instance;
|
||||
@@ -744,7 +710,7 @@ static void disableTiledBackingStore(QObject *object)
|
||||
#endif
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::tweakObjects(QObject *object)
|
||||
void tweakObjects(QObject *object)
|
||||
{
|
||||
QObjectList objectList;
|
||||
allSubObject(object, objectList);
|
||||
@@ -754,53 +720,49 @@ void ObjectNodeInstance::tweakObjects(QObject *object)
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Creates an instance of the qml type in the given qml context.
|
||||
|
||||
\throws InvalidArgumentException when the context argument is a null pointer
|
||||
\throws InvalidMetaInfoException if the object is not valid
|
||||
*/
|
||||
QObject *ObjectNodeInstance::createInstance(const NodeMetaInfo &metaInfo, QDeclarativeContext *context)
|
||||
QObject *createComponent(const QString &componentPath, QDeclarativeContext *context)
|
||||
{
|
||||
if (!metaInfo.isValid()) {
|
||||
qWarning() << "NodeMetaInfo is invalid";
|
||||
return 0; // maybe we should return a new QObject?
|
||||
}
|
||||
|
||||
QObject *object = 0;
|
||||
if (metaInfo.isComponent()) {
|
||||
// qml component
|
||||
// TODO: This is maybe expensive ...
|
||||
QDeclarativeComponent component(context->engine(), QUrl::fromLocalFile(metaInfo.componentString()));
|
||||
QDeclarativeContext *newContext = new QDeclarativeContext(context);
|
||||
object = component.beginCreate(newContext);
|
||||
component.completeCreate();
|
||||
newContext->setParent(object);
|
||||
} else {
|
||||
// primitive
|
||||
QDeclarativeType *type = QDeclarativeMetaType::qmlType(metaInfo.typeName().toAscii(), metaInfo.majorVersion(), metaInfo.minorVersion());
|
||||
if (type) {
|
||||
object = type->create();
|
||||
} else {
|
||||
qWarning() << "QuickDesigner: Cannot create an object of type"
|
||||
<< QString("%1 %2,%3").arg(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion())
|
||||
<< "- type isn't known to declarative meta type system";
|
||||
}
|
||||
|
||||
if (object && context)
|
||||
QDeclarativeEngine::setContextForObject(object, context);
|
||||
}
|
||||
|
||||
QDeclarativeEngine::setObjectOwnership(object, QDeclarativeEngine::CppOwnership);
|
||||
|
||||
QDeclarativeComponent component(context->engine(), QUrl::fromLocalFile(componentPath));
|
||||
QDeclarativeContext *newContext = new QDeclarativeContext(context);
|
||||
QObject *object = component.beginCreate(newContext);
|
||||
tweakObjects(object);
|
||||
component.completeCreate();
|
||||
newContext->setParent(object);
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
QObject* ObjectNodeInstance::createObject(const NodeMetaInfo &metaInfo, QDeclarativeContext *context)
|
||||
QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QDeclarativeContext *context)
|
||||
{
|
||||
QObject *object = createInstance(metaInfo, context);
|
||||
QObject *object = 0;
|
||||
QDeclarativeType *type = QDeclarativeMetaType::qmlType(typeName.toUtf8(), majorNumber, minorNumber);
|
||||
if (type) {
|
||||
object = type->create();
|
||||
} else {
|
||||
qWarning() << "QuickDesigner: Cannot create an object of type"
|
||||
<< QString("%1 %2,%3").arg(typeName).arg(majorNumber).arg(minorNumber)
|
||||
<< "- type isn't known to declarative meta type system";
|
||||
}
|
||||
|
||||
tweakObjects(object);
|
||||
|
||||
if (object && context)
|
||||
QDeclarativeEngine::setContextForObject(object, context);
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
QObject* ObjectNodeInstance::createObject(const QString &typeName, int majorNumber, int minorNumber, const QString &componentPath, QDeclarativeContext *context)
|
||||
{
|
||||
QObject *object = 0;
|
||||
if (componentPath.isEmpty()) {
|
||||
object = createPrimitive(typeName, majorNumber, minorNumber, context);
|
||||
} else {
|
||||
object = createComponent(componentPath, context);
|
||||
}
|
||||
|
||||
QDeclarativeEngine::setObjectOwnership(object, QDeclarativeEngine::CppOwnership);
|
||||
|
||||
if (object == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
@@ -849,15 +811,15 @@ QDeclarativeContext *ObjectNodeInstance::context() const
|
||||
QDeclarativeContext *context = QDeclarativeEngine::contextForObject(object());
|
||||
if (context)
|
||||
return context;
|
||||
else if (nodeInstanceView())
|
||||
return nodeInstanceView()->engine()->rootContext();
|
||||
else if (nodeInstanceServer())
|
||||
return nodeInstanceServer()->engine()->rootContext();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
QDeclarativeEngine *ObjectNodeInstance::engine() const
|
||||
{
|
||||
return nodeInstanceView()->engine();
|
||||
return nodeInstanceServer()->engine();
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::paintUpdate()
|
||||
@@ -872,10 +834,15 @@ void ObjectNodeInstance::deactivateState()
|
||||
{
|
||||
}
|
||||
|
||||
QStringList propertyNameForWritableProperties(QObject *object, const QString &baseName = QString())
|
||||
QStringList propertyNameForWritableProperties(QObject *object, const QString &baseName = QString(), QObjectList *inspectedObjects = new QObjectList())
|
||||
{
|
||||
QStringList propertyNameList;
|
||||
|
||||
if (inspectedObjects->contains(object))
|
||||
return propertyNameList;
|
||||
|
||||
inspectedObjects->append(object);
|
||||
|
||||
const QMetaObject *metaObject = object->metaObject();
|
||||
for (int index = 0; index < metaObject->propertyCount(); ++index) {
|
||||
QMetaProperty metaProperty = metaObject->property(index);
|
||||
@@ -883,11 +850,11 @@ QStringList propertyNameForWritableProperties(QObject *object, const QString &ba
|
||||
if (declarativeProperty.isValid() && declarativeProperty.isWritable() && declarativeProperty.propertyTypeCategory() == QDeclarativeProperty::Object) {
|
||||
QObject *childObject = QDeclarativeMetaType::toQObject(declarativeProperty.read());
|
||||
if (childObject)
|
||||
propertyNameList.append(propertyNameForWritableProperties(childObject, baseName + QString::fromUtf8(metaProperty.name()) + '.'));
|
||||
propertyNameList.append(propertyNameForWritableProperties(childObject, baseName + QString::fromUtf8(metaProperty.name()) + '.', inspectedObjects));
|
||||
} else if (QDeclarativeValueTypeFactory::valueType(metaProperty.userType())) {
|
||||
QDeclarativeValueType *valueType = QDeclarativeValueTypeFactory::valueType(metaProperty.userType());
|
||||
valueType->setValue(metaProperty.read(object));
|
||||
propertyNameList.append(propertyNameForWritableProperties(valueType, baseName + QString::fromUtf8(metaProperty.name()) + '.'));
|
||||
propertyNameList.append(propertyNameForWritableProperties(valueType, baseName + QString::fromUtf8(metaProperty.name()) + '.', inspectedObjects));
|
||||
} else if (metaProperty.isReadable() && metaProperty.isWritable()) {
|
||||
propertyNameList.append(baseName + QString::fromUtf8(metaProperty.name()));
|
||||
}
|
||||
@@ -916,9 +883,9 @@ void ObjectNodeInstance::paint(QPainter * /*painter*/)
|
||||
{
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::isTopLevel() const
|
||||
QImage ObjectNodeInstance::renderImage() const
|
||||
{
|
||||
return false;
|
||||
return QImage();
|
||||
}
|
||||
|
||||
QObject *ObjectNodeInstance::parent() const
|
||||
@@ -929,6 +896,31 @@ QObject *ObjectNodeInstance::parent() const
|
||||
return object()->parent();
|
||||
}
|
||||
|
||||
QObject *parentObject(QObject *object)
|
||||
{
|
||||
QGraphicsObject *graphicsObject = qobject_cast<QGraphicsObject*>(object);
|
||||
if (graphicsObject)
|
||||
return graphicsObject->parentObject();
|
||||
|
||||
return object->parent();
|
||||
}
|
||||
|
||||
ObjectNodeInstance::Pointer ObjectNodeInstance::parentInstance() const
|
||||
{
|
||||
QObject *parentHolder = parent();
|
||||
if (!nodeInstanceServer())
|
||||
return Pointer();
|
||||
|
||||
while (parentHolder) {
|
||||
if (nodeInstanceServer()->hasInstanceForObject(parentHolder))
|
||||
return nodeInstanceServer()->instanceForObject(parentHolder).internalInstance();
|
||||
|
||||
parentHolder = parentObject(parentHolder);
|
||||
}
|
||||
|
||||
return Pointer();
|
||||
}
|
||||
|
||||
QRectF ObjectNodeInstance::boundingRect() const
|
||||
{
|
||||
return QRect();
|
||||
@@ -962,13 +954,11 @@ static bool metaObjectHasNotPropertyName(NodeInstanceMetaObject *metaObject, con
|
||||
void ObjectNodeInstance::createDynamicProperty(const QString &name, const QString &/*typeName*/)
|
||||
{
|
||||
if (m_metaObject == 0) {
|
||||
qWarning() << "dynamic properties are not supported for components";
|
||||
qWarning() << "ObjectNodeInstance.createDynamicProperty: No Metaobject.";
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (metaObjectHasNotPropertyName(m_metaObject, name))
|
||||
m_metaObject->createNewProperty(name);
|
||||
m_metaObject->createNewProperty(name);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -982,54 +972,36 @@ void ObjectNodeInstance::refreshBindings(QDeclarativeContext *context)
|
||||
context->setContextProperty(QString("__dummy_%1").arg(i++), true);
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::updateStateVariant(const NodeInstance &/*target*/, const QString &/*propertyName*/, const QVariant &/*value*/)
|
||||
bool ObjectNodeInstance::updateStateVariant(const ObjectNodeInstance::Pointer &/*target*/, const QString &/*propertyName*/, const QVariant &/*value*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::updateStateBinding(const NodeInstance &/*target*/, const QString &/*propertyName*/, const QString &/*expression*/)
|
||||
bool ObjectNodeInstance::updateStateBinding(const ObjectNodeInstance::Pointer &/*target*/, const QString &/*propertyName*/, const QString &/*expression*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::resetStateProperty(const NodeInstance &/*target*/, const QString &/*propertyName*/, const QVariant &/*resetValue*/)
|
||||
bool ObjectNodeInstance::resetStateProperty(const ObjectNodeInstance::Pointer &/*target*/, const QString &/*propertyName*/, const QVariant &/*resetValue*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
NodeInstance ObjectNodeInstance::nodeInstanceParentForObject(QObject *currentObject) const
|
||||
{
|
||||
if (!currentObject) //this should not happen! warning?
|
||||
return NodeInstance();
|
||||
|
||||
if (nodeInstanceView()->hasInstanceForObject(currentObject))
|
||||
return nodeInstanceView()->instanceForObject(currentObject);
|
||||
|
||||
//Maybe the object has been reparented inside a component and we
|
||||
//do not keep track of the parent?
|
||||
//In this case we iterate until we find a parent we keep track of,
|
||||
//parent() gets 0
|
||||
|
||||
QObject* parentObject;
|
||||
QGraphicsObject *graphicsObject = qobject_cast<QGraphicsObject*>(currentObject);
|
||||
if (graphicsObject)
|
||||
parentObject = graphicsObject->parentItem()->toGraphicsObject();
|
||||
else
|
||||
parentObject = currentObject->parent();
|
||||
|
||||
return nodeInstanceParentForObject(parentObject);
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::doComponentComplete()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ObjectNodeInstance::renderPixmapNextPaint()
|
||||
bool ObjectNodeInstance::isRootNodeInstance() const
|
||||
{
|
||||
return nodeInstanceServer()->rootNodeInstance().isWrappingThisObject(object());
|
||||
}
|
||||
|
||||
bool ObjectNodeInstance::isValid() const
|
||||
{
|
||||
return instanceId() >= 0 && object();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,12 +32,10 @@
|
||||
|
||||
#include <QPainter>
|
||||
#include <QStyleOptionGraphicsItem>
|
||||
#include "modelnode.h"
|
||||
#include <QSharedPointer>
|
||||
#include <QScopedPointer>
|
||||
#include <QWeakPointer>
|
||||
#include <propertymetainfo.h>
|
||||
#include <nodeinstanceview.h>
|
||||
#include "nodeinstanceserver.h"
|
||||
#include "nodeinstancemetaobject.h"
|
||||
#include "nodeinstancesignalspy.h"
|
||||
|
||||
@@ -52,6 +50,8 @@ QT_END_NAMESPACE
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class NodeInstanceServer;
|
||||
|
||||
|
||||
namespace Internal {
|
||||
|
||||
@@ -61,22 +61,6 @@ class GraphicsViewNodeInstance;
|
||||
class GraphicsSceneNodeInstance;
|
||||
class ProxyWidgetNodeInstance;
|
||||
class WidgetNodeInstance;
|
||||
class QDeclarativeViewNodeInstance;
|
||||
|
||||
class ChildrenChangeEventFilter : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ChildrenChangeEventFilter(QObject *parent);
|
||||
|
||||
|
||||
signals:
|
||||
void childrenChanged(QObject *object);
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *object, QEvent *event);
|
||||
|
||||
};
|
||||
|
||||
class ObjectNodeInstance
|
||||
{
|
||||
@@ -89,32 +73,28 @@ public:
|
||||
void destroy();
|
||||
//void setModelNode(const ModelNode &node);
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
static Pointer create(QObject *objectToBeWrapped);
|
||||
static QObject* createObject(const QString &typeName, int majorNumber, int minorNumber, const QString &componentPath, QDeclarativeContext *context);
|
||||
|
||||
ModelNode modelNode() const;
|
||||
void setModelNode(const ModelNode &node);
|
||||
void setInstanceId(qint32 id);
|
||||
qint32 instanceId() const;
|
||||
|
||||
NodeInstanceView *nodeInstanceView() const;
|
||||
void setNodeInstanceView(NodeInstanceView *view);
|
||||
NodeInstanceServer *nodeInstanceServer() const;
|
||||
void setNodeInstanceServer(NodeInstanceServer *server);
|
||||
virtual void initializePropertyWatcher(const Pointer &objectNodeInstance);
|
||||
virtual void paint(QPainter *painter);
|
||||
|
||||
virtual bool isTopLevel() const;
|
||||
virtual QImage renderImage() const;
|
||||
|
||||
virtual QObject *parent() const;
|
||||
|
||||
virtual void reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty);
|
||||
Pointer parentInstance() const;
|
||||
|
||||
virtual void reparent(const ObjectNodeInstance::Pointer &oldParentInstance, const QString &oldParentProperty, const ObjectNodeInstance::Pointer &newParentInstance, const QString &newParentProperty);
|
||||
|
||||
void setId(const QString &id);
|
||||
QString id() const;
|
||||
|
||||
virtual bool isQmlGraphicsItem() const;
|
||||
virtual bool isGraphicsScene() const;
|
||||
virtual bool isGraphicsView() const;
|
||||
virtual bool isGraphicsWidget() const;
|
||||
virtual bool isProxyWidget() const;
|
||||
virtual bool isWidget() const;
|
||||
virtual bool isQDeclarativeView() const;
|
||||
virtual bool isGraphicsObject() const;
|
||||
virtual bool isTransition() const;
|
||||
virtual bool isPositioner() const;
|
||||
@@ -134,7 +114,7 @@ public:
|
||||
virtual int penWidth() const;
|
||||
|
||||
virtual bool hasAnchor(const QString &name) const;
|
||||
virtual QPair<QString, NodeInstance> anchor(const QString &name) const;
|
||||
virtual QPair<QString, ServerNodeInstance> anchor(const QString &name) const;
|
||||
virtual bool isAnchoredBySibling() const;
|
||||
virtual bool isAnchoredByChildren() const;
|
||||
|
||||
@@ -150,6 +130,8 @@ public:
|
||||
virtual void resetProperty(const QString &name);
|
||||
virtual void refreshProperty(const QString &name);
|
||||
virtual QString instanceType(const QString &name) const;
|
||||
QStringList propertyNames() const;
|
||||
|
||||
|
||||
void createDynamicProperty(const QString &name, const QString &typeName);
|
||||
void setDeleteHeldInstance(bool deleteInstance);
|
||||
@@ -172,32 +154,24 @@ public:
|
||||
bool isInPositioner() const;
|
||||
void setInPositioner(bool isInPositioner);
|
||||
|
||||
bool hasBindingForProperty(const QString &name) const;
|
||||
bool hasBindingForProperty(const QString &name, bool *hasChanged = 0) const;
|
||||
|
||||
QDeclarativeContext *context() const;
|
||||
QDeclarativeEngine *engine() const;
|
||||
|
||||
virtual bool updateStateVariant(const NodeInstance &target, const QString &propertyName, const QVariant &value);
|
||||
virtual bool updateStateBinding(const NodeInstance &target, const QString &propertyName, const QString &expression);
|
||||
virtual bool resetStateProperty(const NodeInstance &target, const QString &propertyName, const QVariant &resetValue);
|
||||
virtual bool updateStateVariant(const ObjectNodeInstance::Pointer &target, const QString &propertyName, const QVariant &value);
|
||||
virtual bool updateStateBinding(const ObjectNodeInstance::Pointer &target, const QString &propertyName, const QString &expression);
|
||||
virtual bool resetStateProperty(const ObjectNodeInstance::Pointer &target, const QString &propertyName, const QVariant &resetValue);
|
||||
|
||||
static void tweakObjects(QObject *object);
|
||||
|
||||
NodeInstance nodeInstanceParentForObject(QObject *currentObject) const;
|
||||
|
||||
bool isValid() const;
|
||||
bool isRootNodeInstance() const;
|
||||
|
||||
virtual void doComponentComplete();
|
||||
|
||||
virtual void renderPixmapNextPaint();
|
||||
|
||||
protected:
|
||||
static QObject *createInstance(const NodeMetaInfo &metaInfo, QDeclarativeContext *parentContext);
|
||||
|
||||
static QObject* createObject(const NodeMetaInfo &metaInfo, QDeclarativeContext *context);
|
||||
|
||||
void doResetProperty(const QString &propertyName);
|
||||
NodeInstance instanceForNode(const ModelNode &node, const QString &fullname);
|
||||
|
||||
void removeFromOldProperty(QObject *object, QObject *oldParent, const QString &oldParentProperty);
|
||||
void addToNewProperty(QObject *object, QObject *newParent, const QString &newParentProperty);
|
||||
void deleteObjectsInList(const QDeclarativeProperty &metaProperty);
|
||||
@@ -206,11 +180,13 @@ private:
|
||||
static void refreshBindings(QDeclarativeContext *context);
|
||||
|
||||
QHash<QString, QVariant> m_resetValueHash;
|
||||
QHash<QString, NodeInstance> m_modelAbstractPropertyHash;
|
||||
ModelNode m_modelNode;
|
||||
QHash<QString, ServerNodeInstance> m_modelAbstractPropertyHash;
|
||||
mutable QHash<QString, bool> m_hasBindingHash;
|
||||
qint32 m_instanceId;
|
||||
QString m_id;
|
||||
|
||||
QWeakPointer<NodeInstanceView> m_nodeInstanceView;
|
||||
QWeakPointer<NodeInstanceServer> m_nodeInstanceServer;
|
||||
QString m_parentProperty;
|
||||
bool m_deleteHeldInstance;
|
||||
QWeakPointer<QObject> m_object;
|
||||
NodeInstanceMetaObject *m_metaObject;
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
#include "pixmapchangedcommand.h"
|
||||
|
||||
#include <QtDebug>
|
||||
|
||||
#include <QVarLengthArray>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
PixmapChangedCommand::PixmapChangedCommand()
|
||||
: m_instanceId(-1)
|
||||
{
|
||||
}
|
||||
|
||||
PixmapChangedCommand::PixmapChangedCommand(qint32 instanceId, const QImage &image)
|
||||
: m_image(image), m_instanceId(instanceId)
|
||||
{
|
||||
}
|
||||
|
||||
qint32 PixmapChangedCommand::instanceId() const
|
||||
{
|
||||
return m_instanceId;
|
||||
}
|
||||
|
||||
QImage PixmapChangedCommand::renderImage() const
|
||||
{
|
||||
return m_image;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const PixmapChangedCommand &command)
|
||||
{
|
||||
out << command.instanceId();
|
||||
|
||||
const QImage image = command.renderImage();
|
||||
const QByteArray data(reinterpret_cast<const char*>(image.constBits()), image.byteCount());
|
||||
|
||||
out << qint32(image.bytesPerLine());
|
||||
out << image.size();
|
||||
out << qint32(image.format());
|
||||
out << qint32(image.byteCount());
|
||||
out.writeRawData(reinterpret_cast<const char*>(image.constBits()), image.byteCount());
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, PixmapChangedCommand &command)
|
||||
{
|
||||
|
||||
qint32 byteSize;
|
||||
qint32 bytesPerLine;
|
||||
QSize imageSize;
|
||||
qint32 format;
|
||||
|
||||
in >> command.m_instanceId;
|
||||
|
||||
in >> bytesPerLine;
|
||||
in >> imageSize;
|
||||
in >> format;
|
||||
in >> byteSize;
|
||||
|
||||
command.m_image = QImage(imageSize, QImage::Format(format));
|
||||
in.readRawData(reinterpret_cast<char*>(command.m_image.bits()), byteSize);
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,31 @@
|
||||
#ifndef PIXMAPCHANGEDCOMMAND_H
|
||||
#define PIXMAPCHANGEDCOMMAND_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include <QImage>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class PixmapChangedCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, PixmapChangedCommand &command);
|
||||
public:
|
||||
PixmapChangedCommand();
|
||||
PixmapChangedCommand(qint32 instanceId, const QImage &image);
|
||||
|
||||
qint32 instanceId() const;
|
||||
QImage renderImage() const;
|
||||
|
||||
private:
|
||||
QImage m_image;
|
||||
qint32 m_instanceId;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const PixmapChangedCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, PixmapChangedCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::PixmapChangedCommand);
|
||||
|
||||
#endif // PIXMAPCHANGEDCOMMAND_H
|
||||
@@ -5,8 +5,8 @@
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
PositionerNodeInstance::PositionerNodeInstance(QDeclarativeBasePositioner *item, bool hasContent)
|
||||
: QmlGraphicsItemNodeInstance(item, hasContent)
|
||||
PositionerNodeInstance::PositionerNodeInstance(QDeclarativeBasePositioner *item)
|
||||
: QmlGraphicsItemNodeInstance(item)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -36,27 +36,20 @@ void PositionerNodeInstance::setPropertyBinding(const QString &name, const QStri
|
||||
QmlGraphicsItemNodeInstance::setPropertyBinding(name, expression);
|
||||
}
|
||||
|
||||
PositionerNodeInstance::Pointer PositionerNodeInstance::create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
{
|
||||
QPair<QGraphicsObject*, bool> objectPair;
|
||||
|
||||
if (objectToBeWrapped)
|
||||
objectPair = qMakePair(qobject_cast<QGraphicsObject*>(objectToBeWrapped), false);
|
||||
else
|
||||
objectPair = GraphicsObjectNodeInstance::createGraphicsObject(metaInfo, context);
|
||||
|
||||
QDeclarativeBasePositioner *positioner = dynamic_cast<QDeclarativeBasePositioner*>(objectPair.first);
|
||||
PositionerNodeInstance::Pointer PositionerNodeInstance::create(QObject *object)
|
||||
{
|
||||
QDeclarativeBasePositioner *positioner = qobject_cast<QDeclarativeBasePositioner*>(object);
|
||||
|
||||
if (positioner == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new PositionerNodeInstance(positioner, objectPair.second));
|
||||
Pointer instance(new PositionerNodeInstance(positioner));
|
||||
|
||||
instance->setHasContent(!positioner->flags().testFlag(QGraphicsItem::ItemHasNoContents));
|
||||
positioner->setFlag(QGraphicsItem::ItemHasNoContents, false);
|
||||
|
||||
static_cast<QDeclarativeParserStatus*>(positioner)->classBegin();
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
return instance;
|
||||
|
||||
@@ -16,7 +16,7 @@ public:
|
||||
typedef QSharedPointer<PositionerNodeInstance> Pointer;
|
||||
typedef QWeakPointer<PositionerNodeInstance> WeakPointer;
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
static Pointer create(QObject *objectToBeWrapped);
|
||||
|
||||
void setPropertyVariant(const QString &name, const QVariant &value);
|
||||
void setPropertyBinding(const QString &name, const QString &expression);
|
||||
@@ -27,7 +27,7 @@ public:
|
||||
|
||||
|
||||
protected:
|
||||
PositionerNodeInstance(QDeclarativeBasePositioner *item, bool hasContent);
|
||||
PositionerNodeInstance(QDeclarativeBasePositioner *item);
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
#include "propertyabstractcontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
PropertyAbstractContainer::PropertyAbstractContainer()
|
||||
: m_instanceId(-1)
|
||||
{
|
||||
}
|
||||
|
||||
PropertyAbstractContainer::PropertyAbstractContainer(qint32 instanceId, const QString &name, const QString &dynamicTypeName)
|
||||
: m_instanceId(instanceId),
|
||||
m_name(name),
|
||||
m_dynamicTypeName(dynamicTypeName)
|
||||
{
|
||||
}
|
||||
|
||||
qint32 PropertyAbstractContainer::instanceId() const
|
||||
{
|
||||
return m_instanceId;
|
||||
}
|
||||
|
||||
QString PropertyAbstractContainer::name() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
bool PropertyAbstractContainer::isDynamic() const
|
||||
{
|
||||
return !m_dynamicTypeName.isEmpty();
|
||||
}
|
||||
|
||||
QString PropertyAbstractContainer::dynamicTypeName() const
|
||||
{
|
||||
return m_dynamicTypeName;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const PropertyAbstractContainer &container)
|
||||
{
|
||||
out << container.instanceId();
|
||||
out << container.name();
|
||||
out << container.dynamicTypeName();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, PropertyAbstractContainer &container)
|
||||
{
|
||||
in >> container.m_instanceId;
|
||||
in >> container.m_name;
|
||||
in >> container.m_dynamicTypeName;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,64 @@
|
||||
#include "propertybindingcontainer.h"
|
||||
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
PropertyBindingContainer::PropertyBindingContainer()
|
||||
: m_instanceId(-1)
|
||||
{
|
||||
}
|
||||
|
||||
PropertyBindingContainer::PropertyBindingContainer(qint32 instanceId, const QString &name, const QString &expression, const QString &dynamicTypeName)
|
||||
: m_instanceId(instanceId),
|
||||
m_name(name),
|
||||
m_expression(expression),
|
||||
m_dynamicTypeName(dynamicTypeName)
|
||||
{
|
||||
}
|
||||
|
||||
qint32 PropertyBindingContainer::instanceId() const
|
||||
{
|
||||
return m_instanceId;
|
||||
}
|
||||
|
||||
QString PropertyBindingContainer::name() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
QString PropertyBindingContainer::expression() const
|
||||
{
|
||||
return m_expression;
|
||||
}
|
||||
|
||||
bool PropertyBindingContainer::isDynamic() const
|
||||
{
|
||||
return !m_dynamicTypeName.isEmpty();
|
||||
}
|
||||
|
||||
QString PropertyBindingContainer::dynamicTypeName() const
|
||||
{
|
||||
return m_dynamicTypeName;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const PropertyBindingContainer &container)
|
||||
{
|
||||
out << container.instanceId();
|
||||
out << container.name();
|
||||
out << container.expression();
|
||||
out << container.dynamicTypeName();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, PropertyBindingContainer &container)
|
||||
{
|
||||
in >> container.m_instanceId;
|
||||
in >> container.m_name;
|
||||
in >> container.m_expression;
|
||||
in >> container.m_dynamicTypeName;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,63 @@
|
||||
#include "propertyvaluecontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
PropertyValueContainer::PropertyValueContainer()
|
||||
: m_instanceId(-1)
|
||||
{
|
||||
}
|
||||
|
||||
PropertyValueContainer::PropertyValueContainer(qint32 instanceId, const QString &name, const QVariant &value, const QString &dynamicTypeName)
|
||||
: m_instanceId(instanceId),
|
||||
m_name(name),
|
||||
m_value(value),
|
||||
m_dynamicTypeName(dynamicTypeName)
|
||||
{
|
||||
}
|
||||
|
||||
qint32 PropertyValueContainer::instanceId() const
|
||||
{
|
||||
return m_instanceId;
|
||||
}
|
||||
|
||||
QString PropertyValueContainer::name() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
QVariant PropertyValueContainer::value() const
|
||||
{
|
||||
return m_value;
|
||||
}
|
||||
|
||||
bool PropertyValueContainer::isDynamic() const
|
||||
{
|
||||
return !m_dynamicTypeName.isEmpty();
|
||||
}
|
||||
|
||||
QString PropertyValueContainer::dynamicTypeName() const
|
||||
{
|
||||
return m_dynamicTypeName;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const PropertyValueContainer &container)
|
||||
{
|
||||
out << container.instanceId();
|
||||
out << container.name();
|
||||
out << container.value();
|
||||
out << container.dynamicTypeName();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, PropertyValueContainer &container)
|
||||
{
|
||||
in >> container.m_instanceId;
|
||||
in >> container.m_name;
|
||||
in >> container.m_value;
|
||||
in >> container.m_dynamicTypeName;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -1,81 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "proxywidgetnodeinstance.h"
|
||||
|
||||
#include <QGraphicsProxyWidget>
|
||||
#include <private/qdeclarativemetatype_p.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
|
||||
ProxyWidgetNodeInstance::ProxyWidgetNodeInstance(QGraphicsProxyWidget *widget)
|
||||
: GraphicsWidgetNodeInstance(widget)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
ProxyWidgetNodeInstance::Pointer ProxyWidgetNodeInstance::create(const QString &typeName)
|
||||
{
|
||||
QObject *object = QDeclarativeMetaType::qmlType(typeName.toLatin1(), 4, 7)->create();
|
||||
Q_ASSERT(object);
|
||||
if (object == 0)
|
||||
return Pointer();
|
||||
|
||||
QGraphicsProxyWidget* widget = qobject_cast<QGraphicsProxyWidget*>(object);
|
||||
Q_ASSERT(widget);
|
||||
if (widget == 0)
|
||||
return Pointer();
|
||||
|
||||
return Pointer(new ProxyWidgetNodeInstance(widget));
|
||||
}
|
||||
|
||||
QGraphicsProxyWidget* ProxyWidgetNodeInstance::proxyWidget() const
|
||||
{
|
||||
QGraphicsProxyWidget* proxyWidget = qobject_cast<QGraphicsProxyWidget*>(graphicsWidget());
|
||||
Q_ASSERT(proxyWidget);
|
||||
|
||||
return proxyWidget;
|
||||
}
|
||||
|
||||
|
||||
void ProxyWidgetNodeInstance::setWidget(QWidget *widget)
|
||||
{
|
||||
proxyWidget()->setWidget(widget);
|
||||
}
|
||||
|
||||
bool ProxyWidgetNodeInstance::isProxyWidget() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -28,9 +28,6 @@
|
||||
**************************************************************************/
|
||||
|
||||
#include "qmlgraphicsitemnodeinstance.h"
|
||||
#include "qmlviewnodeinstance.h"
|
||||
#include "graphicsscenenodeinstance.h"
|
||||
|
||||
|
||||
#include <invalidnodeinstanceexception.h>
|
||||
#include <propertymetainfo.h>
|
||||
@@ -55,8 +52,8 @@
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
QmlGraphicsItemNodeInstance::QmlGraphicsItemNodeInstance(QDeclarativeItem *item, bool hasContent)
|
||||
: GraphicsObjectNodeInstance(item, hasContent),
|
||||
QmlGraphicsItemNodeInstance::QmlGraphicsItemNodeInstance(QDeclarativeItem *item)
|
||||
: GraphicsObjectNodeInstance(item),
|
||||
m_hasHeight(false),
|
||||
m_hasWidth(false),
|
||||
m_isResizable(true)
|
||||
@@ -67,30 +64,23 @@ QmlGraphicsItemNodeInstance::~QmlGraphicsItemNodeInstance()
|
||||
{
|
||||
}
|
||||
|
||||
QmlGraphicsItemNodeInstance::Pointer QmlGraphicsItemNodeInstance::create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
QmlGraphicsItemNodeInstance::Pointer QmlGraphicsItemNodeInstance::create(QObject *object)
|
||||
{
|
||||
QPair<QGraphicsObject*, bool> objectPair;
|
||||
|
||||
if (objectToBeWrapped)
|
||||
objectPair = qMakePair(qobject_cast<QGraphicsObject*>(objectToBeWrapped), false);
|
||||
else
|
||||
objectPair = GraphicsObjectNodeInstance::createGraphicsObject(metaInfo, context);
|
||||
|
||||
QDeclarativeItem *qmlGraphicsItem = dynamic_cast<QDeclarativeItem*>(objectPair.first);
|
||||
QDeclarativeItem *qmlGraphicsItem = dynamic_cast<QDeclarativeItem*>(object);
|
||||
|
||||
if (qmlGraphicsItem == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new QmlGraphicsItemNodeInstance(qmlGraphicsItem, objectPair.second));
|
||||
Pointer instance(new QmlGraphicsItemNodeInstance(qmlGraphicsItem));
|
||||
|
||||
instance->setHasContent(!qmlGraphicsItem->flags().testFlag(QGraphicsItem::ItemHasNoContents));
|
||||
qmlGraphicsItem->setFlag(QGraphicsItem::ItemHasNoContents, false);
|
||||
|
||||
if (qmlGraphicsItem->inherits("QDeclarativeText"))
|
||||
instance->setResizable(false);
|
||||
|
||||
static_cast<QDeclarativeParserStatus*>(qmlGraphicsItem)->classBegin();
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
return instance;
|
||||
@@ -103,88 +93,88 @@ bool QmlGraphicsItemNodeInstance::isQmlGraphicsItem() const
|
||||
|
||||
QSizeF QmlGraphicsItemNodeInstance::size() const
|
||||
{
|
||||
if (modelNode().isValid()) {
|
||||
double implicitWidth = qmlGraphicsItem()->implicitWidth();
|
||||
if (!m_hasWidth
|
||||
&& implicitWidth // WORKAROUND
|
||||
&& implicitWidth != qmlGraphicsItem()->width()
|
||||
&& !modelNode().hasBindingProperty("width")) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
qmlGraphicsItem()->setWidth(implicitWidth);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
// if (modelNode().isValid()) {
|
||||
// double implicitWidth = qmlGraphicsItem()->implicitWidth();
|
||||
// if (!m_hasWidth
|
||||
// && implicitWidth // WORKAROUND
|
||||
// && implicitWidth != qmlGraphicsItem()->width()
|
||||
// && !modelNode().hasBindingProperty("width")) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// qmlGraphicsItem()->setWidth(implicitWidth);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
|
||||
double implicitHeight = qmlGraphicsItem()->implicitHeight();
|
||||
if (!m_hasHeight
|
||||
&& implicitWidth // WORKAROUND
|
||||
&& implicitHeight != qmlGraphicsItem()->height()
|
||||
&& !modelNode().hasBindingProperty("height")) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
qmlGraphicsItem()->setHeight(implicitHeight);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
// double implicitHeight = qmlGraphicsItem()->implicitHeight();
|
||||
// if (!m_hasHeight
|
||||
// && implicitWidth // WORKAROUND
|
||||
// && implicitHeight != qmlGraphicsItem()->height()
|
||||
// && !modelNode().hasBindingProperty("height")) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// qmlGraphicsItem()->setHeight(implicitHeight);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
|
||||
}
|
||||
// }
|
||||
|
||||
if (modelNode().isRootNode()) {
|
||||
if (!m_hasWidth) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
if (qmlGraphicsItem()->width() < 10.)
|
||||
qmlGraphicsItem()->setWidth(100.);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
// if (modelNode().isRootNode()) {
|
||||
// if (!m_hasWidth) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// if (qmlGraphicsItem()->width() < 10.)
|
||||
// qmlGraphicsItem()->setWidth(100.);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
|
||||
if (!m_hasHeight) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
if (qmlGraphicsItem()->height() < 10.)
|
||||
qmlGraphicsItem()->setHeight(100.);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
}
|
||||
// if (!m_hasHeight) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// if (qmlGraphicsItem()->height() < 10.)
|
||||
// qmlGraphicsItem()->setHeight(100.);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
// }
|
||||
|
||||
return QSizeF(qmlGraphicsItem()->width(), qmlGraphicsItem()->height());
|
||||
}
|
||||
|
||||
QRectF QmlGraphicsItemNodeInstance::boundingRect() const
|
||||
{
|
||||
if (modelNode().isValid()) {
|
||||
double implicitWidth = qmlGraphicsItem()->implicitWidth();
|
||||
if (!m_hasWidth
|
||||
&& implicitWidth // WORKAROUND
|
||||
&& implicitWidth != qmlGraphicsItem()->width()
|
||||
&& !modelNode().hasBindingProperty("width")) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
qmlGraphicsItem()->setWidth(implicitWidth);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
// if (modelNode().isValid()) {
|
||||
// double implicitWidth = qmlGraphicsItem()->implicitWidth();
|
||||
// if (!m_hasWidth
|
||||
// && implicitWidth // WORKAROUND
|
||||
// && implicitWidth != qmlGraphicsItem()->width()
|
||||
// && !modelNode().hasBindingProperty("width")) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// qmlGraphicsItem()->setWidth(implicitWidth);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
|
||||
double implicitHeight = qmlGraphicsItem()->implicitHeight();
|
||||
if (!m_hasHeight
|
||||
&& implicitHeight // WORKAROUND
|
||||
&& implicitHeight != qmlGraphicsItem()->height()
|
||||
&& !modelNode().hasBindingProperty("height")) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
qmlGraphicsItem()->setHeight(implicitHeight);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
// double implicitHeight = qmlGraphicsItem()->implicitHeight();
|
||||
// if (!m_hasHeight
|
||||
// && implicitHeight // WORKAROUND
|
||||
// && implicitHeight != qmlGraphicsItem()->height()
|
||||
// && !modelNode().hasBindingProperty("height")) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// qmlGraphicsItem()->setHeight(implicitHeight);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
|
||||
}
|
||||
// }
|
||||
|
||||
if (modelNode().isRootNode()) {
|
||||
if (!m_hasWidth) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
if (qmlGraphicsItem()->width() < 10.)
|
||||
qmlGraphicsItem()->setWidth(100.);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
// if (modelNode().isRootNode()) {
|
||||
// if (!m_hasWidth) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// if (qmlGraphicsItem()->width() < 10.)
|
||||
// qmlGraphicsItem()->setWidth(100.);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
|
||||
if (!m_hasHeight) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
if (qmlGraphicsItem()->height() < 10.)
|
||||
qmlGraphicsItem()->setHeight(100.);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
}
|
||||
// if (!m_hasHeight) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// if (qmlGraphicsItem()->height() < 10.)
|
||||
// qmlGraphicsItem()->setHeight(100.);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
// }
|
||||
|
||||
if (qmlGraphicsItem())
|
||||
return qmlGraphicsItem()->boundingRect();
|
||||
@@ -243,63 +233,68 @@ void QmlGraphicsItemNodeInstance::setPropertyBinding(const QString &name, const
|
||||
|
||||
QVariant QmlGraphicsItemNodeInstance::property(const QString &name) const
|
||||
{
|
||||
if (name == "width" && modelNode().isValid() && !modelNode().hasBindingProperty("width")) {
|
||||
double implicitWidth = qmlGraphicsItem()->implicitWidth();
|
||||
if (!m_hasWidth
|
||||
&& implicitWidth // WORKAROUND
|
||||
&& implicitWidth != qmlGraphicsItem()->width()) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
qmlGraphicsItem()->setWidth(implicitWidth);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
}
|
||||
// if (name == "width" && modelNode().isValid() && !modelNode().hasBindingProperty("width")) {
|
||||
// double implicitWidth = qmlGraphicsItem()->implicitWidth();
|
||||
// if (!m_hasWidth
|
||||
// && implicitWidth // WORKAROUND
|
||||
// && implicitWidth != qmlGraphicsItem()->width()) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// qmlGraphicsItem()->setWidth(implicitWidth);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
// }
|
||||
|
||||
if (name == "height" && modelNode().isValid() && !modelNode().hasBindingProperty("height")) {
|
||||
double implicitHeight = qmlGraphicsItem()->implicitHeight();
|
||||
if (!m_hasHeight
|
||||
&& implicitHeight // WORKAROUND
|
||||
&& implicitHeight != qmlGraphicsItem()->height()) {
|
||||
qmlGraphicsItem()->blockSignals(true);
|
||||
qmlGraphicsItem()->setHeight(implicitHeight);
|
||||
qmlGraphicsItem()->blockSignals(false);
|
||||
}
|
||||
}
|
||||
// if (name == "height" && modelNode().isValid() && !modelNode().hasBindingProperty("height")) {
|
||||
// double implicitHeight = qmlGraphicsItem()->implicitHeight();
|
||||
// if (!m_hasHeight
|
||||
// && implicitHeight // WORKAROUND
|
||||
// && implicitHeight != qmlGraphicsItem()->height()) {
|
||||
// qmlGraphicsItem()->blockSignals(true);
|
||||
// qmlGraphicsItem()->setHeight(implicitHeight);
|
||||
// qmlGraphicsItem()->blockSignals(false);
|
||||
// }
|
||||
// }
|
||||
|
||||
return GraphicsObjectNodeInstance::property(name);
|
||||
}
|
||||
|
||||
void QmlGraphicsItemNodeInstance::resetHorizontal()
|
||||
{
|
||||
if (modelNode().hasBindingProperty("x"))
|
||||
setPropertyBinding("x", modelNode().bindingProperty("x").expression());
|
||||
else if (modelNode().hasVariantProperty("x"))
|
||||
setPropertyVariant("x", modelNode().variantProperty("x").value());
|
||||
else
|
||||
setPropertyVariant("x", 0.0);
|
||||
setPropertyVariant("x", 0.0);
|
||||
setPropertyVariant("width", qmlGraphicsItem()->implicitWidth());
|
||||
|
||||
if (modelNode().hasBindingProperty("width"))
|
||||
setPropertyBinding("width", modelNode().bindingProperty("width").expression());
|
||||
else if (modelNode().hasVariantProperty("width"))
|
||||
setPropertyVariant("width", modelNode().variantProperty("width").value());
|
||||
else
|
||||
setPropertyVariant("width", qmlGraphicsItem()->implicitWidth());
|
||||
// if (modelNode().hasBindingProperty("x"))
|
||||
// setPropertyBinding("x", modelNode().bindingProperty("x").expression());
|
||||
// else if (modelNode().hasVariantProperty("x"))
|
||||
// setPropertyVariant("x", modelNode().variantProperty("x").value());
|
||||
// else
|
||||
// setPropertyVariant("x", 0.0);
|
||||
|
||||
// if (modelNode().hasBindingProperty("width"))
|
||||
// setPropertyBinding("width", modelNode().bindingProperty("width").expression());
|
||||
// else if (modelNode().hasVariantProperty("width"))
|
||||
// setPropertyVariant("width", modelNode().variantProperty("width").value());
|
||||
// else
|
||||
// setPropertyVariant("width", qmlGraphicsItem()->implicitWidth());
|
||||
}
|
||||
|
||||
void QmlGraphicsItemNodeInstance::resetVertical()
|
||||
{
|
||||
if (modelNode().hasBindingProperty("y"))
|
||||
setPropertyBinding("y", modelNode().bindingProperty("y").expression());
|
||||
else if (modelNode().hasVariantProperty("y"))
|
||||
setPropertyVariant("y", modelNode().variantProperty("y").value());
|
||||
else
|
||||
setPropertyVariant("y", 0.0);
|
||||
setPropertyVariant("y", 0.0);
|
||||
setPropertyVariant("height", qmlGraphicsItem()->implicitHeight());
|
||||
// if (modelNode().hasBindingProperty("y"))
|
||||
// setPropertyBinding("y", modelNode().bindingProperty("y").expression());
|
||||
// else if (modelNode().hasVariantProperty("y"))
|
||||
// setPropertyVariant("y", modelNode().variantProperty("y").value());
|
||||
// else
|
||||
// setPropertyVariant("y", 0.0);
|
||||
|
||||
if (modelNode().hasBindingProperty("height"))
|
||||
setPropertyBinding("height", modelNode().bindingProperty("height").expression());
|
||||
else if (modelNode().hasVariantProperty("height"))
|
||||
setPropertyVariant("height", modelNode().variantProperty("height").value());
|
||||
else
|
||||
setPropertyVariant("height", qmlGraphicsItem()->implicitHeight());
|
||||
// if (modelNode().hasBindingProperty("height"))
|
||||
// setPropertyBinding("height", modelNode().bindingProperty("height").expression());
|
||||
// else if (modelNode().hasVariantProperty("height"))
|
||||
// setPropertyVariant("height", modelNode().variantProperty("height").value());
|
||||
// else
|
||||
// setPropertyVariant("height", qmlGraphicsItem()->implicitHeight());
|
||||
}
|
||||
|
||||
static void repositioning(QDeclarativeItem *item)
|
||||
@@ -328,6 +323,8 @@ void QmlGraphicsItemNodeInstance::doComponentComplete()
|
||||
static_cast<QDeclarativeParserStatus*>(qmlGraphicsItem())->componentComplete();
|
||||
QGraphicsItemPrivate::get(qmlGraphicsItem())->sendParentChangeNotification = 1;
|
||||
}
|
||||
|
||||
graphicsObject()->update();
|
||||
}
|
||||
|
||||
bool QmlGraphicsItemNodeInstance::isResizable() const
|
||||
@@ -358,7 +355,6 @@ void QmlGraphicsItemNodeInstance::resetProperty(const QString &name)
|
||||
m_hasWidth = false;
|
||||
|
||||
|
||||
GraphicsObjectNodeInstance::resetProperty(name);
|
||||
if (name == "anchors.fill") {
|
||||
anchors()->resetFill();
|
||||
resetHorizontal();
|
||||
@@ -389,18 +385,20 @@ void QmlGraphicsItemNodeInstance::resetProperty(const QString &name)
|
||||
anchors()->resetBaseline();
|
||||
resetVertical();
|
||||
}
|
||||
|
||||
GraphicsObjectNodeInstance::resetProperty(name);
|
||||
}
|
||||
|
||||
void QmlGraphicsItemNodeInstance::reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty)
|
||||
void QmlGraphicsItemNodeInstance::reparent(const ObjectNodeInstance::Pointer &oldParentInstance, const QString &oldParentProperty, const ObjectNodeInstance::Pointer &newParentInstance, const QString &newParentProperty)
|
||||
{
|
||||
if (oldParentInstance.isValid() && oldParentInstance.isPositioner()) {
|
||||
if (oldParentInstance && oldParentInstance->isPositioner()) {
|
||||
setInPositioner(false);
|
||||
setMovable(true);
|
||||
}
|
||||
|
||||
GraphicsObjectNodeInstance::reparent(oldParentInstance, oldParentProperty, newParentInstance, newParentProperty);
|
||||
|
||||
if (newParentInstance.isValid() && newParentInstance.isPositioner()) {
|
||||
if (newParentInstance && newParentInstance->isPositioner()) {
|
||||
setInPositioner(true);
|
||||
setMovable(false);
|
||||
}
|
||||
@@ -408,120 +406,6 @@ void QmlGraphicsItemNodeInstance::reparent(const NodeInstance &oldParentInstance
|
||||
refresh();
|
||||
}
|
||||
|
||||
//void QmlGraphicsItemNodeInstance::updateAnchors()
|
||||
//{
|
||||
// NodeAnchors anchors(modelNode());
|
||||
//
|
||||
// if (anchors.hasAnchor(AnchorLine::Top)) {
|
||||
// AnchorLine anchorLine(anchors.anchor(AnchorLine::Top));
|
||||
// NodeInstance instance(nodeInstanceView()->instanceForNode(anchorLine.modelNode()));
|
||||
//
|
||||
// if (instance.isQmlGraphicsItem()) {
|
||||
// Pointer qmlGraphicsItemInstance(instance.QmlGraphicsItemNodeInstance());
|
||||
// anchors()->setProperty("top", anchorLineFor(qmlGraphicsItemInstance->qmlGraphicsItem(), anchorLine));
|
||||
// }
|
||||
// } else {
|
||||
// if (anchors()->usedAnchors().testFlag(QDeclarativeAnchors::HasTopAnchor)) {
|
||||
// anchors()->resetTop();
|
||||
// setPropertyValue("y", modelNode().property("y").value());
|
||||
// setPropertyValue("height", modelNode().property("height").value());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// if (anchors.hasAnchor(AnchorLine::Left)) {
|
||||
// AnchorLine anchorLine(anchors.anchor(AnchorLine::Left));
|
||||
// NodeInstance instance(nodeInstanceView()->instanceForNode(anchorLine.modelNode()));
|
||||
//
|
||||
// if (instance.isQmlGraphicsItem()) {
|
||||
// Pointer qmlGraphicsItemInstance(instance.QmlGraphicsItemNodeInstance());
|
||||
// anchors()->setProperty("left", anchorLineFor(qmlGraphicsItemInstance->qmlGraphicsItem(), anchorLine));
|
||||
// }
|
||||
// } else {
|
||||
// if (anchors()->usedAnchors().testFlag(QDeclarativeAnchors::HasLeftAnchor)) {
|
||||
// anchors()->resetLeft();
|
||||
// setPropertyValue("x", modelNode().property("x").value());
|
||||
// setPropertyValue("width", modelNode().property("width").value());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// if (anchors.hasAnchor(AnchorLine::Right)) {
|
||||
// AnchorLine anchorLine(anchors.anchor(AnchorLine::Right));
|
||||
// NodeInstance instance(nodeInstanceView()->instanceForNode(anchorLine.modelNode()));
|
||||
//
|
||||
// if (instance.isQmlGraphicsItem()) {
|
||||
// Pointer qmlGraphicsItemInstance(instance.QmlGraphicsItemNodeInstance());
|
||||
// anchors()->setProperty("right", anchorLineFor(qmlGraphicsItemInstance->qmlGraphicsItem(), anchorLine));
|
||||
// }
|
||||
// } else {
|
||||
// if (anchors()->usedAnchors().testFlag(QDeclarativeAnchors::HasRightAnchor)) {
|
||||
// anchors()->resetRight();
|
||||
// setPropertyValue("x", modelNode().property("x").value());
|
||||
// setPropertyValue("width", modelNode().property("width").value());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// if (anchors.hasAnchor(AnchorLine::Bottom)) {
|
||||
// AnchorLine anchorLine(anchors.anchor(AnchorLine::Bottom));
|
||||
// NodeInstance instance(nodeInstanceView()->instanceForNode(anchorLine.modelNode()));
|
||||
//
|
||||
// if (instance.isQmlGraphicsItem()) {
|
||||
// Pointer qmlGraphicsItemInstance(instance.QmlGraphicsItemNodeInstance());
|
||||
// anchors()->setProperty("bottom", anchorLineFor(qmlGraphicsItemInstance->qmlGraphicsItem(), anchorLine));
|
||||
// }
|
||||
// } else {
|
||||
// if (anchors()->usedAnchors().testFlag(QDeclarativeAnchors::HasBottomAnchor)) {
|
||||
// anchors()->resetBottom();
|
||||
// setPropertyValue("y", modelNode().property("y").value());
|
||||
// setPropertyValue("height", modelNode().property("height").value());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// if (anchors.hasAnchor(AnchorLine::HorizontalCenter)) {
|
||||
// AnchorLine anchorLine(anchors.anchor(AnchorLine::HorizontalCenter));
|
||||
// NodeInstance instance(nodeInstanceView()->instanceForNode(anchorLine.modelNode()));
|
||||
//
|
||||
// if (instance.isQmlGraphicsItem()) {
|
||||
// Pointer qmlGraphicsItemInstance(instance.QmlGraphicsItemNodeInstance());
|
||||
// anchors()->setProperty("horizontalCenter", anchorLineFor(qmlGraphicsItemInstance->qmlGraphicsItem(), anchorLine));
|
||||
// }
|
||||
// } else {
|
||||
// if (anchors()->usedAnchors().testFlag(QDeclarativeAnchors::HasHCenterAnchor)) {
|
||||
// anchors()->resetHorizontalCenter();
|
||||
// setPropertyValue("x", modelNode().property("x").value());
|
||||
// setPropertyValue("width", modelNode().property("width").value());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// if (anchors.hasAnchor(AnchorLine::VerticalCenter)) {
|
||||
// AnchorLine anchorLine(anchors.anchor(AnchorLine::VerticalCenter));
|
||||
// NodeInstance instance(nodeInstanceView()->instanceForNode(anchorLine.modelNode()));
|
||||
//
|
||||
// if (instance.isQmlGraphicsItem()) {
|
||||
// Pointer qmlGraphicsItemInstance(instance.QmlGraphicsItemNodeInstance());
|
||||
// anchors()->setProperty("verticalCenter",anchorLineFor(qmlGraphicsItemInstance->qmlGraphicsItem(), anchorLine));
|
||||
// }
|
||||
// } else {
|
||||
// if (anchors()->usedAnchors().testFlag(QDeclarativeAnchors::HasVCenterAnchor)) {
|
||||
// anchors()->resetVerticalCenter();
|
||||
// setPropertyValue("y", modelNode().property("y").value());
|
||||
// setPropertyValue("height", modelNode().property("height").value());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// anchors()->setTopMargin(anchors.margin(AnchorLine::Top));
|
||||
// anchors()->setLeftMargin(anchors.margin(AnchorLine::Left));
|
||||
// anchors()->setBottomMargin(anchors.margin(AnchorLine::Bottom));
|
||||
// anchors()->setRightMargin(anchors.margin(AnchorLine::Right));
|
||||
// anchors()->setHorizontalCenterOffset(anchors.margin(AnchorLine::HorizontalCenter));
|
||||
// anchors()->setVerticalCenterOffset(anchors.margin(AnchorLine::VerticalCenter));
|
||||
//}
|
||||
|
||||
QDeclarativeAnchors::Anchor anchorLineFlagForName(const QString &name)
|
||||
{
|
||||
if (name == "anchors.top")
|
||||
@@ -580,7 +464,7 @@ bool isValidAnchorName(const QString &name)
|
||||
return anchorNameList.contains(name);
|
||||
}
|
||||
|
||||
QPair<QString, NodeInstance> QmlGraphicsItemNodeInstance::anchor(const QString &name) const
|
||||
QPair<QString, ServerNodeInstance> QmlGraphicsItemNodeInstance::anchor(const QString &name) const
|
||||
{
|
||||
if (!isValidAnchorName(name) || !hasAnchor(name))
|
||||
return GraphicsObjectNodeInstance::anchor(name);
|
||||
@@ -605,8 +489,8 @@ QPair<QString, NodeInstance> QmlGraphicsItemNodeInstance::anchor(const QString &
|
||||
|
||||
}
|
||||
|
||||
if (targetObject && nodeInstanceView()->hasInstanceForObject(targetObject)) {
|
||||
return qMakePair(targetName, nodeInstanceView()->instanceForObject(targetObject));
|
||||
if (targetObject && nodeInstanceServer()->hasInstanceForObject(targetObject)) {
|
||||
return qMakePair(targetName, nodeInstanceServer()->instanceForObject(targetObject));
|
||||
} else {
|
||||
return GraphicsObjectNodeInstance::anchor(name);
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ public:
|
||||
|
||||
~QmlGraphicsItemNodeInstance();
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
static Pointer create(QObject *objectToBeWrapped);
|
||||
|
||||
bool isQmlGraphicsItem() const;
|
||||
|
||||
@@ -60,12 +60,12 @@ public:
|
||||
QVariant property(const QString &name) const;
|
||||
void resetProperty(const QString &name);
|
||||
|
||||
void reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty);
|
||||
void reparent(const ObjectNodeInstance::Pointer &oldParentInstance, const QString &oldParentProperty, const ObjectNodeInstance::Pointer &newParentInstance, const QString &newParentProperty);
|
||||
|
||||
int penWidth() const;
|
||||
|
||||
bool hasAnchor(const QString &name) const;
|
||||
QPair<QString, NodeInstance> anchor(const QString &name) const;
|
||||
QPair<QString, ServerNodeInstance> anchor(const QString &name) const;
|
||||
bool isAnchoredBySibling() const;
|
||||
bool isAnchoredByChildren() const;
|
||||
void doComponentComplete();
|
||||
@@ -74,7 +74,7 @@ public:
|
||||
void setResizable(bool resizeable);
|
||||
|
||||
protected:
|
||||
QmlGraphicsItemNodeInstance(QDeclarativeItem *item, bool hasContent);
|
||||
QmlGraphicsItemNodeInstance(QDeclarativeItem *item);
|
||||
QDeclarativeItem *qmlGraphicsItem() const;
|
||||
QDeclarativeAnchors *anchors() const;
|
||||
void resetHorizontal();
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
#include <metainfo.h>
|
||||
#include <QMutableListIterator>
|
||||
|
||||
#include "invalidnodeinstanceexception.h"
|
||||
|
||||
#include <private/qdeclarativestate_p_p.h>
|
||||
#include <private/qdeclarativepropertychanges_p.h>
|
||||
#include <private/qdeclarativeproperty_p.h>
|
||||
@@ -176,16 +178,17 @@ QmlPropertyChangesNodeInstance::QmlPropertyChangesNodeInstance(QDeclarativePrope
|
||||
{
|
||||
}
|
||||
|
||||
QmlPropertyChangesNodeInstance::Pointer
|
||||
QmlPropertyChangesNodeInstance::create(const NodeMetaInfo & /*metaInfo*/,
|
||||
QDeclarativeContext *context,
|
||||
QObject *objectToBeWrapped)
|
||||
QmlPropertyChangesNodeInstance::Pointer QmlPropertyChangesNodeInstance::create(QObject *object)
|
||||
{
|
||||
Q_ASSERT(!objectToBeWrapped);
|
||||
QDeclarativePropertyChanges *propertyChange = qobject_cast<QDeclarativePropertyChanges*>(object);
|
||||
|
||||
if (propertyChange == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new QmlPropertyChangesNodeInstance(propertyChange));
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
QDeclarativePropertyChanges *object = new QDeclarativePropertyChanges;
|
||||
QDeclarativeEngine::setContextForObject(object, context);
|
||||
Pointer instance(new QmlPropertyChangesNodeInstance(object));
|
||||
return instance;
|
||||
}
|
||||
|
||||
@@ -198,8 +201,8 @@ void QmlPropertyChangesNodeInstance::setPropertyVariant(const QString &name, con
|
||||
} else {
|
||||
changesObject()->changeValue(name.toLatin1(), value);
|
||||
QObject *targetObject = changesObject()->object();
|
||||
if (targetObject && nodeInstanceView()->activeStateInstance().isWrappingThisObject(changesObject()->state())) {
|
||||
NodeInstance targetInstance = nodeInstanceView()->instanceForObject(targetObject);
|
||||
if (targetObject && nodeInstanceServer()->activeStateInstance().isWrappingThisObject(changesObject()->state())) {
|
||||
ServerNodeInstance targetInstance = nodeInstanceServer()->instanceForObject(targetObject);
|
||||
targetInstance.setPropertyVariant(name, value);
|
||||
}
|
||||
}
|
||||
@@ -227,11 +230,11 @@ void QmlPropertyChangesNodeInstance::resetProperty(const QString &name)
|
||||
}
|
||||
|
||||
|
||||
void QmlPropertyChangesNodeInstance::reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty)
|
||||
void QmlPropertyChangesNodeInstance::reparent(const ServerNodeInstance &oldParentInstance, const QString &oldParentProperty, const ServerNodeInstance &newParentInstance, const QString &newParentProperty)
|
||||
{
|
||||
changesObject()->detachFromState();
|
||||
|
||||
ObjectNodeInstance::reparent(oldParentInstance, oldParentProperty, newParentInstance, newParentProperty);
|
||||
ObjectNodeInstance::reparent(oldParentInstance.internalInstance(), oldParentProperty, newParentInstance.internalInstance(), newParentProperty);
|
||||
|
||||
changesObject()->attachToState();
|
||||
}
|
||||
|
||||
@@ -124,14 +124,14 @@ public:
|
||||
typedef QSharedPointer<QmlPropertyChangesNodeInstance> Pointer;
|
||||
typedef QWeakPointer<QmlPropertyChangesNodeInstance> WeakPointer;
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
static Pointer create(QObject *objectToBeWrapped);
|
||||
|
||||
virtual void setPropertyVariant(const QString &name, const QVariant &value);
|
||||
virtual void setPropertyBinding(const QString &name, const QString &expression);
|
||||
virtual QVariant property(const QString &name) const;
|
||||
virtual void resetProperty(const QString &name);
|
||||
|
||||
void reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty);
|
||||
void reparent(const ServerNodeInstance &oldParentInstance, const QString &oldParentProperty, const ServerNodeInstance &newParentInstance, const QString &newParentProperty);
|
||||
|
||||
protected:
|
||||
QmlPropertyChangesNodeInstance(QDeclarativePropertyChanges *object);
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
#include "qmlpropertychangesnodeinstance.h"
|
||||
#include <private/qdeclarativestateoperations_p.h>
|
||||
|
||||
#include <invalidnodeinstanceexception.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
@@ -50,14 +52,12 @@ QmlStateNodeInstance::QmlStateNodeInstance(QDeclarativeState *object) :
|
||||
}
|
||||
|
||||
QmlStateNodeInstance::Pointer
|
||||
QmlStateNodeInstance::create(const NodeMetaInfo &metaInfo,
|
||||
QDeclarativeContext *context,
|
||||
QObject *objectToBeWrapped)
|
||||
QmlStateNodeInstance::create(QObject *object)
|
||||
{
|
||||
Q_ASSERT(!objectToBeWrapped);
|
||||
QObject *object = createObject(metaInfo, context);
|
||||
QDeclarativeState *stateObject = qobject_cast<QDeclarativeState*>(object);
|
||||
Q_ASSERT(stateObject);
|
||||
|
||||
if (stateObject == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new QmlStateNodeInstance(stateObject));
|
||||
|
||||
@@ -70,7 +70,7 @@ void QmlStateNodeInstance::activateState()
|
||||
{
|
||||
if (stateGroup()) {
|
||||
if (!isStateActive()) {
|
||||
nodeInstanceView()->setStateInstance(nodeInstanceView()->instanceForNode(modelNode()));
|
||||
nodeInstanceServer()->setStateInstance(nodeInstanceServer()->instanceForObject(object()));
|
||||
stateGroup()->setState(property("name").toString());
|
||||
}
|
||||
}
|
||||
@@ -80,7 +80,7 @@ void QmlStateNodeInstance::deactivateState()
|
||||
{
|
||||
if (stateGroup()) {
|
||||
if (isStateActive()) {
|
||||
nodeInstanceView()->clearStateInstance();
|
||||
nodeInstanceServer()->clearStateInstance();
|
||||
stateGroup()->setState(QString());
|
||||
}
|
||||
}
|
||||
@@ -100,14 +100,19 @@ QDeclarativeStateGroup *QmlStateNodeInstance::stateGroup() const
|
||||
|
||||
bool QmlStateNodeInstance::isStateActive() const
|
||||
{
|
||||
qDebug() << stateObject();
|
||||
qDebug() << stateGroup();
|
||||
if (stateGroup())
|
||||
qDebug() << "state name" << stateGroup()->state() << property("name");
|
||||
return stateObject() && stateGroup() && stateGroup()->state() == property("name");
|
||||
}
|
||||
|
||||
void QmlStateNodeInstance::setPropertyVariant(const QString &name, const QVariant &value)
|
||||
{
|
||||
bool hasParent = modelNode().hasParentProperty();
|
||||
bool isStateOfTheRootModelNode = !hasParent || (hasParent && modelNode().parentProperty().parentModelNode().isRootNode());
|
||||
if (name == "when" && isStateOfTheRootModelNode)
|
||||
qDebug() << __FUNCTION__ << stateObject() << name << value;
|
||||
bool hasParent = parent();
|
||||
bool isStateOfTheRootModelNode = parentInstance() && parentInstance()->isRootNodeInstance();
|
||||
if (name == "when" && (!hasParent || isStateOfTheRootModelNode))
|
||||
return;
|
||||
|
||||
ObjectNodeInstance::setPropertyVariant(name, value);
|
||||
@@ -115,27 +120,27 @@ void QmlStateNodeInstance::setPropertyVariant(const QString &name, const QVarian
|
||||
|
||||
void QmlStateNodeInstance::setPropertyBinding(const QString &name, const QString &expression)
|
||||
{
|
||||
bool hasParent = modelNode().hasParentProperty();
|
||||
bool isStateOfTheRootModelNode = !hasParent || (hasParent && modelNode().parentProperty().parentModelNode().isRootNode());
|
||||
if (name == "when" && isStateOfTheRootModelNode)
|
||||
bool hasParent = parent();
|
||||
bool isStateOfTheRootModelNode = parentInstance() && parentInstance()->isRootNodeInstance();
|
||||
if (name == "when" && (!hasParent || isStateOfTheRootModelNode))
|
||||
return;
|
||||
|
||||
ObjectNodeInstance::setPropertyBinding(name, expression);
|
||||
}
|
||||
|
||||
bool QmlStateNodeInstance::updateStateVariant(const NodeInstance &target, const QString &propertyName, const QVariant &value)
|
||||
bool QmlStateNodeInstance::updateStateVariant(const ObjectNodeInstance::Pointer &target, const QString &propertyName, const QVariant &value)
|
||||
{
|
||||
return stateObject()->changeValueInRevertList(target.internalObject(), propertyName.toLatin1(), value);
|
||||
return stateObject()->changeValueInRevertList(target->object(), propertyName.toLatin1(), value);
|
||||
}
|
||||
|
||||
bool QmlStateNodeInstance::updateStateBinding(const NodeInstance &target, const QString &propertyName, const QString &expression)
|
||||
bool QmlStateNodeInstance::updateStateBinding(const ObjectNodeInstance::Pointer &target, const QString &propertyName, const QString &expression)
|
||||
{
|
||||
return stateObject()->changeValueInRevertList(target.internalObject(), propertyName.toLatin1(), expression);
|
||||
return stateObject()->changeValueInRevertList(target->object(), propertyName.toLatin1(), expression);
|
||||
}
|
||||
|
||||
bool QmlStateNodeInstance::resetStateProperty(const NodeInstance &target, const QString &propertyName, const QVariant & /* resetValue */)
|
||||
bool QmlStateNodeInstance::resetStateProperty(const ObjectNodeInstance::Pointer &target, const QString &propertyName, const QVariant & /* resetValue */)
|
||||
{
|
||||
return stateObject()->removeEntryFromRevertList(target.internalObject(), propertyName.toLatin1());
|
||||
return stateObject()->removeEntryFromRevertList(target->object(), propertyName.toLatin1());
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
typedef QSharedPointer<QmlStateNodeInstance> Pointer;
|
||||
typedef QWeakPointer<QmlStateNodeInstance> WeakPointer;
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
static Pointer create(QObject *objectToBeWrapped);
|
||||
|
||||
void setPropertyVariant(const QString &name, const QVariant &value);
|
||||
void setPropertyBinding(const QString &name, const QString &expression);
|
||||
@@ -55,9 +55,9 @@ public:
|
||||
void activateState();
|
||||
void deactivateState();
|
||||
|
||||
bool updateStateVariant(const NodeInstance &target, const QString &propertyName, const QVariant &value);
|
||||
bool updateStateBinding(const NodeInstance &target, const QString &propertyName, const QString &expression);
|
||||
bool resetStateProperty(const NodeInstance &target, const QString &propertyName, const QVariant &resetValue);
|
||||
bool updateStateVariant(const ObjectNodeInstance::Pointer &target, const QString &propertyName, const QVariant &value);
|
||||
bool updateStateBinding(const ObjectNodeInstance::Pointer &target, const QString &propertyName, const QString &expression);
|
||||
bool resetStateProperty(const ObjectNodeInstance::Pointer &target, const QString &propertyName, const QVariant &resetValue);
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
@@ -40,23 +40,14 @@ QmlTransitionNodeInstance::QmlTransitionNodeInstance(QDeclarativeTransition *tra
|
||||
{
|
||||
}
|
||||
|
||||
QmlTransitionNodeInstance::Pointer QmlTransitionNodeInstance::create(const NodeMetaInfo &nodeMetaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
QmlTransitionNodeInstance::Pointer QmlTransitionNodeInstance::create(QObject *object)
|
||||
{
|
||||
QObject *object = 0;
|
||||
if (objectToBeWrapped)
|
||||
object = objectToBeWrapped;
|
||||
else
|
||||
object = createObject(nodeMetaInfo, context);
|
||||
|
||||
QDeclarativeTransition *transition = qobject_cast<QDeclarativeTransition*>(object);
|
||||
if (transition == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new QmlTransitionNodeInstance(transition));
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
transition->setToState("invalidState");
|
||||
|
||||
@@ -45,7 +45,7 @@ public:
|
||||
typedef QSharedPointer<QmlTransitionNodeInstance> Pointer;
|
||||
typedef QWeakPointer<QmlTransitionNodeInstance> WeakPointer;
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
static Pointer create(QObject *objectToBeWrapped);
|
||||
|
||||
void setPropertyVariant(const QString &name, const QVariant &value);
|
||||
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "qmlviewnodeinstance.h"
|
||||
|
||||
#include <QDeclarativeView>
|
||||
#include <QDeclarativeItem>
|
||||
|
||||
#include <invalidnodeinstanceexception.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
QDeclarativeViewNodeInstance::QDeclarativeViewNodeInstance(QDeclarativeView *view)
|
||||
: GraphicsViewNodeInstance(view)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
QDeclarativeViewNodeInstance::Pointer QDeclarativeViewNodeInstance::create(const NodeMetaInfo &nodeMetaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped)
|
||||
{
|
||||
QObject *object = 0;
|
||||
if (objectToBeWrapped)
|
||||
object = objectToBeWrapped;
|
||||
else
|
||||
createObject(nodeMetaInfo, context);
|
||||
|
||||
QDeclarativeView* view = qobject_cast<QDeclarativeView*>(object);
|
||||
if (view == 0)
|
||||
throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__);
|
||||
|
||||
Pointer instance(new QDeclarativeViewNodeInstance(view));
|
||||
|
||||
if (objectToBeWrapped)
|
||||
instance->setDeleteHeldInstance(false); // the object isn't owned
|
||||
|
||||
instance->populateResetValueHash();
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
QDeclarativeView* QDeclarativeViewNodeInstance::view() const
|
||||
{
|
||||
QDeclarativeView* view = qobject_cast<QDeclarativeView*>(widget());
|
||||
Q_ASSERT(view);
|
||||
return view;
|
||||
}
|
||||
|
||||
bool QDeclarativeViewNodeInstance::isQDeclarativeView() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void QDeclarativeViewNodeInstance::addItem(QDeclarativeItem *item)
|
||||
{
|
||||
QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem *>(view()->rootObject());
|
||||
Q_ASSERT_X(rootItem, Q_FUNC_INFO, "root item is QDeclarativeItem based");
|
||||
item->setParent(rootItem);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, 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.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef QMLVIEWNODEINSTANCE_H
|
||||
#define QMLVIEWNODEINSTANCE_H
|
||||
|
||||
#include <QWeakPointer>
|
||||
#include <QDeclarativeView>
|
||||
#include <QDeclarativeItem>
|
||||
|
||||
#include "graphicsviewnodeinstance.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
namespace Internal {
|
||||
|
||||
class QDeclarativeViewNodeInstance : public GraphicsViewNodeInstance
|
||||
{
|
||||
public:
|
||||
typedef QSharedPointer<QDeclarativeViewNodeInstance> Pointer;
|
||||
typedef QWeakPointer<QDeclarativeViewNodeInstance> WeakPointer;
|
||||
|
||||
static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped);
|
||||
|
||||
bool isQDeclarativeView() const;
|
||||
|
||||
void addItem(QDeclarativeItem *item);
|
||||
|
||||
protected:
|
||||
QDeclarativeViewNodeInstance(QDeclarativeView *view);
|
||||
|
||||
QDeclarativeView* view() const;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
#endif // QMLVIEWNODEINSTANCE_H
|
||||
@@ -0,0 +1,33 @@
|
||||
#include "removeinstancescommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
RemoveInstancesCommand::RemoveInstancesCommand()
|
||||
{
|
||||
}
|
||||
|
||||
RemoveInstancesCommand::RemoveInstancesCommand(const QVector<qint32> &idVector)
|
||||
: m_instanceIdVector(idVector)
|
||||
{
|
||||
}
|
||||
|
||||
QVector<qint32> RemoveInstancesCommand::instanceIds() const
|
||||
{
|
||||
return m_instanceIdVector;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const RemoveInstancesCommand &command)
|
||||
{
|
||||
out << command.instanceIds();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, RemoveInstancesCommand &command)
|
||||
{
|
||||
in >> command.m_instanceIdVector;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef REMOVEINSTANCESCOMMAND_H
|
||||
#define REMOVEINSTANCESCOMMAND_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include <QVector>
|
||||
|
||||
#include "instancecontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class RemoveInstancesCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, RemoveInstancesCommand &command);
|
||||
|
||||
public:
|
||||
RemoveInstancesCommand();
|
||||
RemoveInstancesCommand(const QVector<qint32> &idVector);
|
||||
|
||||
QVector<qint32> instanceIds() const;
|
||||
|
||||
private:
|
||||
QVector<qint32> m_instanceIdVector;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const RemoveInstancesCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, RemoveInstancesCommand &command);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::RemoveInstancesCommand);
|
||||
|
||||
#endif // REMOVEINSTANCESCOMMAND_H
|
||||
@@ -0,0 +1,33 @@
|
||||
#include "removepropertiescommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
RemovePropertiesCommand::RemovePropertiesCommand()
|
||||
{
|
||||
}
|
||||
|
||||
RemovePropertiesCommand::RemovePropertiesCommand(const QVector<PropertyAbstractContainer> &properties)
|
||||
: m_properties(properties)
|
||||
{
|
||||
}
|
||||
|
||||
QVector<PropertyAbstractContainer> RemovePropertiesCommand::properties() const
|
||||
{
|
||||
return m_properties;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const RemovePropertiesCommand &command)
|
||||
{
|
||||
out << command.properties();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, RemovePropertiesCommand &command)
|
||||
{
|
||||
in >> command.m_properties;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#ifndef REMOVEPROPERTIESCOMMAND_H
|
||||
#define REMOVEPROPERTIESCOMMAND_H
|
||||
|
||||
#include <QMetaType>
|
||||
#include <QVector>
|
||||
|
||||
#include "propertyabstractcontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class RemovePropertiesCommand
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, RemovePropertiesCommand &command);
|
||||
public:
|
||||
RemovePropertiesCommand();
|
||||
RemovePropertiesCommand(const QVector<PropertyAbstractContainer> &properties);
|
||||
|
||||
QVector<PropertyAbstractContainer> properties() const;
|
||||
|
||||
private:
|
||||
QVector<PropertyAbstractContainer> m_properties;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const RemovePropertiesCommand &command);
|
||||
QDataStream &operator>>(QDataStream &in, RemovePropertiesCommand &command);
|
||||
|
||||
}
|
||||
|
||||
Q_DECLARE_METATYPE(QmlDesigner::RemovePropertiesCommand);
|
||||
|
||||
#endif // REMOVEPROPERTIESCOMMAND_H
|
||||
@@ -0,0 +1,72 @@
|
||||
#include "reparentcontainer.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
ReparentContainer::ReparentContainer()
|
||||
: m_instanceId(-1),
|
||||
m_oldParentInstanceId(-1),
|
||||
m_newParentInstanceId(-1)
|
||||
{
|
||||
}
|
||||
|
||||
ReparentContainer::ReparentContainer(qint32 instanceId,
|
||||
qint32 oldParentInstanceId,
|
||||
const QString &oldParentProperty,
|
||||
qint32 newParentInstanceId,
|
||||
const QString &newParentProperty)
|
||||
: m_instanceId(instanceId),
|
||||
m_oldParentInstanceId(oldParentInstanceId),
|
||||
m_oldParentProperty(oldParentProperty),
|
||||
m_newParentInstanceId(newParentInstanceId),
|
||||
m_newParentProperty(newParentProperty)
|
||||
{
|
||||
}
|
||||
|
||||
qint32 ReparentContainer::instanceId() const
|
||||
{
|
||||
return m_instanceId;
|
||||
}
|
||||
|
||||
qint32 ReparentContainer::oldParentInstanceId() const
|
||||
{
|
||||
return m_oldParentInstanceId;
|
||||
}
|
||||
|
||||
QString ReparentContainer::oldParentProperty() const
|
||||
{
|
||||
return m_oldParentProperty;
|
||||
}
|
||||
|
||||
qint32 ReparentContainer::newParentInstanceId() const
|
||||
{
|
||||
return m_newParentInstanceId;
|
||||
}
|
||||
|
||||
QString ReparentContainer::newParentProperty() const
|
||||
{
|
||||
return m_newParentProperty;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ReparentContainer &container)
|
||||
{
|
||||
out << container.instanceId();
|
||||
out << container.oldParentInstanceId();
|
||||
out << container.oldParentProperty();
|
||||
out << container.newParentInstanceId();
|
||||
out << container.newParentProperty();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, ReparentContainer &container)
|
||||
{
|
||||
in >> container.m_instanceId;
|
||||
in >> container.m_oldParentInstanceId;
|
||||
in >> container.m_oldParentProperty;
|
||||
in >> container.m_newParentInstanceId;
|
||||
in >> container.m_newParentProperty;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
@@ -0,0 +1,38 @@
|
||||
#ifndef REPARENTCONTAINER_H
|
||||
#define REPARENTCONTAINER_H
|
||||
|
||||
#include <qmetatype.h>
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
class ReparentContainer
|
||||
{
|
||||
friend QDataStream &operator>>(QDataStream &in, ReparentContainer &container);
|
||||
public:
|
||||
ReparentContainer();
|
||||
ReparentContainer(qint32 instanceId,
|
||||
qint32 oldParentInstanceId,
|
||||
const QString &oldParentProperty,
|
||||
qint32 newParentInstanceId,
|
||||
const QString &newParentProperty);
|
||||
|
||||
qint32 instanceId() const;
|
||||
qint32 oldParentInstanceId() const;
|
||||
QString oldParentProperty() const;
|
||||
qint32 newParentInstanceId() const;
|
||||
QString newParentProperty() const;
|
||||
|
||||
private:
|
||||
qint32 m_instanceId;
|
||||
qint32 m_oldParentInstanceId;
|
||||
QString m_oldParentProperty;
|
||||
qint32 m_newParentInstanceId;
|
||||
QString m_newParentProperty;
|
||||
};
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ReparentContainer &container);
|
||||
QDataStream &operator>>(QDataStream &in, ReparentContainer &container);
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
#endif // REPARENTCONTAINER_H
|
||||
@@ -0,0 +1,34 @@
|
||||
#include "reparentinstancescommand.h"
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
ReparentInstancesCommand::ReparentInstancesCommand()
|
||||
{
|
||||
}
|
||||
|
||||
ReparentInstancesCommand::ReparentInstancesCommand(const QVector<ReparentContainer> &container)
|
||||
: m_reparentInstanceVector(container)
|
||||
{
|
||||
}
|
||||
|
||||
QVector<ReparentContainer> ReparentInstancesCommand::reparentInstances() const
|
||||
{
|
||||
return m_reparentInstanceVector;
|
||||
}
|
||||
|
||||
|
||||
QDataStream &operator<<(QDataStream &out, const ReparentInstancesCommand &command)
|
||||
{
|
||||
out << command.reparentInstances();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
QDataStream &operator>>(QDataStream &in, ReparentInstancesCommand &command)
|
||||
{
|
||||
in >> command.m_reparentInstanceVector;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user