From e069293a4b0af4cccc3f1328c269e5e74f3df104 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 9 Jun 2020 14:50:26 +0200 Subject: [PATCH] QmlDesigner: Variant types for Binding Editor - Variant and alias types proper support - Extended instantiation options for Editor Task: QDS-2264 Change-Id: I95ff24fb81ce64b4effc64803304ff2b150a7ff6 Reviewed-by: Thomas Hartmann --- .../bindingeditor/bindingeditor.cpp | 35 ++++++++++++++----- .../components/bindingeditor/bindingeditor.h | 8 +++++ .../bindingeditor/bindingeditordialog.cpp | 2 +- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp index c1c1419d2db..9153d4d6a88 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp @@ -163,6 +163,19 @@ void BindingEditor::setStateModelNode(const QVariant &stateModelNode) } } +void BindingEditor::setModelNode(const ModelNode &modelNode) +{ + if (modelNode.isValid()) + m_modelNode = modelNode; +} + +void BindingEditor::setBackendValueTypeName(const TypeName &backendValueTypeName) +{ + m_backendValueTypeName = backendValueTypeName; + + emit backendValueChanged(); +} + void BindingEditor::prepareBindings() { if (!m_modelNode.isValid() || m_backendValueTypeName.isEmpty()) @@ -172,25 +185,28 @@ void BindingEditor::prepareBindings() QList bindings; - for (auto objnode : allNodes) { + const QList variantTypes = {"alias", "unknown", "variant", "var"}; + const bool skipTypeFiltering = variantTypes.contains(m_backendValueTypeName); + + for (const auto &objnode : allNodes) { BindingEditorDialog::BindingOption binding; - for (auto propertyName : objnode.metaInfo().propertyNames()) + for (const auto &propertyName : objnode.metaInfo().propertyNames()) { TypeName propertyTypeName = objnode.metaInfo().propertyTypeName(propertyName); - if ((propertyTypeName == "alias" || propertyTypeName == "unknown")) - if (QmlObjectNode::isValidQmlObjectNode(objnode)) - propertyTypeName = QmlObjectNode(objnode).instanceType(propertyName); - - if (m_backendValueTypeName == propertyTypeName) + if ((m_backendValueTypeName == propertyTypeName) + || skipTypeFiltering + || variantTypes.contains(propertyTypeName)) { binding.properties.append(QString::fromUtf8(propertyName)); + } } //dynamic properties: for (const BindingProperty &bindingProperty : objnode.bindingProperties()) { if (bindingProperty.isValid()) { if (bindingProperty.isDynamic()) { - if (bindingProperty.dynamicTypeName() == m_backendValueTypeName) { + const TypeName dynamicTypeName = bindingProperty.dynamicTypeName(); + if ((dynamicTypeName == m_backendValueTypeName) || variantTypes.contains(dynamicTypeName)) { binding.properties.append(QString::fromUtf8(bindingProperty.name())); } } @@ -199,7 +215,8 @@ void BindingEditor::prepareBindings() for (const VariantProperty &variantProperty : objnode.variantProperties()) { if (variantProperty.isValid()) { if (variantProperty.isDynamic()) { - if (variantProperty.dynamicTypeName() == m_backendValueTypeName) { + const TypeName dynamicTypeName = variantProperty.dynamicTypeName(); + if ((dynamicTypeName == m_backendValueTypeName) || variantTypes.contains(dynamicTypeName)) { binding.properties.append(QString::fromUtf8(variantProperty.name())); } } diff --git a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.h b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.h index 790f6995c12..495462128f8 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.h +++ b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.h @@ -58,10 +58,18 @@ public: QString bindingValue() const; void setBindingValue(const QString &text); + //there are few ways to setup backend for binding editor: + //1. backend value + model node backend void setBackendValue(const QVariant &backendValue); void setModelNodeBackend(const QVariant &modelNodeBackend); + + //2. modelnode (this one also sets backend value type name to bool) void setStateModelNode(const QVariant &stateModelNode); + //3. modelnode + backend value type name + void setModelNode(const ModelNode &modelNode); + void setBackendValueTypeName(const TypeName &backendValueTypeName); + Q_INVOKABLE void prepareBindings(); Q_INVOKABLE void updateWindowName(); diff --git a/src/plugins/qmldesigner/components/bindingeditor/bindingeditordialog.cpp b/src/plugins/qmldesigner/components/bindingeditor/bindingeditordialog.cpp index 1967ded0ca3..9d2b1cb9e0c 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/bindingeditordialog.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/bindingeditordialog.cpp @@ -225,7 +225,7 @@ void BindingEditorDialog::setupComboBoxes() m_comboBoxItem->clear(); m_comboBoxProperty->clear(); - for (auto bind : m_bindings) + for (const auto &bind : m_bindings) m_comboBoxItem->addItem(bind.item); }