From 1e92dd4fe4d89558e00947045dae4a2e6f72d939 Mon Sep 17 00:00:00 2001 From: Ali Kianian Date: Mon, 11 Mar 2024 15:11:18 +0200 Subject: [PATCH] QmlDesigner: Add tooltips as data type descriptors to Model Editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QDS-11676 Change-Id: I14132ca8f2285de85532b26d3374b5e442f8c746 Reviewed-by: Qt CI Patch Build Bot Reviewed-by: Mahmoud Badri Reviewed-by: Miikka Heikkinen Reviewed-by: Henning Gründl --- .../CollectionDetailsToolbar.qml | 5 +- .../CollectionListView.qml | 2 +- .../EditPropertyDialog.qml | 5 +- .../imports/StudioControls/ComboBox.qml | 13 +++ src/plugins/qmldesigner/CMakeLists.txt | 1 + .../collectiondatatypemodel.cpp | 87 +++++++++++++++++++ .../collectiondatatypemodel.h | 34 ++++++++ .../collectioneditor/collectiondetails.cpp | 5 +- .../collectiondetailsmodel.cpp | 14 ++- .../collectioneditor/collectiondetailsmodel.h | 1 - .../collectioneditorutils.cpp | 76 ---------------- .../collectioneditor/collectioneditorutils.h | 6 -- .../collectioneditor/collectionview.cpp | 2 + 13 files changed, 154 insertions(+), 97 deletions(-) create mode 100644 src/plugins/qmldesigner/components/collectioneditor/collectiondatatypemodel.cpp create mode 100644 src/plugins/qmldesigner/components/collectioneditor/collectiondatatypemodel.h diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionDetailsToolbar.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionDetailsToolbar.qml index 0c8fcd5b989..7a5e77f42fb 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionDetailsToolbar.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionDetailsToolbar.qml @@ -8,6 +8,7 @@ import Qt.labs.platform as PlatformWidgets import HelperWidgets 2.0 as HelperWidgets import StudioControls 1.0 as StudioControls import StudioTheme 1.0 as StudioTheme +import CollectionDetails import CollectionEditorBackend Rectangle { @@ -231,7 +232,9 @@ Rectangle { Layout.fillWidth: true - model: root.model.typesList() + model: CollectionDataTypeModel{} + textRole: "display" + tooltipRole: "toolTip" actionIndicatorVisible: false } diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionListView.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionListView.qml index 1cde74fe375..ef06a2e7a04 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionListView.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionListView.qml @@ -11,7 +11,7 @@ ListView { clip: true delegate: CollectionItem { - implicitWidth: parent.width + implicitWidth: root.width onDeleteItem: root.model.removeRow(index) } } diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/EditPropertyDialog.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/EditPropertyDialog.qml index 814778f2b77..546dc5d770c 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/EditPropertyDialog.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/EditPropertyDialog.qml @@ -6,6 +6,7 @@ import QtQuick.Layouts import StudioTheme 1.0 as StudioTheme import StudioControls 1.0 as StudioControls import HelperWidgets 2.0 as HelperWidgets +import CollectionDetails StudioControls.Dialog { id: root @@ -91,7 +92,9 @@ StudioControls.Dialog { property string initialType - model: root.model.typesList() + model: CollectionDataTypeModel{} + textRole: "display" + tooltipRole: "toolTip" actionIndicatorVisible: false } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml index 0c68d5195bd..006bb9037ca 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml @@ -36,6 +36,8 @@ T.ComboBox { property string preFocusText: "" + property string tooltipRole: "" + signal compressedActivated(int index, int reason) enum ActivatedReason { EditingFinished, Other } @@ -153,6 +155,17 @@ T.ComboBox { font: control.font elide: Text.ElideRight verticalAlignment: Text.AlignVCenter + + ToolTipArea { + anchors.fill: parent + text: control.tooltipRole ? (Array.isArray(control.model) + ? modelData[control.tooltipRole] + : model[control.tooltipRole]) + : "" + enabled: text + onClicked: itemDelegate.clicked() + onDoubleClicked: itemDelegate.doubleClicked() + } } highlighted: control.highlightedIndex === index diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 8412970d3b6..be7d5fa042e 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -836,6 +836,7 @@ extend_qtc_plugin(QmlDesigner extend_qtc_plugin(QmlDesigner SOURCES_PREFIX components/collectioneditor SOURCES + collectiondatatypemodel.cpp collectiondatatypemodel.h collectiondetails.cpp collectiondetails.h collectiondetailsmodel.cpp collectiondetailsmodel.h collectiondetailssortfiltermodel.cpp collectiondetailssortfiltermodel.h diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondatatypemodel.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondatatypemodel.cpp new file mode 100644 index 00000000000..b588f3be566 --- /dev/null +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondatatypemodel.cpp @@ -0,0 +1,87 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "collectiondatatypemodel.h" + +#include +#include + +namespace QmlDesigner { + +struct CollectionDataTypeModel::Details +{ + CollectionDetails::DataType type; + QString name; + QString description; +}; + +const QList CollectionDataTypeModel::m_orderedDetails{ + {DataType::String, "String", "Text"}, + {DataType::Integer, "Integer", "Whole number"}, + {DataType::Real, "Real", "Number with a decimal"}, + {DataType::Image, "Image", "Image resource"}, + {DataType::Color, "Color", "HEX value"}, + {DataType::Url, "Url", "Resource locator"}, + {DataType::Boolean, "Boolean", "True/False"}, + {DataType::Unknown, "Unknown", "Unknown Data Type"}, +}; + +CollectionDataTypeModel::CollectionDataTypeModel(QObject *parent) + : QAbstractListModel(parent) +{ +} + +int CollectionDataTypeModel::rowCount([[maybe_unused]] const QModelIndex &parent) const +{ + return m_orderedDetails.size(); +} + +QVariant CollectionDataTypeModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return {}; + + if (role == Qt::DisplayRole) + return m_orderedDetails.at(index.row()).name; + if (role == Qt::ToolTipRole) + return m_orderedDetails.at(index.row()).description; + + return {}; +} + +QString CollectionDataTypeModel::dataTypeToString(DataType dataType) +{ + static const QHash dataTypeHash = []() -> QHash { + QHash result; + for (const Details &details : m_orderedDetails) + result.insert(details.type, details.name); + return result; + }(); + + if (dataTypeHash.contains(dataType)) + return dataTypeHash.value(dataType); + + return "Unknown"; +} + +CollectionDetails::DataType CollectionDataTypeModel::dataTypeFromString(const QString &dataType) +{ + static const QHash stringTypeHash = []() -> QHash { + QHash result; + for (const Details &details : m_orderedDetails) + result.insert(details.name, details.type); + return result; + }(); + + if (stringTypeHash.contains(dataType)) + return stringTypeHash.value(dataType); + + return DataType::Unknown; +} + +void CollectionDataTypeModel::registerDeclarativeType() +{ + qmlRegisterType("CollectionDetails", 1, 0, "CollectionDataTypeModel"); +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondatatypemodel.h b/src/plugins/qmldesigner/components/collectioneditor/collectiondatatypemodel.h new file mode 100644 index 00000000000..1f91aecbff7 --- /dev/null +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondatatypemodel.h @@ -0,0 +1,34 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "collectiondetails.h" + +#include +#include + +namespace QmlDesigner { + +class CollectionDataTypeModel : public QAbstractListModel +{ + Q_OBJECT + +public: + using DataType = CollectionDetails::DataType; + CollectionDataTypeModel(QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + static Q_INVOKABLE QString dataTypeToString(DataType dataType); + static Q_INVOKABLE DataType dataTypeFromString(const QString &dataType); + + static void registerDeclarativeType(); + +private: + struct Details; + static const QList
m_orderedDetails; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp index 8706a5dab0b..810923863bb 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp @@ -3,6 +3,7 @@ #include "collectiondetails.h" +#include "collectiondatatypemodel.h" #include "collectioneditorutils.h" #include @@ -706,7 +707,7 @@ QJsonObject CollectionDetails::toLocalJson() const for (const CollectionProperty &property : std::as_const(d->properties)) { QJsonObject columnObject; columnObject.insert("name", property.name); - columnObject.insert("type", CollectionEditorUtils::dataTypeToString(property.type)); + columnObject.insert("type", CollectionDataTypeModel::dataTypeToString(property.type)); columnsArray.append(columnObject); } @@ -941,7 +942,7 @@ CollectionDetails CollectionDetails::fromLocalCollection(const QJsonObject &loca result.insertColumn(columnName, -1, {}, - CollectionEditorUtils::dataTypeFromString( + CollectionDataTypeModel::dataTypeFromString( column.value("type").toString())); } } diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp index e7a246b68e7..326afb203ae 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp @@ -3,6 +3,7 @@ #include "collectiondetailsmodel.h" +#include "collectiondatatypemodel.h" #include "collectioneditorutils.h" #include "modelnode.h" @@ -188,7 +189,7 @@ QVariant CollectionDetailsModel::headerData(int section, Qt::Orientation orienta { if (orientation == Qt::Horizontal) { if (role == DataTypeRole) - return CollectionEditorUtils::dataTypeToString(m_currentCollection.typeAt(section)); + return CollectionDataTypeModel::dataTypeToString(m_currentCollection.typeAt(section)); else return m_currentCollection.propertyAt(section); } @@ -227,7 +228,7 @@ QString CollectionDetailsModel::propertyType(int column) const { QTC_ASSERT(m_currentCollection.hasValidReference(), return {}); - return CollectionEditorUtils::dataTypeToString(m_currentCollection.typeAt(column)); + return CollectionDataTypeModel::dataTypeToString(m_currentCollection.typeAt(column)); } bool CollectionDetailsModel::isPropertyAvailable(const QString &name) @@ -251,7 +252,7 @@ bool CollectionDetailsModel::addColumn(int column, const QString &name, const QS m_currentCollection.insertColumn(name, column, {}, - CollectionEditorUtils::dataTypeFromString(propertyType)); + CollectionDataTypeModel::dataTypeFromString(propertyType)); endInsertColumns(); return m_currentCollection.containsPropertyName(name); } @@ -298,7 +299,7 @@ bool CollectionDetailsModel::setPropertyType(int column, const QString &newValue QTC_ASSERT(m_currentCollection.hasValidReference(), return false); bool changed = m_currentCollection.setPropertyType(column, - CollectionEditorUtils::dataTypeFromString( + CollectionDataTypeModel::dataTypeFromString( newValue)); if (changed) { emit headerDataChanged(Qt::Horizontal, column, column); @@ -346,11 +347,6 @@ void CollectionDetailsModel::deselectAll() selectRow(-1); } -QStringList CollectionDetailsModel::typesList() -{ - return CollectionEditorUtils::dataTypesStringList(); -} - void CollectionDetailsModel::loadCollection(const ModelNode &sourceNode, const QString &collection) { QString fileName = CollectionEditorUtils::getSourceCollectionPath(sourceNode); diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h index 1fe152eaa24..0ad6e86f10c 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h @@ -58,7 +58,6 @@ public: Q_INVOKABLE bool selectRow(int row); Q_INVOKABLE void deselectAll(); Q_INVOKABLE QString warningToString(DataTypeWarning::Warning warning) const; - static Q_INVOKABLE QStringList typesList(); void loadCollection(const ModelNode &sourceNode, const QString &collection); void removeCollection(const ModelNode &sourceNode, const QString &collection); diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp index e1a17c51a15..4725987f12e 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.cpp @@ -31,64 +31,6 @@ namespace { using CollectionDataVariant = std::variant; -class CollectionDataTypeHelper -{ -private: - using DataType = QmlDesigner::CollectionDetails::DataType; - friend QString QmlDesigner::CollectionEditorUtils::dataTypeToString(DataType); - friend DataType QmlDesigner::CollectionEditorUtils::dataTypeFromString(const QString &); - friend QStringList QmlDesigner::CollectionEditorUtils::dataTypesStringList(); - - CollectionDataTypeHelper() = delete; - - static QHash typeToStringHash() - { - return { - {DataType::Unknown, "Unknown"}, - {DataType::String, "String"}, - {DataType::Url, "Url"}, - {DataType::Real, "Real"}, - {DataType::Integer, "Integer"}, - {DataType::Boolean, "Boolean"}, - {DataType::Image, "Image"}, - {DataType::Color, "Color"}, - }; - } - - static QHash stringToTypeHash() - { - QHash stringTypeHash; - const QHash typeStringHash = typeToStringHash(); - for (const auto &transferItem : typeStringHash.asKeyValueRange()) - stringTypeHash.insert(transferItem.second, transferItem.first); - - return stringTypeHash; - } - - static QStringList orderedTypeNames() - { - const QList orderedtypes{ - DataType::String, - DataType::Integer, - DataType::Real, - DataType::Image, - DataType::Color, - DataType::Url, - DataType::Boolean, - DataType::Unknown, - }; - - QStringList orderedNames; - QHash typeStringHash = typeToStringHash(); - - for (const DataType &type : orderedtypes) - orderedNames.append(typeStringHash.take(type)); - - Q_ASSERT(typeStringHash.isEmpty()); - return orderedNames; - } -}; - inline bool operator<(const QColor &a, const QColor &b) { return a.name(QColor::HexArgb) < b.name(QColor::HexArgb); @@ -383,24 +325,6 @@ QJsonObject defaultColorCollection() return collection.toLocalJson(); } -QString dataTypeToString(CollectionDetails::DataType dataType) -{ - static const QHash typeStringHash = CollectionDataTypeHelper::typeToStringHash(); - return typeStringHash.value(dataType); -} - -CollectionDetails::DataType dataTypeFromString(const QString &dataType) -{ - static const QHash stringTypeHash = CollectionDataTypeHelper::stringToTypeHash(); - return stringTypeHash.value(dataType, DataType::Unknown); -} - -QStringList dataTypesStringList() -{ - static const QStringList typesList = CollectionDataTypeHelper::orderedTypeNames(); - return typesList; -} - bool writeToJsonDocument(const Utils::FilePath &path, const QJsonDocument &document, QString *errorString) { Core::FileChangeBlocker fileBlocker(path); diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h index 5be1c51f001..355addf59be 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectioneditorutils.h @@ -43,10 +43,4 @@ QJsonObject defaultCollection(); QJsonObject defaultColorCollection(); -QString dataTypeToString(CollectionDetails::DataType dataType); - -CollectionDetails::DataType dataTypeFromString(const QString &dataType); - -QStringList dataTypesStringList(); - } // namespace QmlDesigner::CollectionEditorUtils diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp index 93efc36a4fc..f6ec821fded 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectionview.cpp @@ -3,6 +3,7 @@ #include "collectionview.h" +#include "collectiondatatypemodel.h" #include "collectiondetailsmodel.h" #include "collectioneditorconstants.h" #include "collectioneditorutils.h" @@ -290,6 +291,7 @@ void CollectionView::openCollection(const QString &collectionName) void CollectionView::registerDeclarativeType() { CollectionDetails::registerDeclarativeType(); + CollectionDataTypeModel::registerDeclarativeType(); } void CollectionView::resetDataStoreNode()