From 6b6f74ccadac8da397bffee2719129fee2370621 Mon Sep 17 00:00:00 2001 From: Shrief Gabr Date: Thu, 14 Dec 2023 13:52:48 +0200 Subject: [PATCH] QmlDesigner: Create data type warnings for CollectionDetailsModel Task-number: QDS-11079 Change-Id: I8cb5167d71ff96d01313bc559401e16f0925afbb Reviewed-by: Miikka Heikkinen Reviewed-by: Ali Kianian Reviewed-by: Mahmoud Badri --- .../CollectionDetailsView.qml | 16 +++++++++--- .../collectioneditor/collectiondetails.cpp | 14 +++++++++++ .../collectioneditor/collectiondetails.h | 21 ++++++++++++++++ .../collectiondetailsmodel.cpp | 25 ++++++++++++++++--- .../collectioneditor/collectiondetailsmodel.h | 5 ++-- 5 files changed, 72 insertions(+), 9 deletions(-) diff --git a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionDetailsView.qml b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionDetailsView.qml index d2c7f17ca33..e208553a4c5 100644 --- a/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionDetailsView.qml +++ b/share/qtcreator/qmldesigner/collectionEditorQmlSource/CollectionDetailsView.qml @@ -4,6 +4,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts +import CollectionDetails 1.0 as CollectionDetails import HelperWidgets 2.0 as HelperWidgets import StudioTheme 1.0 as StudioTheme import StudioControls 1.0 as StudioControls @@ -207,13 +208,23 @@ Rectangle { id: itemCell implicitWidth: 100 implicitHeight: itemText.height + border.color: dataTypeWarning !== CollectionDetails.Warning.None ? + StudioTheme.Values.themeWarning : StudioTheme.Values.themeControlBackgroundInteraction border.width: 1 + HelperWidgets.ToolTipArea { + anchors.fill: parent + text: root.model.warningToString(dataTypeWarning) + enabled: dataTypeWarning !== CollectionDetails.Warning.None && text !== "" + hoverEnabled: true + acceptedButtons: Qt.NoButton + } + Text { id: itemText - text: display ? display : "" - + text: display + color: StudioTheme.Values.themePlaceholderTextColorInteraction width: parent.width leftPadding: 5 topPadding: 3 @@ -239,7 +250,6 @@ Rectangle { PropertyChanges { target: itemCell color: StudioTheme.Values.themeControlBackground - border.color: StudioTheme.Values.themeControlBackgroundInteraction } PropertyChanges { diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp index e0bc86f99f6..98eef0daea2 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.cpp @@ -22,6 +22,10 @@ struct CollectionProperty DataType type; }; +const QMap DataTypeWarning::dataTypeWarnings = { + {DataTypeWarning::CellDataTypeMismatch, "Cell and column data types do not match."} +}; + class CollectionDetails::Private { using SourceFormat = CollectionEditor::SourceFormat; @@ -345,6 +349,13 @@ CollectionDetails::DataType CollectionDetails::typeAt(int row, int column) const return {}; } +DataTypeWarning::Warning CollectionDetails::cellWarningCheck(int row, int column) const +{ + if (typeAt(column) != typeAt(row, column) && !d->elements.at(row).isEmpty()) + return DataTypeWarning::Warning::CellDataTypeMismatch; + return DataTypeWarning::Warning::None; +} + bool CollectionDetails::containsPropertyName(const QString &propertyName) { if (!isValid()) @@ -394,6 +405,9 @@ void CollectionDetails::registerDeclarativeType() typedef CollectionDetails::DataType DataType; qRegisterMetaType("DataType"); qmlRegisterUncreatableType("CollectionDetails", 1, 0, "DataType", "Enum type"); + + qRegisterMetaType("Warning"); + qmlRegisterUncreatableType("CollectionDetails", 1, 0, "Warning", "Enum type"); } CollectionDetails &CollectionDetails::operator=(const CollectionDetails &other) diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.h b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.h index 694947b126a..c35068ce6f0 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetails.h @@ -35,6 +35,26 @@ struct CollectionReference struct CollectionProperty; +struct DataTypeWarning { + Q_GADGET + +public: + enum Warning { None, CellDataTypeMismatch }; + Q_ENUM(Warning) + + Warning warning = None; + DataTypeWarning(Warning warning) + : warning(warning) + {} + + static QString getDataTypeWarningString(Warning warning) { + return dataTypeWarnings.value(warning); + } + +private: + static const QMap dataTypeWarnings; +}; + class CollectionDetails { Q_GADGET @@ -71,6 +91,7 @@ public: QString propertyAt(int column) const; DataType typeAt(int column) const; DataType typeAt(int row, int column) const; + DataTypeWarning::Warning cellWarningCheck(int row, int column) const; bool containsPropertyName(const QString &propertyName); bool isValid() const; diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp index 49398b2aea2..533c2d72b6c 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.cpp @@ -102,6 +102,7 @@ QHash CollectionDetailsModel::roleNames() const roles.insert(SelectedRole, "itemSelected"); roles.insert(DataTypeRole, "dataType"); roles.insert(ColumnDataTypeRole, "columnType"); + roles.insert(DataTypeWarningRole, "dataTypeWarning"); } return roles; } @@ -133,6 +134,9 @@ QVariant CollectionDetailsModel::data(const QModelIndex &index, int role) const if (role == Qt::EditRole) return m_currentCollection.data(index.row(), index.column()); + if (role == DataTypeWarningRole ) + return QVariant::fromValue(m_currentCollection.cellWarningCheck(index.row(), index.column())); + return m_currentCollection.data(index.row(), index.column()).toString(); } @@ -142,11 +146,19 @@ bool CollectionDetailsModel::setData(const QModelIndex &index, const QVariant &v return {}; if (role == Qt::EditRole) { + DataTypeWarning::Warning prevWarning = m_currentCollection.cellWarningCheck(index.row(), index.column()); bool changed = m_currentCollection.setPropertyValue(index.row(), index.column(), value); + if (changed) { - emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole}); - return true; + QList roles = {Qt::DisplayRole, Qt::EditRole}; + + if (prevWarning != m_currentCollection.cellWarningCheck(index.row(), index.column())) + roles << DataTypeWarningRole; + + emit dataChanged(index, index, roles); } + + return true; } return false; @@ -326,7 +338,8 @@ bool CollectionDetailsModel::setPropertyType(int column, const QString &newValue newValue)); if (changed) { emit headerDataChanged(Qt::Horizontal, column, column); - emit dataChanged(index(0, column), index(rowCount() - 1, column), {Qt::DisplayRole, DataTypeRole}); + emit dataChanged(index(0, column), index(rowCount() - 1, column), + {Qt::DisplayRole, DataTypeRole, DataTypeWarningRole}); } return changed; @@ -623,4 +636,10 @@ bool CollectionDetailsModel::saveCollectionFromString(const QString &path, const return false; } +QString CollectionDetailsModel::warningToString(DataTypeWarning::Warning warning) const +{ + return DataTypeWarning::getDataTypeWarningString(warning); +} + + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h index 78fab1685f9..bf87d3838f1 100644 --- a/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h +++ b/src/plugins/qmldesigner/components/collectioneditor/collectiondetailsmodel.h @@ -22,8 +22,7 @@ class CollectionDetailsModel : public QAbstractTableModel Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged) public: - enum DataRoles { SelectedRole = Qt::UserRole + 1, DataTypeRole, ColumnDataTypeRole }; - + enum DataRoles { SelectedRole = Qt::UserRole + 1, DataTypeRole, ColumnDataTypeRole, DataTypeWarningRole }; explicit CollectionDetailsModel(QObject *parent = nullptr); QHash roleNames() const override; @@ -58,7 +57,7 @@ public: Q_INVOKABLE bool setPropertyType(int column, const QString &newValue); 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);