QmlDesigner: Add Singleton support to Connections

Change-Id: I07eae4e381f172d7c6a23ee5b7e13273afa788b9
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Aleksei German
2020-07-10 15:17:44 +02:00
parent c0d4127d70
commit 8c97f870b9
2 changed files with 67 additions and 2 deletions

View File

@@ -34,6 +34,8 @@
#include <exception.h>
#include <nodemetainfo.h>
#include <nodelistproperty.h>
#include <rewriterview.h>
#include <nodemetainfo.h>
#include <QStandardItemModel>
#include <QMessageBox>
@@ -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()));

View File

@@ -30,6 +30,7 @@
#include "bindingmodel.h"
#include "dynamicpropertiesmodel.h"
#include "connectionview.h"
#include "nodemetainfo.h"
#include <bindingproperty.h>
@@ -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())));