From 9891f3b26806e0996ae2b6d966b2f154f9c2dcd5 Mon Sep 17 00:00:00 2001 From: Tony Leinonen Date: Tue, 31 Aug 2021 08:54:21 +0300 Subject: [PATCH] QmlDesigner: Edit ChooseTexturePropertyDialog to accept any type When creating a new component by dropping it to a component in the navigator, check the parent if it contains properties that are the same or sub type as the new created component. Those properties are shown in a list that the created component can be binded to. This edits the dialog that was for textures only and uses it for any component on creation. Task-number: QDS-4969 Change-Id: I3f1ecc6a82254f77a9bb170406ef79740359a889 Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/CMakeLists.txt | 4 +-- ...g.cpp => choosefrompropertylistdialog.cpp} | 28 ++++++++++--------- ...ialog.h => choosefrompropertylistdialog.h} | 11 ++++---- ...log.ui => choosefrompropertylistdialog.ui} | 8 +++--- .../components/navigator/navigator.pri | 6 ++-- .../navigator/navigatortreemodel.cpp | 27 +++++++++++++++--- src/plugins/qmldesigner/qmldesignerplugin.qbs | 6 ++-- 7 files changed, 56 insertions(+), 34 deletions(-) rename src/plugins/qmldesigner/components/navigator/{choosetexturepropertydialog.cpp => choosefrompropertylistdialog.cpp} (72%) rename src/plugins/qmldesigner/components/navigator/{choosetexturepropertydialog.h => choosefrompropertylistdialog.h} (83%) rename src/plugins/qmldesigner/components/navigator/{choosetexturepropertydialog.ui => choosefrompropertylistdialog.ui} (89%) diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 182c1c1a7f5..1c29b9c58df 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -344,8 +344,8 @@ extend_qtc_plugin(QmlDesigner navigatortreeview.cpp navigatortreeview.h navigatorview.cpp navigatorview.h navigatorwidget.cpp navigatorwidget.h - choosetexturepropertydialog.cpp choosetexturepropertydialog.h - choosetexturepropertydialog.ui + choosefrompropertylistdialog.cpp choosefrompropertylistdialog.h + choosefrompropertylistdialog.ui previewtooltip.cpp previewtooltip.h previewtooltip.ui ) diff --git a/src/plugins/qmldesigner/components/navigator/choosetexturepropertydialog.cpp b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp similarity index 72% rename from src/plugins/qmldesigner/components/navigator/choosetexturepropertydialog.cpp rename to src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp index 826ed580cae..598f2ade758 100644 --- a/src/plugins/qmldesigner/components/navigator/choosetexturepropertydialog.cpp +++ b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.cpp @@ -23,20 +23,22 @@ ** ****************************************************************************/ -#include "choosetexturepropertydialog.h" +#include "choosefrompropertylistdialog.h" #include "nodemetainfo.h" -#include "ui_choosetexturepropertydialog.h" +#include "ui_choosefrompropertylistdialog.h" namespace QmlDesigner { -// This dialog displays all texture properties of an object and allows the user to choose one -ChooseTexturePropertyDialog::ChooseTexturePropertyDialog(const ModelNode &node, QWidget *parent) +// This dialog displays all given type properties of an object and allows the user to choose one +ChooseFromPropertyListDialog::ChooseFromPropertyListDialog(const ModelNode &node, TypeName type, QWidget *parent) : QDialog(parent) - , m_ui(new Ui::ChooseTexturePropertyDialog) + , m_ui(new Ui::ChooseFromPropertyListDialog) { + m_propertyTypeName = type; m_ui->setupUi(this); - setWindowTitle(tr("Select Texture Property")); - m_ui->label->setText(tr("Set texture to property:")); + setWindowTitle(tr("Select property")); + m_ui->label->setText(tr("Bind to property:")); + m_ui->label->setToolTip(tr("Binds this component to the parent's selected property.")); setFixedSize(size()); connect(m_ui->listProps, &QListWidget::itemClicked, this, [this](QListWidgetItem *item) { @@ -51,25 +53,25 @@ ChooseTexturePropertyDialog::ChooseTexturePropertyDialog(const ModelNode &node, fillList(node); } -ChooseTexturePropertyDialog::~ChooseTexturePropertyDialog() +ChooseFromPropertyListDialog::~ChooseFromPropertyListDialog() { delete m_ui; } -TypeName ChooseTexturePropertyDialog::selectedProperty() const +TypeName ChooseFromPropertyListDialog::selectedProperty() const { return m_selectedProperty; } -void ChooseTexturePropertyDialog::fillList(const ModelNode &node) +void ChooseFromPropertyListDialog::fillList(const ModelNode &node) { - // Fill the list with all properties of type Texture + // Fill the list with all properties of given type const auto metaInfo = node.metaInfo(); const auto propNames = metaInfo.propertyNames(); - const TypeName textureProp("QtQuick3D.Texture"); + const TypeName property(m_propertyTypeName); QStringList nameList; for (const auto &propName : propNames) { - if (metaInfo.propertyTypeName(propName) == textureProp) + if (metaInfo.propertyTypeName(propName) == property) nameList.append(QString::fromLatin1(propName)); } diff --git a/src/plugins/qmldesigner/components/navigator/choosetexturepropertydialog.h b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.h similarity index 83% rename from src/plugins/qmldesigner/components/navigator/choosetexturepropertydialog.h rename to src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.h index 7604e6f9427..2d2612e0a8a 100644 --- a/src/plugins/qmldesigner/components/navigator/choosetexturepropertydialog.h +++ b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.h @@ -32,23 +32,24 @@ namespace QmlDesigner { namespace Ui { -class ChooseTexturePropertyDialog; +class ChooseFromPropertyListDialog; } -class ChooseTexturePropertyDialog : public QDialog +class ChooseFromPropertyListDialog : public QDialog { Q_OBJECT public: - explicit ChooseTexturePropertyDialog(const ModelNode &node, QWidget *parent = 0); - ~ChooseTexturePropertyDialog(); + explicit ChooseFromPropertyListDialog(const ModelNode &node, TypeName type, QWidget *parent = 0); + ~ChooseFromPropertyListDialog(); TypeName selectedProperty() const; private: void fillList(const ModelNode &node); - Ui::ChooseTexturePropertyDialog *m_ui; + Ui::ChooseFromPropertyListDialog *m_ui; TypeName m_selectedProperty; + TypeName m_propertyTypeName; }; } diff --git a/src/plugins/qmldesigner/components/navigator/choosetexturepropertydialog.ui b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.ui similarity index 89% rename from src/plugins/qmldesigner/components/navigator/choosetexturepropertydialog.ui rename to src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.ui index 8643e866d5c..259adf8aa13 100644 --- a/src/plugins/qmldesigner/components/navigator/choosetexturepropertydialog.ui +++ b/src/plugins/qmldesigner/components/navigator/choosefrompropertylistdialog.ui @@ -1,7 +1,7 @@ - QmlDesigner::ChooseTexturePropertyDialog - + QmlDesigner::ChooseFromPropertyListDialog + 0 @@ -77,7 +77,7 @@ buttonBox accepted() - QmlDesigner::ChooseTexturePropertyDialog + QmlDesigner::ChooseFromPropertyListDialog accept() @@ -93,7 +93,7 @@ buttonBox rejected() - QmlDesigner::ChooseTexturePropertyDialog + QmlDesigner::ChooseFromPropertyListDialog reject() diff --git a/src/plugins/qmldesigner/components/navigator/navigator.pri b/src/plugins/qmldesigner/components/navigator/navigator.pri index 2453463fe28..315e9ae0f6b 100644 --- a/src/plugins/qmldesigner/components/navigator/navigator.pri +++ b/src/plugins/qmldesigner/components/navigator/navigator.pri @@ -6,7 +6,7 @@ SOURCES += navigatorview.cpp \ nameitemdelegate.cpp \ iconcheckboxitemdelegate.cpp \ navigatortreeview.cpp \ - choosetexturepropertydialog.cpp \ + choosefrompropertylistdialog.cpp \ previewtooltip.cpp HEADERS += navigatorview.h \ @@ -16,10 +16,10 @@ HEADERS += navigatorview.h \ iconcheckboxitemdelegate.h \ navigatortreeview.h \ navigatormodelinterface.h \ - choosetexturepropertydialog.h \ + choosefrompropertylistdialog.h \ previewtooltip.h RESOURCES += navigator.qrc -FORMS += choosetexturepropertydialog.ui \ +FORMS += choosefrompropertylistdialog.ui \ previewtooltip.ui diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index e07f300bffc..cbf7f375996 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -25,7 +25,7 @@ #include "navigatortreemodel.h" #include "navigatorview.h" -#include "choosetexturepropertydialog.h" +#include "choosefrompropertylistdialog.h" #include "qmldesignerplugin.h" #include "itemlibrarywidget.h" @@ -700,7 +700,8 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in // notify user with a helpful messagebox that suggests the correct action. showMatToCompInfo = true; } - } else { + } else if (newModelNode.isSubclassOf("QtQuick3D.Shader") + || newModelNode.isSubclassOf("QtQuick3D.Command")) { const bool isShader = newModelNode.isSubclassOf("QtQuick3D.Shader"); if (isShader || newModelNode.isSubclassOf("QtQuick3D.Command")) { if (targetProperty.parentModelNode().isSubclassOf("QtQuick3D.Pass")) { @@ -727,7 +728,25 @@ void NavigatorTreeModel::handleItemLibraryItemDrop(const QMimeData *mimeData, in } } } + } else { + ModelNode targetNode = targetProperty.parentModelNode(); + NodeMetaInfo metaInfo = targetNode.metaInfo(); + TypeName typeName = newModelNode.type(); + const PropertyNameList nameList = targetNode.metaInfo().directPropertyNames(); + for (const auto &propertyName : nameList) { + auto testType = metaInfo.propertyTypeName(propertyName); + if (testType == typeName || newModelNode.isSubclassOf(testType)) { + ChooseFromPropertyListDialog *dialog = nullptr; + dialog = new ChooseFromPropertyListDialog(targetNode, testType, Core::ICore::dialogParent()); + dialog->exec(); + if (!dialog || dialog->result() == QDialog::Accepted) + targetNode.bindingProperty(dialog->selectedProperty()).setExpression(newModelNode.validId()); + delete dialog; + break; + } + } } + if (!validContainer) { if (!showMatToCompInfo) validContainer = NodeHints::fromModelNode(targetProperty.parentModelNode()).canBeContainerFor(newModelNode); @@ -982,10 +1001,10 @@ bool NavigatorTreeModel::dropAsImage3dTexture(const ModelNode &targetNode, { if (targetNode.isSubclassOf("QtQuick3D.Material")) { // if dropping an image on a default material, create a texture instead of image - ChooseTexturePropertyDialog *dialog = nullptr; + ChooseFromPropertyListDialog *dialog = nullptr; if (targetNode.isSubclassOf("QtQuick3D.DefaultMaterial") || targetNode.isSubclassOf("QtQuick3D.PrincipledMaterial")) { // Show texture property selection dialog - dialog = new ChooseTexturePropertyDialog(targetNode, Core::ICore::dialogParent()); + dialog = new ChooseFromPropertyListDialog(targetNode, "QtQuick3D.Texture", Core::ICore::dialogParent()); dialog->exec(); } if (!dialog || dialog->result() == QDialog::Accepted) { diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 8b95987a7b9..9d5c3cfc530 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -669,9 +669,9 @@ Project { "navigator/navigatorview.h", "navigator/navigatorwidget.cpp", "navigator/navigatorwidget.h", - "navigator/choosetexturepropertydialog.cpp", - "navigator/choosetexturepropertydialog.h", - "navigator/choosetexturepropertydialog.ui", + "navigator/choosefrompropertylistdialog.cpp", + "navigator/choosefrompropertylistdialog.h", + "navigator/choosefrompropertylistdialog.ui", "navigator/previewtooltip.cpp", "navigator/previewtooltip.h", "navigator/previewtooltip.ui",