From fc0f57ae0776da52a511e297a19eee4f44a5b425 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Fri, 31 Aug 2018 17:55:59 +0200 Subject: [PATCH] remove usage of Engine singleton in InterfacesModel --- libnymea-app-core/deviceclasses.cpp | 4 ++- libnymea-app-core/deviceclasses.h | 4 +++ libnymea-app-core/devicemanager.cpp | 2 +- libnymea-app-core/devicemanager.h | 3 ++- libnymea-app-core/interfacesmodel.cpp | 33 ++++++++++++++----------- libnymea-app-core/interfacesmodel.h | 12 +++++---- libnymea-app-core/jsonrpc/jsontypes.cpp | 4 +-- libnymea-app-core/jsonrpc/jsontypes.h | 2 +- libnymea-common/types/vendors.cpp | 1 + nymea-app/ui/MainPage.qml | 2 +- nymea-app/ui/mainviews/DevicesPage.qml | 2 +- 11 files changed, 41 insertions(+), 28 deletions(-) diff --git a/libnymea-app-core/deviceclasses.cpp b/libnymea-app-core/deviceclasses.cpp index f3ea24f6..2757ae27 100644 --- a/libnymea-app-core/deviceclasses.cpp +++ b/libnymea-app-core/deviceclasses.cpp @@ -78,7 +78,7 @@ DeviceClass *DeviceClasses::getDeviceClass(QUuid deviceClassId) const return deviceClass; } } - return 0; + return nullptr; } void DeviceClasses::addDeviceClass(DeviceClass *deviceClass) @@ -87,6 +87,7 @@ void DeviceClasses::addDeviceClass(DeviceClass *deviceClass) //qDebug() << "DeviceClasses: loaded deviceClass" << deviceClass->name(); m_deviceClasses.append(deviceClass); endInsertRows(); + emit countChanged(); } void DeviceClasses::clearModel() @@ -96,6 +97,7 @@ void DeviceClasses::clearModel() qDeleteAll(m_deviceClasses); m_deviceClasses.clear(); endResetModel(); + emit countChanged(); } QHash DeviceClasses::roleNames() const diff --git a/libnymea-app-core/deviceclasses.h b/libnymea-app-core/deviceclasses.h index 742ac6f5..b6785de7 100644 --- a/libnymea-app-core/deviceclasses.h +++ b/libnymea-app-core/deviceclasses.h @@ -30,6 +30,7 @@ class DeviceClasses : public QAbstractListModel { Q_OBJECT + Q_PROPERTY(int count READ rowCount NOTIFY countChanged) public: enum Role { RoleId, @@ -54,6 +55,9 @@ public: void clearModel(); +signals: + void countChanged(); + protected: QHash roleNames() const; diff --git a/libnymea-app-core/devicemanager.cpp b/libnymea-app-core/devicemanager.cpp index 0539f39e..48d8fb92 100644 --- a/libnymea-app-core/devicemanager.cpp +++ b/libnymea-app-core/devicemanager.cpp @@ -137,7 +137,7 @@ void DeviceManager::getVendorsResponse(const QVariantMap ¶ms) if (params.value("params").toMap().keys().contains("vendors")) { QVariantList vendorList = params.value("params").toMap().value("vendors").toList(); foreach (QVariant vendorVariant, vendorList) { - Vendor *vendor = JsonTypes::unpackVendor(vendorVariant.toMap(), Engine::instance()->deviceManager()->vendors()); + Vendor *vendor = JsonTypes::unpackVendor(vendorVariant.toMap()); m_vendors->addVendor(vendor); // qDebug() << "Added Vendor:" << vendor->name(); } diff --git a/libnymea-app-core/devicemanager.h b/libnymea-app-core/devicemanager.h index 10d96a7f..25e1991e 100644 --- a/libnymea-app-core/devicemanager.h +++ b/libnymea-app-core/devicemanager.h @@ -26,6 +26,7 @@ #include "types/vendors.h" #include "devices.h" #include "deviceclasses.h" +#include "interfacesmodel.h" #include "types/plugins.h" #include "jsonrpc/jsonhandler.h" #include "jsonrpc/jsonrpcclient.h" @@ -48,7 +49,7 @@ public: }; Q_ENUM(RemovePolicy) - explicit DeviceManager(JsonRpcClient *jsonclient, QObject *parent = 0); + explicit DeviceManager(JsonRpcClient *jsonclient, QObject *parent = nullptr); void clear(); void init(); diff --git a/libnymea-app-core/interfacesmodel.cpp b/libnymea-app-core/interfacesmodel.cpp index 29d4e2d7..7f493719 100644 --- a/libnymea-app-core/interfacesmodel.cpp +++ b/libnymea-app-core/interfacesmodel.cpp @@ -2,9 +2,10 @@ #include "engine.h" - -InterfacesModel::InterfacesModel(QObject *parent) : QAbstractListModel(parent) +InterfacesModel::InterfacesModel(QObject *parent): + QAbstractListModel(parent) { + } int InterfacesModel::rowCount(const QModelIndex &parent) const @@ -29,20 +30,23 @@ QHash InterfacesModel::roleNames() const return roles; } -Devices *InterfacesModel::devices() const +DeviceManager *InterfacesModel::deviceManager() const { - return m_devices; + return m_deviceManager; } -void InterfacesModel::setDevices(Devices *devices) +void InterfacesModel::setDeviceManager(DeviceManager *deviceManager) { - if (m_devices != devices) { - m_devices = devices; - emit devicesChanged(); + if (m_deviceManager != deviceManager) { + m_deviceManager = deviceManager; + emit deviceManagerChanged(); + connect(m_deviceManager->devices(), &Devices::countChanged, this, [this]() { + syncInterfaces(); + }); + connect(m_deviceManager->deviceClasses(), &DeviceClasses::countChanged, this, [this]() { + syncInterfaces(); + }); syncInterfaces(); - - connect(devices, &Devices::rowsInserted, this, &InterfacesModel::rowsChanged); - connect(devices, &Devices::rowsRemoved, this, &InterfacesModel::rowsChanged); } } @@ -77,13 +81,12 @@ void InterfacesModel::setShowUncategorized(bool showUncategorized) void InterfacesModel::syncInterfaces() { - if (!m_devices) { + if (!m_deviceManager) { return; } - QStringList interfacesInSource; - for (int i = 0; i < m_devices->rowCount(); i++) { - DeviceClass *dc = Engine::instance()->deviceManager()->deviceClasses()->getDeviceClass(m_devices->get(i)->deviceClassId()); + for (int i = 0; i < m_deviceManager->devices()->rowCount(); i++) { + DeviceClass *dc = m_deviceManager->deviceClasses()->getDeviceClass(m_deviceManager->devices()->get(i)->deviceClassId()); // qDebug() << "device" <name() << "has interfaces" << dc->interfaces(); bool isInShownIfaces = false; diff --git a/libnymea-app-core/interfacesmodel.h b/libnymea-app-core/interfacesmodel.h index 13a560c8..2d39a249 100644 --- a/libnymea-app-core/interfacesmodel.h +++ b/libnymea-app-core/interfacesmodel.h @@ -6,11 +6,13 @@ #include "devices.h" +class DeviceManager; + class InterfacesModel : public QAbstractListModel { Q_OBJECT Q_PROPERTY(int count READ rowCount NOTIFY countChanged) - Q_PROPERTY(Devices* devices READ devices WRITE setDevices NOTIFY devicesChanged) + Q_PROPERTY(DeviceManager* deviceManager READ deviceManager WRITE setDeviceManager NOTIFY deviceManagerChanged) Q_PROPERTY(QStringList shownInterfaces READ shownInterfaces WRITE setShownInterfaces NOTIFY shownInterfacesChanged) Q_PROPERTY(bool showUncategorized READ showUncategorized WRITE setShowUncategorized NOTIFY showUncategorizedChanged) @@ -26,8 +28,8 @@ public: QVariant data(const QModelIndex &index, int role) const override; QHash roleNames() const override; - Devices* devices() const; - void setDevices(Devices *devices); + DeviceManager* deviceManager() const; + void setDeviceManager(DeviceManager *deviceManager); QStringList shownInterfaces() const; void setShownInterfaces(const QStringList &shownInterfaces); @@ -37,7 +39,7 @@ public: signals: void countChanged(); - void devicesChanged(); + void deviceManagerChanged(); void shownInterfacesChanged(); void showUncategorizedChanged(); @@ -46,7 +48,7 @@ private slots: void rowsChanged(const QModelIndex &index, int first, int last); private: - Devices *m_devices = nullptr; + DeviceManager *m_deviceManager = nullptr; QStringList m_interfaces; QStringList m_shownInterfaces; diff --git a/libnymea-app-core/jsonrpc/jsontypes.cpp b/libnymea-app-core/jsonrpc/jsontypes.cpp index c99d82d3..e56135cc 100644 --- a/libnymea-app-core/jsonrpc/jsontypes.cpp +++ b/libnymea-app-core/jsonrpc/jsontypes.cpp @@ -48,9 +48,9 @@ JsonTypes::JsonTypes(QObject *parent) : { } -Vendor *JsonTypes::unpackVendor(const QVariantMap &vendorMap, QObject *parent) +Vendor *JsonTypes::unpackVendor(const QVariantMap &vendorMap) { - Vendor *v = new Vendor(vendorMap.value("id").toUuid(), vendorMap.value("name").toString(), parent); + Vendor *v = new Vendor(vendorMap.value("id").toUuid(), vendorMap.value("name").toString()); v->setDisplayName(vendorMap.value("displayName").toString()); return v; } diff --git a/libnymea-app-core/jsonrpc/jsontypes.h b/libnymea-app-core/jsonrpc/jsontypes.h index dfe18f7c..92bc50b1 100644 --- a/libnymea-app-core/jsonrpc/jsontypes.h +++ b/libnymea-app-core/jsonrpc/jsontypes.h @@ -54,7 +54,7 @@ class JsonTypes : public QObject public: explicit JsonTypes(QObject *parent = 0); - static Vendor *unpackVendor(const QVariantMap &vendorMap, QObject *parent); + static Vendor *unpackVendor(const QVariantMap &vendorMap); static Plugin *unpackPlugin(const QVariantMap &pluginMap, QObject *parent); static DeviceClass *unpackDeviceClass(const QVariantMap &deviceClassMap, QObject *parent); static void unpackParam(const QVariantMap ¶mMap, Param *param); diff --git a/libnymea-common/types/vendors.cpp b/libnymea-common/types/vendors.cpp index 18df232d..34e32413 100644 --- a/libnymea-common/types/vendors.cpp +++ b/libnymea-common/types/vendors.cpp @@ -74,6 +74,7 @@ QVariant Vendors::data(const QModelIndex &index, int role) const void Vendors::addVendor(Vendor *vendor) { + vendor->setParent(this); beginInsertRows(QModelIndex(), m_vendors.count(), m_vendors.count()); //qDebug() << "Vendors: loaded vendor" << vendor->name(); m_vendors.append(vendor); diff --git a/nymea-app/ui/MainPage.qml b/nymea-app/ui/MainPage.qml index 5e370dd2..cd1da1bc 100644 --- a/nymea-app/ui/MainPage.qml +++ b/nymea-app/ui/MainPage.qml @@ -109,7 +109,7 @@ Page { height: swipeView.height model: InterfacesSortModel { interfacesModel: InterfacesModel { - devices: Engine.deviceManager.devices + deviceManager: Engine.deviceManager shownInterfaces: app.supportedInterfaces } } diff --git a/nymea-app/ui/mainviews/DevicesPage.qml b/nymea-app/ui/mainviews/DevicesPage.qml index 7eca6603..2e83e018 100644 --- a/nymea-app/ui/mainviews/DevicesPage.qml +++ b/nymea-app/ui/mainviews/DevicesPage.qml @@ -21,7 +21,7 @@ Item { model: InterfacesModel { id: interfacesModel - devices: Engine.deviceManager.devices + deviceManager: Engine.deviceManager } cellWidth: width / tilesPerRow cellHeight: cellWidth