From ebc27de7ba1da0700b22e0c2123c92ebdd907b7a Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Thu, 10 Jan 2019 00:14:12 +0100 Subject: [PATCH] Fix "uncategorized" not showing in main page --- libnymea-app-core/interfacesmodel.cpp | 41 +++++++++++++++----------- libnymea-app-core/interfacesmodel.h | 4 +++ nymea-app/ui/MainPage.qml | 1 + nymea-app/ui/NewDeviceWizard.qml | 18 ++++++----- nymea-app/ui/mainviews/DevicesPage.qml | 4 --- 5 files changed, 39 insertions(+), 29 deletions(-) diff --git a/libnymea-app-core/interfacesmodel.cpp b/libnymea-app-core/interfacesmodel.cpp index 2e7f4e40..6a0d554c 100644 --- a/libnymea-app-core/interfacesmodel.cpp +++ b/libnymea-app-core/interfacesmodel.cpp @@ -106,34 +106,35 @@ void InterfacesModel::syncInterfaces() if (!m_deviceManager) { return; } - QStringList baseList; + QList deviceClasses; if (m_onlyConfiguredDevices) { for (int i = 0; i < m_deviceManager->devices()->rowCount(); i++) { - DeviceClass *dc = m_deviceManager->deviceClasses()->getDeviceClass(m_deviceManager->devices()->get(i)->deviceClassId()); - baseList << dc->interfaces(); + deviceClasses << m_deviceManager->deviceClasses()->getDeviceClass(m_deviceManager->devices()->get(i)->deviceClassId()); } } else { for (int i = 0; i < m_deviceManager->deviceClasses()->rowCount(); i++) { - DeviceClass *dc = m_deviceManager->deviceClasses()->get(i); - baseList << dc->interfaces(); + deviceClasses << m_deviceManager->deviceClasses()->get(i); } } - baseList.removeDuplicates(); QStringList interfacesInSource; - bool isInShownIfaces = false; - foreach (const QString &interface, baseList) { - if (!m_shownInterfaces.contains(interface)) { - continue; - } + foreach (DeviceClass *dc, deviceClasses) { +// qDebug() << "device" <name() << "has interfaces" << dc->interfaces(); - if (!interfacesInSource.contains(interface)) { - interfacesInSource.append(interface); + bool isInShownIfaces = false; + foreach (const QString &interface, dc->interfaces()) { + if (!m_shownInterfaces.isEmpty() && !m_shownInterfaces.contains(interface)) { + continue; + } + + if (!interfacesInSource.contains(interface)) { + interfacesInSource.append(interface); + } + isInShownIfaces = true; + } + if (m_showUncategorized && !isInShownIfaces && !interfacesInSource.contains("uncategorized")) { + interfacesInSource.append("uncategorized"); } - isInShownIfaces = true; - } - if (!isInShownIfaces && !interfacesInSource.contains("uncategorized")) { - interfacesInSource.append("uncategorized"); } QStringList interfacesToAdd = interfacesInSource; QStringList interfacesToRemove; @@ -182,6 +183,7 @@ void InterfacesSortModel::setInterfacesModel(InterfacesModel *interfacesModel) if (m_interfacesModel != interfacesModel) { m_interfacesModel = interfacesModel; setSourceModel(interfacesModel); + connect(interfacesModel, &InterfacesModel::countChanged, this, &InterfacesSortModel::countChanged); setSortRole(Devices::RoleName); sort(0); emit interfacesModelChanged(); @@ -201,3 +203,8 @@ bool InterfacesSortModel::lessThan(const QModelIndex &left, const QModelIndex &r } return m_interfacesModel->shownInterfaces().indexOf(leftName.toString()) < m_interfacesModel->shownInterfaces().indexOf(rightName.toString()); } + +QString InterfacesSortModel::get(int index) const +{ + return m_interfacesModel->get(mapToSource(this->index(index, 0)).row()); +} diff --git a/libnymea-app-core/interfacesmodel.h b/libnymea-app-core/interfacesmodel.h index 771244eb..62c3be29 100644 --- a/libnymea-app-core/interfacesmodel.h +++ b/libnymea-app-core/interfacesmodel.h @@ -67,6 +67,7 @@ private: class InterfacesSortModel: public QSortFilterProxyModel { Q_OBJECT + Q_PROPERTY(int count READ rowCount NOTIFY countChanged) Q_PROPERTY(InterfacesModel* interfacesModel READ interfacesModel WRITE setInterfacesModel NOTIFY interfacesModelChanged) public: @@ -77,7 +78,10 @@ public: bool lessThan(const QModelIndex &left, const QModelIndex &right) const Q_DECL_OVERRIDE; + Q_INVOKABLE QString get(int index) const; + signals: + void countChanged(); void interfacesModelChanged(); private: diff --git a/nymea-app/ui/MainPage.qml b/nymea-app/ui/MainPage.qml index 48e59d70..484de8ca 100644 --- a/nymea-app/ui/MainPage.qml +++ b/nymea-app/ui/MainPage.qml @@ -111,6 +111,7 @@ Page { interfacesModel: InterfacesModel { deviceManager: engine.deviceManager shownInterfaces: app.supportedInterfaces + showUncategorized: true } } diff --git a/nymea-app/ui/NewDeviceWizard.qml b/nymea-app/ui/NewDeviceWizard.qml index 5449908d..ee5e9281 100644 --- a/nymea-app/ui/NewDeviceWizard.qml +++ b/nymea-app/ui/NewDeviceWizard.qml @@ -144,20 +144,22 @@ Page { id: typeFilterComboBox Layout.fillWidth: true textRole: "displayName" - InterfacesModel { - id: interfacesModel - deviceManager: engine.deviceManager - shownInterfaces: app.supportedInterfaces - onlyConfiguredDevices: false - showUncategorized: false + InterfacesSortModel { + id: interfacesSortModel + interfacesModel: InterfacesModel { + deviceManager: engine.deviceManager + shownInterfaces: app.supportedInterfaces + onlyConfiguredDevices: false + showUncategorized: false + } } model: ListModel { id: typeFilterModel ListElement { interfaceName: ""; displayName: qsTr("All") } Component.onCompleted: { - for (var i = 0; i < interfacesModel.count; i++) { - append({interfaceName: interfacesModel.get(i), displayName: app.interfaceToString(interfacesModel.get(i))}); + for (var i = 0; i < interfacesSortModel.count; i++) { + append({interfaceName: interfacesSortModel.get(i), displayName: app.interfaceToString(interfacesSortModel.get(i))}); } } } diff --git a/nymea-app/ui/mainviews/DevicesPage.qml b/nymea-app/ui/mainviews/DevicesPage.qml index 68d813b2..c2700ec8 100644 --- a/nymea-app/ui/mainviews/DevicesPage.qml +++ b/nymea-app/ui/mainviews/DevicesPage.qml @@ -19,10 +19,6 @@ Item { readonly property int minTileHeight: 240 readonly property int tilesPerRow: root.width / minTileWidth - model: InterfacesModel { - id: interfacesModel - deviceManager: engine.deviceManager - } cellWidth: width / tilesPerRow cellHeight: cellWidth delegate: DevicesPageDelegate {