QmlDesigner Add Binding Editor support to States

Change-Id: I3ccce5e2bfbbfa0dfba1e438d527fa18348005b5
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Aleksei German
2019-11-12 17:06:06 +01:00
parent d9981135c1
commit 5bb0298f69
5 changed files with 58 additions and 26 deletions

View File

@@ -114,6 +114,7 @@ Rectangle {
var y = root.mapToGlobal(0,0).y - 32 var y = root.mapToGlobal(0,0).y - 32
bindingEditor.showWidget(x, y) bindingEditor.showWidget(x, y)
bindingEditor.text = delegateWhenConditionString bindingEditor.text = delegateWhenConditionString
bindingEditor.prepareBindings()
} }
} }
@@ -205,6 +206,8 @@ Rectangle {
id: bindingEditor id: bindingEditor
stateModelNodeProperty: statesEditorModel.stateModelNode()
onRejected: { onRejected: {
hideWidget() hideWidget()
} }

View File

@@ -134,7 +134,7 @@ bool BindingEditorWidget::event(QEvent *event)
TextEditor::AssistInterface *BindingEditorWidget::createAssistInterface( TextEditor::AssistInterface *BindingEditorWidget::createAssistInterface(
TextEditor::AssistKind assistKind, TextEditor::AssistReason assistReason) const TextEditor::AssistKind assistKind, TextEditor::AssistReason assistReason) const
{ {
Q_UNUSED(assistKind); Q_UNUSED(assistKind)
return new QmlJSEditor::QmlJSCompletionAssistInterface( return new QmlJSEditor::QmlJSCompletionAssistInterface(
document(), position(), QString(), document(), position(), QString(),
assistReason, qmljsdocument->semanticInfo()); assistReason, qmljsdocument->semanticInfo());
@@ -489,44 +489,56 @@ void BindingEditor::setModelNodeBackend(const QVariant &modelNodeBackend)
if (!modelNodeBackend.isNull() && modelNodeBackend.isValid()) { if (!modelNodeBackend.isNull() && modelNodeBackend.isValid()) {
m_modelNodeBackend = modelNodeBackend; m_modelNodeBackend = modelNodeBackend;
const auto modelNodeBackendObject = m_modelNodeBackend.value<QObject*>();
const auto backendObjectCasted =
qobject_cast<const QmlDesigner::QmlModelNodeProxy *>(modelNodeBackendObject);
if (backendObjectCasted) {
m_modelNode = backendObjectCasted->qmlObjectNode().modelNode();
}
emit modelNodeBackendChanged(); emit modelNodeBackendChanged();
} }
} }
void BindingEditor::setStateModelNode(const QVariant &stateModelNode)
{
if (stateModelNode.isValid())
{
m_stateModelNode = stateModelNode;
m_modelNode = m_stateModelNode.value<QmlDesigner::ModelNode>();
if (m_modelNode.isValid())
m_backendValueTypeName = "bool";
emit stateModelNodeChanged();
}
}
void BindingEditor::prepareBindings() void BindingEditor::prepareBindings()
{ {
if (m_backendValue.isNull() || m_modelNodeBackend.isNull()) if (!m_modelNode.isValid() || m_backendValueTypeName.isEmpty())
return; return;
if (!(m_backendValue.isValid() && m_modelNodeBackend.isValid())) const QList<QmlDesigner::ModelNode> allNodes = m_modelNode.view()->allModelNodes();
return;
const auto modelNodeBackendObject = m_modelNodeBackend.value<QObject*>(); QList<BindingEditorDialog::BindingOption> bindings;
const auto backendObjectCasted = for (auto objnode : allNodes) {
qobject_cast<const QmlDesigner::QmlModelNodeProxy *>(modelNodeBackendObject); BindingEditorDialog::BindingOption binding;
for (auto propertyName : objnode.metaInfo().propertyNames())
if (m_backendValueTypeName == objnode.metaInfo().propertyTypeName(propertyName))
binding.properties.append(QString::fromUtf8(propertyName));
if (backendObjectCasted) { if (!binding.properties.isEmpty() && objnode.hasId()) {
const QmlDesigner::ModelNode a = backendObjectCasted->qmlObjectNode().modelNode(); binding.item = objnode.displayName();
const QList<QmlDesigner::ModelNode> allNodes = a.view()->allModelNodes(); bindings.append(binding);
QList<BindingEditorDialog::BindingOption> bindings;
for (auto objnode : allNodes) {
BindingEditorDialog::BindingOption binding;
for (auto propertyName : objnode.metaInfo().propertyNames())
if (m_backendValueTypeName == objnode.metaInfo().propertyTypeName(propertyName))
binding.properties.append(QString::fromUtf8(propertyName));
if (!binding.properties.isEmpty() && objnode.hasId()) {
binding.item = objnode.displayName();
bindings.append(binding);
}
} }
if (!bindings.isEmpty() && !m_dialog.isNull())
m_dialog->setAllBindings(bindings);
} }
if (!bindings.isEmpty() && !m_dialog.isNull())
m_dialog->setAllBindings(bindings);
} }
QVariant BindingEditor::backendValue() const QVariant BindingEditor::backendValue() const
@@ -539,5 +551,10 @@ QVariant BindingEditor::modelNodeBackend() const
return m_modelNodeBackend; return m_modelNodeBackend;
} }
QVariant BindingEditor::stateModelNode() const
{
return m_stateModelNode;
}
} }

View File

@@ -144,6 +144,7 @@ class BindingEditor : public QObject
Q_PROPERTY(QString text READ bindingValue WRITE setBindingValue) Q_PROPERTY(QString text READ bindingValue WRITE setBindingValue)
Q_PROPERTY(QVariant backendValueProperty READ backendValue WRITE setBackendValue NOTIFY backendValueChanged) Q_PROPERTY(QVariant backendValueProperty READ backendValue WRITE setBackendValue NOTIFY backendValueChanged)
Q_PROPERTY(QVariant modelNodeBackendProperty READ modelNodeBackend WRITE setModelNodeBackend NOTIFY modelNodeBackendChanged) Q_PROPERTY(QVariant modelNodeBackendProperty READ modelNodeBackend WRITE setModelNodeBackend NOTIFY modelNodeBackendChanged)
Q_PROPERTY(QVariant stateModelNodeProperty READ stateModelNode WRITE setStateModelNode NOTIFY stateModelNodeChanged)
public: public:
BindingEditor(QObject *parent = nullptr); BindingEditor(QObject *parent = nullptr);
@@ -159,6 +160,7 @@ public:
void setBackendValue(const QVariant &backendValue); void setBackendValue(const QVariant &backendValue);
void setModelNodeBackend(const QVariant &modelNodeBackend); void setModelNodeBackend(const QVariant &modelNodeBackend);
void setStateModelNode(const QVariant &stateModelNode);
Q_INVOKABLE void prepareBindings(); Q_INVOKABLE void prepareBindings();
@@ -167,15 +169,19 @@ signals:
void rejected(); void rejected();
void backendValueChanged(); void backendValueChanged();
void modelNodeBackendChanged(); void modelNodeBackendChanged();
void stateModelNodeChanged();
private: private:
QVariant backendValue() const; QVariant backendValue() const;
QVariant modelNodeBackend() const; QVariant modelNodeBackend() const;
QVariant stateModelNode() const;
private: private:
QPointer<BindingEditorDialog> m_dialog; QPointer<BindingEditorDialog> m_dialog;
QVariant m_backendValue; QVariant m_backendValue;
QVariant m_modelNodeBackend; QVariant m_modelNodeBackend;
QVariant m_stateModelNode;
QmlDesigner::ModelNode m_modelNode;
TypeName m_backendValueTypeName; TypeName m_backendValueTypeName;
}; };

View File

@@ -216,4 +216,9 @@ QStringList StatesEditorModel::autoComplete(const QString &text, int pos, bool e
return QStringList(); return QStringList();
} }
QVariant StatesEditorModel::stateModelNode()
{
return QVariant::fromValue(m_statesEditorView->currentStateNode());
}
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -61,6 +61,7 @@ public:
Q_INVOKABLE void setWhenCondition(int internalNodeId, const QString &condition); Q_INVOKABLE void setWhenCondition(int internalNodeId, const QString &condition);
Q_INVOKABLE void resetWhenCondition(int internalNodeId); Q_INVOKABLE void resetWhenCondition(int internalNodeId);
Q_INVOKABLE QStringList autoComplete(const QString &text, int pos, bool explicitComplete); Q_INVOKABLE QStringList autoComplete(const QString &text, int pos, bool explicitComplete);
Q_INVOKABLE QVariant stateModelNode();
void reset(); void reset();