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 <thomas.hartmann@qt.io>
This commit is contained in:
Aleksei German
2020-06-09 14:50:26 +02:00
parent def4655042
commit e069293a4b
3 changed files with 35 additions and 10 deletions

View File

@@ -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() void BindingEditor::prepareBindings()
{ {
if (!m_modelNode.isValid() || m_backendValueTypeName.isEmpty()) if (!m_modelNode.isValid() || m_backendValueTypeName.isEmpty())
@@ -172,25 +185,28 @@ void BindingEditor::prepareBindings()
QList<BindingEditorDialog::BindingOption> bindings; QList<BindingEditorDialog::BindingOption> bindings;
for (auto objnode : allNodes) { const QList<TypeName> variantTypes = {"alias", "unknown", "variant", "var"};
const bool skipTypeFiltering = variantTypes.contains(m_backendValueTypeName);
for (const auto &objnode : allNodes) {
BindingEditorDialog::BindingOption binding; BindingEditorDialog::BindingOption binding;
for (auto propertyName : objnode.metaInfo().propertyNames()) for (const auto &propertyName : objnode.metaInfo().propertyNames())
{ {
TypeName propertyTypeName = objnode.metaInfo().propertyTypeName(propertyName); TypeName propertyTypeName = objnode.metaInfo().propertyTypeName(propertyName);
if ((propertyTypeName == "alias" || propertyTypeName == "unknown")) if ((m_backendValueTypeName == propertyTypeName)
if (QmlObjectNode::isValidQmlObjectNode(objnode)) || skipTypeFiltering
propertyTypeName = QmlObjectNode(objnode).instanceType(propertyName); || variantTypes.contains(propertyTypeName)) {
if (m_backendValueTypeName == propertyTypeName)
binding.properties.append(QString::fromUtf8(propertyName)); binding.properties.append(QString::fromUtf8(propertyName));
} }
}
//dynamic properties: //dynamic properties:
for (const BindingProperty &bindingProperty : objnode.bindingProperties()) { for (const BindingProperty &bindingProperty : objnode.bindingProperties()) {
if (bindingProperty.isValid()) { if (bindingProperty.isValid()) {
if (bindingProperty.isDynamic()) { 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())); binding.properties.append(QString::fromUtf8(bindingProperty.name()));
} }
} }
@@ -199,7 +215,8 @@ void BindingEditor::prepareBindings()
for (const VariantProperty &variantProperty : objnode.variantProperties()) { for (const VariantProperty &variantProperty : objnode.variantProperties()) {
if (variantProperty.isValid()) { if (variantProperty.isValid()) {
if (variantProperty.isDynamic()) { 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())); binding.properties.append(QString::fromUtf8(variantProperty.name()));
} }
} }

View File

@@ -58,10 +58,18 @@ public:
QString bindingValue() const; QString bindingValue() const;
void setBindingValue(const QString &text); 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 setBackendValue(const QVariant &backendValue);
void setModelNodeBackend(const QVariant &modelNodeBackend); void setModelNodeBackend(const QVariant &modelNodeBackend);
//2. modelnode (this one also sets backend value type name to bool)
void setStateModelNode(const QVariant &stateModelNode); 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 prepareBindings();
Q_INVOKABLE void updateWindowName(); Q_INVOKABLE void updateWindowName();

View File

@@ -225,7 +225,7 @@ void BindingEditorDialog::setupComboBoxes()
m_comboBoxItem->clear(); m_comboBoxItem->clear();
m_comboBoxProperty->clear(); m_comboBoxProperty->clear();
for (auto bind : m_bindings) for (const auto &bind : m_bindings)
m_comboBoxItem->addItem(bind.item); m_comboBoxItem->addItem(bind.item);
} }