From 8c97f870b9ee42f91e296ae39c968d3d3a092fb9 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Fri, 10 Jul 2020 15:17:44 +0200 Subject: [PATCH] QmlDesigner: Add Singleton support to Connections Change-Id: I07eae4e381f172d7c6a23ee5b7e13273afa788b9 Reviewed-by: Thomas Hartmann --- .../connectioneditor/connectionmodel.cpp | 45 ++++++++++++++++++- .../components/connectioneditor/delegates.cpp | 24 ++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp index 2a17c2ec6d1..4bafa046474 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp @@ -34,6 +34,8 @@ #include #include #include +#include +#include #include #include @@ -209,10 +211,27 @@ void ConnectionModel::updateTargetNode(int rowNumber) ModelNode connectionNode = signalHandlerProperty.parentModelNode(); const bool isAlias = newTarget.contains("."); + bool isSingleton = false; + + if (RewriterView* rv = connectionView()->rewriterView()) { + for (const QmlTypeData &data : rv->getQMLTypes()) { + if (!data.typeName.isEmpty()) { + if (data.typeName == newTarget) { + if (connectionView()->model()->metaInfo(data.typeName.toUtf8()).isValid()) { + isSingleton = true; + break; + } + } + } + } + } if (!newTarget.isEmpty()) { - //if it's an alias, then let's reparent connections to alias property owner: - const ModelNode parent = connectionView()->modelNodeForId(isAlias + //if it's a singleton, then let's reparent connections to rootNode, + //if it's an alias, then reparent to alias property owner: + const ModelNode parent = connectionView()->modelNodeForId(isSingleton + ? connectionView()->rootModelNode().id() + : isAlias ? newTarget.split(".").constFirst() : newTarget); @@ -430,6 +449,28 @@ QStringList ConnectionModel::getPossibleSignalsForConnection(const ModelNode &co QStringList stringList; if (connection.isValid()) { + + //separate check for singletons + if (connection.hasBindingProperty("target")) { + BindingProperty bp = connection.bindingProperty("target"); + + if (bp.isValid()) { + if (RewriterView *rv = connectionView()->rewriterView()) { + for (const QmlTypeData &data : rv->getQMLTypes()) { + if (!data.typeName.isEmpty()) { + if (data.typeName == bp.expression()) { + NodeMetaInfo metaInfo = connectionView()->model()->metaInfo(data.typeName.toUtf8()); + if (metaInfo.isValid()) { + stringList.append(propertyNameListToStringList(metaInfo.signalNames())); + return stringList; + } + } + } + } + } + } + } + ModelNode targetNode = getTargetNodeForConnection(connection); if (targetNode.isValid() && targetNode.metaInfo().isValid()) { stringList.append(propertyNameListToStringList(targetNode.metaInfo().signalNames())); diff --git a/src/plugins/qmldesigner/components/connectioneditor/delegates.cpp b/src/plugins/qmldesigner/components/connectioneditor/delegates.cpp index 37232d202eb..864404047ee 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/delegates.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/delegates.cpp @@ -30,6 +30,7 @@ #include "bindingmodel.h" #include "dynamicpropertiesmodel.h" #include "connectionview.h" +#include "nodemetainfo.h" #include @@ -152,11 +153,13 @@ QWidget *BindingDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt bindingComboBox->addItems(model->possibleTargetProperties(bindingProperty)); } break; case BindingModel::SourceModelNodeRow: { + //common items for (const ModelNode &modelNode : model->connectionView()->allModelNodes()) { if (!modelNode.id().isEmpty()) { bindingComboBox->addItem(modelNode.id()); } } + //singletons: if (RewriterView* rv = model->connectionView()->rewriterView()) { for (const QmlTypeData &data : rv->getQMLTypes()) { if (!data.typeName.isEmpty()) { @@ -164,6 +167,7 @@ QWidget *BindingDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt } } } + //parent: if (!bindingProperty.parentModelNode().isRootNode()) bindingComboBox->addItem(QLatin1String("parent")); } break; @@ -306,6 +310,26 @@ QWidget *ConnectionDelegate::createEditor(QWidget *parent, const QStyleOptionVie } } } + //singletons: + if (RewriterView* rv = connectionModel->connectionView()->rewriterView()) { + for (const QmlTypeData &data : rv->getQMLTypes()) { + if (!data.typeName.isEmpty()) { + connectionComboBox->addItem(data.typeName); + + NodeMetaInfo metaInfo = connectionModel->connectionView()->model()->metaInfo(data.typeName.toUtf8()); + + if (metaInfo.isValid()) { + for (const PropertyName &propertyName : metaInfo.propertyNames()) { + if (metaInfo.propertyTypeName(propertyName) == "alias") { + connectionComboBox->addItem(data.typeName + + "." + + QString::fromUtf8(propertyName)); + } + } + } + } + } + } } break; case ConnectionModel::TargetPropertyNameRow: { connectionComboBox->addItems(prependOnForSignalHandler(connectionModel->getSignalsForRow(index.row())));