From dd32d1a16e81cdf5a540cd1fff7eb9879a725033 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 8 Jul 2015 12:57:40 +0200 Subject: [PATCH] QmlDesigner: Add error channel from puppet -> designer Change-Id: I57c325fd98ed505abc19f87ac8a164d7e0c76244 Reviewed-by: Tim Jenssen --- .../designercore/include/abstractview.h | 2 ++ .../designercore/include/nodeinstance.h | 3 +++ .../designercore/include/qmlobjectnode.h | 2 ++ .../designercore/instances/nodeinstance.cpp | 22 +++++++++++++++++++ .../designercore/model/abstractview.cpp | 11 ++++++++++ .../qmldesigner/designercore/model/model.cpp | 13 +++++++++++ .../qmldesigner/designercore/model/model_p.h | 1 + .../designercore/model/qmlobjectnode.cpp | 16 ++++++++++++++ 8 files changed, 70 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 23869706b65..cfe711bd423 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -173,6 +173,7 @@ public: void emitCustomNotification(const QString &identifier, const QList &nodeList, const QList &data); void emitInstancePropertyChange(const QList > &propertyList); + void emitInstanceErrorChange(const QVector &instanceIds); void emitInstancesCompleted(const QVector &nodeList); void emitInstanceInformationsChange(const QMultiHash &informationChangeHash); void emitInstancesRenderImageChanged(const QVector &nodeList); @@ -214,6 +215,7 @@ public: virtual void rewriterEndTransaction() = 0; virtual void currentStateChanged(const ModelNode &node) = 0; // base state is a invalid model node + virtual void instanceErrorChange(const QVector &errorNodeList); virtual void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) = 0; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h index a5380e4f56a..3fbc26096e1 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstance.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstance.h @@ -94,6 +94,8 @@ public: void setY(double y); bool hasAnchors() const; + QString error() const; + bool hasError() const; protected: void setProperty(const PropertyName &name, const QVariant &value); @@ -124,6 +126,7 @@ protected: void setParentId(qint32 instanceId); void setRenderPixmap(const QImage &image); + bool setError(const QString &errorMessage); NodeInstance(ProxyNodeInstanceData *d); private: diff --git a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h index cd25e4dd6d8..ce34747aebd 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlobjectnode.h @@ -55,6 +55,8 @@ public: static bool isValidQmlObjectNode(const ModelNode &modelNode); bool isValid() const; + bool hasError() const; + QString error() const; bool hasNodeParent() const; bool hasInstanceParent() const; bool hasInstanceParentItem() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index 2bd816ffd2d..cdd10e74411 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -84,6 +84,8 @@ public: QPixmap renderPixmap; QPixmap blurredRenderPixmap; + QString errorMessage; + QHash > anchors; }; @@ -179,6 +181,17 @@ bool NodeInstance::hasAnchors() const || hasAnchor("anchors.baseline"); } +QString NodeInstance::error() const +{ + return d->errorMessage; +} + +bool NodeInstance::hasError() const +{ + return !d->errorMessage.isEmpty(); +} + + bool NodeInstance::isValid() const { return instanceId() >= 0 && modelNode().isValid(); @@ -392,6 +405,15 @@ void NodeInstance::setRenderPixmap(const QImage &image) d->blurredRenderPixmap = QPixmap(); } +bool NodeInstance::setError(const QString &errorMessage) +{ + if (d->errorMessage != errorMessage) { + d->errorMessage = errorMessage; + return true; + } + return false; +} + void NodeInstance::setParentId(qint32 instanceId) { d->parentInstanceId = instanceId; diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index d38ae92064c..276a775d5e5 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -192,6 +192,11 @@ void AbstractView::modelAboutToBeDetached(Model *) Empty properties were removed. */ + +void AbstractView::instanceErrorChange(const QVector &/*errorNodeList*/) +{ +} + // Node related functions /*! @@ -462,6 +467,12 @@ void AbstractView::emitInstancePropertyChange(const QListd->notifyInstancePropertyChange(propertyList); } +void AbstractView::emitInstanceErrorChange(const QVector &instanceIds) +{ + if (model() && nodeInstanceView() == this) + model()->d->notifyInstanceErrorChange(instanceIds); +} + void AbstractView::emitInstancesCompleted(const QVector &nodeVector) { if (model() && nodeInstanceView() == this) diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index e843c824cac..20547ce3bd4 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -435,6 +435,19 @@ void ModelPrivate::notifyInstancePropertyChange(const QList &instanceIds) +{ + // no need to notify the rewriter or the instance view + + QVector errorNodeList; + foreach (const QPointer &view, m_viewList) { + Q_ASSERT(view != 0); + foreach (qint32 instanceId, instanceIds) + errorNodeList.append(ModelNode(model()->d->nodeForInternalId(instanceId), model(), view)); + view->instanceErrorChange(errorNodeList); + } +} + void ModelPrivate::notifyInstancesCompleted(const QVector &nodeVector) { bool resetModel = false; diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index cad8d021282..ab088c92968 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -152,6 +152,7 @@ public: void notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList &nodeList, const QList &data); void notifyInstancePropertyChange(const QList > &propertyList); + void notifyInstanceErrorChange(const QVector &instanceIds); void notifyInstancesCompleted(const QVector &nodeList); void notifyInstancesInformationsChange(const QMultiHash &informationChangeHash); void notifyInstancesRenderImageChanged(const QVector &nodeList); diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 30d46571acb..98e251bc993 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -486,6 +486,22 @@ bool QmlObjectNode::isValid() const return isValidQmlObjectNode(modelNode()); } +bool QmlObjectNode::hasError() const +{ + if (isValid()) + return nodeInstance().hasError(); + else + qDebug() << "called hasError() on an invalid QmlObjectNode"; + return false; +} + +QString QmlObjectNode::error() const +{ + if (hasError()) + return nodeInstance().error(); + return QString(); +} + bool QmlObjectNode::hasNodeParent() const { return modelNode().hasParentProperty();