From 35263628d13a3b02fd48eb3fe4077211bab938d9 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 10 Jun 2010 17:36:14 +0200 Subject: [PATCH] Add script function to the model This is needed to suppert inline script function of Qml in the designer --- .../components/formeditor/formeditorview.cpp | 8 ++++- .../components/formeditor/formeditorview.h | 1 + .../components/integration/componentview.cpp | 1 + .../components/integration/componentview.h | 2 +- .../designdocumentcontrollerview.cpp | 5 ++++ .../designdocumentcontrollerview.h | 1 + .../components/navigator/navigatorview.cpp | 5 ++++ .../components/navigator/navigatorview.h | 1 + .../propertyeditor/propertyeditor.cpp | 5 ++++ .../propertyeditor/propertyeditor.h | 1 + .../stateseditor/stateseditorview.cpp | 9 ++++++ .../stateseditor/stateseditorview.h | 2 +- .../designercore/include/abstractview.h | 2 ++ .../designercore/include/forwardview.h | 8 +++++ .../designercore/include/modelnode.h | 4 +++ .../designercore/include/nodeinstanceview.h | 2 ++ .../designercore/include/rewriterview.h | 1 + .../instances/nodeinstanceview.cpp | 4 +++ .../designercore/model/internalnode.cpp | 10 +++++++ .../designercore/model/internalnode_p.h | 5 ++++ .../qmldesigner/designercore/model/model.cpp | 30 +++++++++++++++++++ .../qmldesigner/designercore/model/model_p.h | 4 +++ .../designercore/model/modelnode.cpp | 10 +++++++ .../designercore/model/rewriterview.cpp | 4 +++ .../designercore/model/viewlogger.cpp | 6 ++++ .../designercore/model/viewlogger.h | 1 + 26 files changed, 129 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 1904c0bec20..3488be937ab 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -235,7 +235,7 @@ FormEditorWidget *FormEditorView::widget() const void FormEditorView::nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId) { - nodeInstanceView()->nodeIdChanged(node, newId, oldId); + QmlModelView::nodeIdChanged(node, newId, oldId); } void FormEditorView::selectedNodesChanged(const QList &selectedNodeList, @@ -258,6 +258,12 @@ void FormEditorView::selectedNodesChanged(const QList &selectedNodeLi m_scene->update(); } +void FormEditorView::scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) +{ + QmlModelView::scriptFunctionsChanged(node, scriptFunctionList); +} + + AbstractFormEditorTool* FormEditorView::currentTool() const { return m_currentTool; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index 1c7d787c351..4123ffdd7e0 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -77,6 +77,7 @@ public: void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList); + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); // FormEditorView FormEditorWidget *widget() const; diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp index 8d52c3c4a2e..af8a9181e8f 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.cpp +++ b/src/plugins/qmldesigner/components/integration/componentview.cpp @@ -159,6 +159,7 @@ void ComponentView::propertiesRemoved(const QList& /*propertyL void ComponentView::variantPropertiesChanged(const QList& /*propertyList*/, PropertyChangeFlags /*propertyChange*/) {} void ComponentView::bindingPropertiesChanged(const QList& /*propertyList*/, PropertyChangeFlags /*propertyChange*/) {} void ComponentView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) {} +void ComponentView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) {} diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h index f4f553d6ef8..b1028b23e2f 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.h +++ b/src/plugins/qmldesigner/components/integration/componentview.h @@ -66,7 +66,7 @@ public: void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange); void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange); void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion); - + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); void selectedNodesChanged(const QList &selectedNodeList, diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp index e3d695d8885..dc5244f79f3 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp @@ -56,6 +56,11 @@ void DesignDocumentControllerView::selectedNodesChanged(const QList & void DesignDocumentControllerView::nodeOrderChanged(const NodeListProperty & /*listProperty*/, const ModelNode & /*movedNode*/, int /*oldIndex*/) {}; +void DesignDocumentControllerView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) +{ +} + + static QStringList arrayToStringList(const QByteArray &byteArray) { QString str(QString::fromLatin1(byteArray)); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h index 7a167555883..9632c3569a2 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h @@ -57,6 +57,7 @@ public: const QList &lastSelectedNodeList); virtual void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex); + virtual void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); ModelNode insertModel(const ModelNode &modelNode) { return m_modelMerger.insertModel(modelNode); } diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index bdbdd634878..44e940b3a6d 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -186,6 +186,11 @@ void NavigatorView::auxiliaryDataChanged(const ModelNode &node, const QString & } } +void NavigatorView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) +{ +} + + void NavigatorView::nodeOrderChanged(const NodeListProperty &/*listProperty*/, const ModelNode &node, int /*oldIndex*/) { if (m_treeModel->isInTree(node)) diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h index 791498297c6..27ffbb47bc8 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.h +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h @@ -80,6 +80,7 @@ public: void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList); void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); private slots: diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index 613f2272888..b4061b1d2b4 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -798,6 +798,11 @@ void PropertyEditor::nodeIdChanged(const ModelNode& node, const QString& newId, } } +void PropertyEditor::scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) +{ + QmlModelView::scriptFunctionsChanged(node, scriptFunctionList); +} + void PropertyEditor::select(const ModelNode &node) { if (QmlItemNode(node).isValid()) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h index a3e0bb65710..70cdedda179 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h @@ -101,6 +101,7 @@ public: void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange); void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId); + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); protected: void timerEvent(QTimerEvent *event); diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index 0c76cd254fe..6b0834fed7d 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -399,6 +399,15 @@ void StatesEditorView::customNotification(const AbstractView * view, const QStri QmlModelView::customNotification(view, identifier, nodeList, data); } +void StatesEditorView::scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) +{ + if (debug) + qDebug() << __FUNCTION__; + + QmlModelView::scriptFunctionsChanged(node, scriptFunctionList); +} + + QPixmap StatesEditorView::renderState(int i) { if (debug) diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h index cab2badec75..9e5098c76f4 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h @@ -57,7 +57,6 @@ public: void nodeInstancePropertyChanged(const ModelNode &node, const QString &propertyName); -protected: // AbstractView void modelAttached(Model *model); void modelAboutToBeDetached(Model *model); @@ -76,6 +75,7 @@ protected: void otherPropertyChanged(const QmlObjectNode &qmlObjectNode, const QString &propertyName); void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data); + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); protected: diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 155f18eaff3..1351f83e922 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -129,6 +129,8 @@ public: virtual void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data); + virtual void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) = 0; + QmlModelView *toQmlModelView(); void changeRootNodeType(const QString &type, int majorVersion, int minorVersion); diff --git a/src/plugins/qmldesigner/designercore/include/forwardview.h b/src/plugins/qmldesigner/designercore/include/forwardview.h index 7edeae303ca..a08dcda19c9 100644 --- a/src/plugins/qmldesigner/designercore/include/forwardview.h +++ b/src/plugins/qmldesigner/designercore/include/forwardview.h @@ -76,6 +76,7 @@ public: void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); protected: void appendView(ViewType *view); @@ -245,6 +246,13 @@ void ForwardView::auxiliaryDataChanged(const ModelNode &node, const QS view->auxiliaryDataChanged(ModelNode(node, view.data()), name, data); } +template + void ForwardView::scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList) +{ + foreach (const ViewTypePointer &view, m_targetViewList) + view->scriptFunctionsChanged(node, scriptFunctionList); +} + template void ForwardView::appendView(ViewType *view) { diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index 1e6ec3b3db0..8d0e9033203 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -135,6 +135,10 @@ public: bool hasNodeProperty(const QString &name) const; bool hasNodeListProperty(const QString &name) const; + + void setScriptFunctions(const QStringList &scriptFunctionList); + QStringList scriptFunctions() const; + //### void destroy(); diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 6483f55c7b8..64835fbe367 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -84,6 +84,8 @@ public: void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId); void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex); void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList); + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); + QList instances() const; NodeInstance instanceForNode(const ModelNode &node); diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 2e4cd1e0257..77875ff64fb 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -124,6 +124,7 @@ public: void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex); void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion); void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data); + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); void importAdded(const Import &import); void importRemoved(const Import &import); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 39876a08a78..443c189d0c9 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -374,6 +374,10 @@ void NodeInstanceView::selectedNodesChanged(const QList &/*selectedNo { } +void NodeInstanceView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) +{ + +} //\} diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index 21183fdaab2..19d53860048 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -311,5 +311,15 @@ bool operator <(const InternalNode::Pointer &firstNode, const InternalNode::Poin return firstNode.data() < secondNode.data(); } +void InternalNode::setScriptFunctions(const QStringList &scriptFunctionList) +{ + m_scriptFunctionList = scriptFunctionList; +} + +QStringList InternalNode::scriptFunctions() const +{ + return m_scriptFunctionList; +} + } } diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index 840744738d6..8c5e317e487 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -34,6 +34,7 @@ #include #include #include +#include #include "internalproperty.h" #include "internalvariantproperty.h" #include "internalbindingproperty.h" @@ -112,6 +113,9 @@ public: QList allSubNodes() const; QList allDirectSubNodes() const; + void setScriptFunctions(const QStringList &scriptFunctionList); + QStringList scriptFunctions() const; + protected: Pointer internalPointer() const; void setInternalWeakPointer(const Pointer &pointer); @@ -133,6 +137,7 @@ private: bool m_valid; QHash m_namePropertyHash; + QStringList m_scriptFunctionList; }; uint qHash(const InternalNodePointer& node); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 2a9fdaf199f..7c0bc1d90f2 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -531,6 +531,29 @@ void ModelPrivate::notifyBindingPropertiesChanged(const QList &view, m_viewList) { + Q_ASSERT(view != 0); + + + ModelNode node(internalNodePointer, model(), view.data()); + try { + view->scriptFunctionsChanged(node, scriptFunctionList); + } catch (RewritingException &e) { + description = e.description(); + resetModel = true; + } + } + if (resetModel) { + resetModelByRewriter(description); + } +} + + void ModelPrivate::notifyVariantPropertiesChanged(const InternalNodePointer &internalNodePointer, const QStringList& propertyNameList, AbstractView::PropertyChangeFlags propertyChange) { bool resetModel = false; @@ -840,6 +863,13 @@ void ModelPrivate::changeRootNodeType(const QString &type, int majorVersion, int notifyRootNodeTypeChanged(type, majorVersion, minorVersion); } +void ModelPrivate::setScriptFunctions(const InternalNode::Pointer &internalNode, const QStringList &scriptFunctionList) +{ + internalNode->setScriptFunctions(scriptFunctionList); + + notifyScriptFunctionsChanged(internalNode, scriptFunctionList); +} + void ModelPrivate::changeNodeOrder(const InternalNode::Pointer &internalParentNode, const QString &listPropertyName, int from, int to) { InternalNodeListProperty::Pointer nodeList(internalParentNode->nodeListProperty(listPropertyName)); diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 026f0b079af..f678e362db7 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -132,6 +132,7 @@ public: void notifyPropertiesAboutToBeRemoved(const QList &propertyList); void notifyBindingPropertiesChanged(const QList &propertyList, AbstractView::PropertyChangeFlags propertyChange); void notifyVariantPropertiesChanged(const InternalNodePointer &internalNodePointer, const QStringList& propertyNameList, AbstractView::PropertyChangeFlags propertyChange); + void notifyScriptFunctionsChanged(const InternalNodePointer &internalNodePointer, const QStringList &scriptFunctionList); void notifyNodeOrderChanged(const InternalNodeListPropertyPointer &internalListPropertyPointer, const InternalNodePointer &internalNodePointer, int oldIndex); void notifyAuxiliaryDataChanged(const InternalNodePointer &internalNode, const QString &name, const QVariant &data); @@ -140,6 +141,8 @@ public: void notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList &nodeList, const QList &data); + + void setSelectedNodes(const QList &selectedNodeList); void clearSelectedNodes(); QList selectedNodes() const; @@ -176,6 +179,7 @@ public: void checkPropertyName(const QString &propertyName); void clearParent(const InternalNodePointer &internalNode); void changeRootNodeType(const QString &type, int majorVersion, int minorVersion); + void setScriptFunctions(const InternalNodePointer &internalNode, const QStringList &scriptFunctionList); InternalNodePointer nodeForId(const QString &id) const; bool hasId(const QString &id) const; diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index ec8c6e36515..722f93777f3 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -908,4 +908,14 @@ bool ModelNode::hasAuxiliaryData(const QString &name) const return internalNode()->hasAuxiliaryData(name); } +void ModelNode::setScriptFunctions(const QStringList &scriptFunctionList) +{ + model()->m_d->setScriptFunctions(internalNode(), scriptFunctionList); +} + +QStringList ModelNode::scriptFunctions() const +{ + return internalNode()->scriptFunctions(); +} + } diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 71746b7f062..8cc7575269e 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -352,6 +352,10 @@ void RewriterView::customNotification(const AbstractView * /*view*/, const QStri } } +void RewriterView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) +{ +} + void RewriterView::selectedNodesChanged(const QList & /* selectedNodeList, */, const QList & /*lastSelectedNodeList */) { } diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp index 1cb8a1b4e5e..3e4d33852d5 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp @@ -194,6 +194,12 @@ void ViewLogger::customNotification(const AbstractView *view, const QString &ide m_output << time() << indent("data: ") << variant.toString() << endl; } +void ViewLogger::scriptFunctionsChanged(const ModelNode &node, const QStringList &/*scriptFunctionList*/) +{ + m_output << time() << indent("function scripts changed:") << node << endl; + +} + } // namespace Internal } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.h b/src/plugins/qmldesigner/designercore/model/viewlogger.h index 321e41fce5a..cdadd623734 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.h +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.h @@ -70,6 +70,7 @@ public: void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data); void customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data); + void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList); protected: QString time() const;