From 3f09b4bd3fe4ee1d7314d5a38714685498e9c2df Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Fri, 3 Mar 2023 20:32:13 +0100 Subject: [PATCH] Fix icons missing in device settings page --- DevicesSettingsPage.qml | 4 ++++ IconComboBox.qml | 49 +++++++++-------------------------------- devicetypesmodel.cpp | 6 ----- devicetypesmodel.h | 7 ++++++ 4 files changed, 21 insertions(+), 45 deletions(-) diff --git a/DevicesSettingsPage.qml b/DevicesSettingsPage.qml index 810929f..a1c3484 100644 --- a/DevicesSettingsPage.qml +++ b/DevicesSettingsPage.qml @@ -93,13 +93,17 @@ ColumnLayout { Label { text: qsTr("DeviceType:") } IconComboBox { id: deviceTypeCombobox + Layout.fillWidth: true + Layout.preferredHeight: 64 + model: DeviceTypesModel { controller: __controller } textRole: "name" valueRole: "id" iconSourceRole: "iconUrl" + iconSourceRoleInt: DeviceTypesModel.IconUrlRole currentIndex: listView.currentData ? deviceTypeCombobox.indexOfValue(listView.currentData.deviceTypeId) : -1 onActivated: if (listView.currentData) listView.currentData.deviceTypeId = currentValue; else console.warn('discarded'); } diff --git a/IconComboBox.qml b/IconComboBox.qml index 4e8d5bb..ea31893 100644 --- a/IconComboBox.qml +++ b/IconComboBox.qml @@ -9,6 +9,15 @@ ComboBox { id: comboBox property string iconSourceRole + property int iconSourceRoleInt + + property string iconSource: comboBox.currentIndex === -1 + ? "" + : Array.isArray(comboBox.model) + ? comboBox.model[comboBox.currentIndex][comboBox.iconSourceRole] + : (comboBox.model as ListModel)?.get(comboBox.currentIndex)[comboBox.iconSourceRole] + ?? (comboBox.model as FolderListModel)?.get(comboBox.currentIndex, comboBox.iconSourceRole) + ?? comboBox.model.data(comboBox.model.index(comboBox.currentIndex, 0), comboBox.iconSourceRoleInt) delegate: ItemDelegate { height: 64 @@ -23,45 +32,7 @@ ComboBox { } contentItem: IconChooserDelegateLayout { text: comboBox.displayText - iconSource: { -// console.log("QAbstractListModel", model instanceof QAbstractListModel); -// console.log("QAbstractItemModel", model instanceof QAbstractItemModel); -// console.log("FolderListModel", model instanceof FolderListModel); -// console.log("DeviceTypesModel", model instanceof DeviceTypesModel); -// console.log("QtObject", model instanceof QtObject); - - if (comboBox.currentIndex < 0) - return ''; - if (!comboBox.model) - return ''; - if (!comboBox.iconSourceRole) - return ''; - - if (model instanceof FolderListModel) - return model.get(comboBox.currentIndex, iconSourceRole); - else if ('get' in model) - { - const data = model.get(comboBox.currentIndex); - console.log(data); - return data[iconSourceRole]; - } - else if ('roleNames' in model || 'itemData' in model) - { - if (!('roleNames' in model && 'itemData' in model)) - throw 'roleNames or itemData not defined!'; - - const roleNames = model.roleNames(); - console.log('roleNames', roleNames); - - const index = model.index(comboBox.currentIndex, 0); - const itemData = model.itemData(index); - console.log('itemData', itemData); - - throw 'getting data from model using roleNames and itemData is not yet implemented.'; - } - else - throw 'unknown model type' + typeof model; - } + iconSource: comboBox.iconSource isInsideMaterialComboBox: true } } diff --git a/devicetypesmodel.cpp b/devicetypesmodel.cpp index 745b4f7..21dc0c1 100644 --- a/devicetypesmodel.cpp +++ b/devicetypesmodel.cpp @@ -9,12 +9,6 @@ #include "iconutils.h" -enum { - IdRole = Qt::UserRole, - IconNameRole, - IconUrlRole -}; - void DeviceTypesModel::setController(DmxController *controller) { if (m_controller == controller) diff --git a/devicetypesmodel.h b/devicetypesmodel.h index b0fd45c..16915d9 100644 --- a/devicetypesmodel.h +++ b/devicetypesmodel.h @@ -12,6 +12,13 @@ class DeviceTypesModel : public QAbstractListModel public: using QAbstractListModel::QAbstractListModel; + enum Roles { + IdRole = Qt::UserRole, + IconNameRole, + IconUrlRole + }; + Q_ENUM(Roles) + DmxController *controller() { return m_controller; } const DmxController *controller() const { return m_controller; } void setController(DmxController *controller);