From 3882f367ff1f5d4d44e95f2a998f1f8eec66bb73 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 20 Feb 2022 23:23:20 +0100 Subject: [PATCH 1/2] Update ZigbeeNodesProxy filter when a device changes reachable state --- libnymea-app/zigbee/zigbeenodesproxy.cpp | 6 ++++++ nymea-app/ui/system/ZigbeeSettingsPage.qml | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/libnymea-app/zigbee/zigbeenodesproxy.cpp b/libnymea-app/zigbee/zigbeenodesproxy.cpp index b299f69e..06612ec0 100644 --- a/libnymea-app/zigbee/zigbeenodesproxy.cpp +++ b/libnymea-app/zigbee/zigbeenodesproxy.cpp @@ -65,6 +65,12 @@ void ZigbeeNodesProxy::setZigbeeNodes(ZigbeeNodes *zigbeeNodes) m_newNodes.insert(m_zigbeeNodes->get(i), QDateTime::currentDateTime()); } }); + connect(m_zigbeeNodes, &ZigbeeNodes::dataChanged, this, [this](const QModelIndex &/*topLeft*/, const QModelIndex &/*bottomRight*/, const QVector &roles = QVector()){ + if (roles.contains(ZigbeeNodes::RoleReachable) && (!m_showOffline || !m_showOnline)) { + invalidateFilter(); + emit countChanged(); + } + }); setSourceModel(m_zigbeeNodes); diff --git a/nymea-app/ui/system/ZigbeeSettingsPage.qml b/nymea-app/ui/system/ZigbeeSettingsPage.qml index 518e422c..43d7931f 100644 --- a/nymea-app/ui/system/ZigbeeSettingsPage.qml +++ b/nymea-app/ui/system/ZigbeeSettingsPage.qml @@ -173,8 +173,8 @@ SettingsPageBase { Label { Layout.fillWidth: true text: offlineNodes.count == 0 - ? qsTr("%n device(s)", "", networkDelegate.network.nodes.count) - : qsTr("%n device(s) (%1 disconnected)", "", networkDelegate.network.nodes.count).arg(offlineNodes.count) + ? qsTr("%n device(s)", "", Math.max(0, networkDelegate.network.nodes.count - 1)) // -1 for coordinator node + : qsTr("%n device(s) (%1 disconnected)", "", Math.max(networkDelegate.network.nodes.count - 1)).arg(offlineNodes.count) ZigbeeNodesProxy { id: offlineNodes @@ -183,7 +183,6 @@ SettingsPageBase { showOnline: false } } - } } } From 8ebeff8a94fd0efdfd35c91c3854e1adc3fb60b0 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 20 Feb 2022 23:35:07 +0100 Subject: [PATCH 2/2] Add a loading spinner while loading zigbee networks --- libnymea-app/zigbee/zigbeemanager.cpp | 13 ++++++++++++- libnymea-app/zigbee/zigbeemanager.h | 5 +++++ nymea-app/ui/system/ZigbeeSettingsPage.qml | 10 +++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/libnymea-app/zigbee/zigbeemanager.cpp b/libnymea-app/zigbee/zigbeemanager.cpp index 4429ccb1..d08ddc23 100644 --- a/libnymea-app/zigbee/zigbeemanager.cpp +++ b/libnymea-app/zigbee/zigbeemanager.cpp @@ -78,6 +78,11 @@ Engine *ZigbeeManager::engine() const return m_engine; } +bool ZigbeeManager::fetchingData() const +{ + return m_fetchingData; +} + QStringList ZigbeeManager::availableBackends() const { return m_availableBackends; @@ -99,7 +104,6 @@ int ZigbeeManager::addNetwork(const QString &serialPort, uint baudRate, const QS params.insert("serialPort", serialPort); params.insert("baudRate", baudRate); params.insert("backend", backend); - qWarning() << "************ channel mask!" << channels; if (m_engine->jsonRpcClient()->ensureServerVersion("5.8")) { params.insert("channelMask", static_cast(channels)); } @@ -148,6 +152,9 @@ int ZigbeeManager::removeNode(const QUuid &networkUuid, const QString &ieeeAddre void ZigbeeManager::init() { + m_fetchingData = true; + emit fetchingDataChanged(); + m_adapters->clear(); m_networks->clear(); m_availableBackends.clear(); @@ -193,6 +200,10 @@ void ZigbeeManager::getNetworksResponse(int commandId, const QVariantMap ¶ms // Get nodes from this network getNodes(network->networkUuid()); + + // In theory this should only change after nodes have been fetched... but this will do for now... + m_fetchingData = false; + emit fetchingDataChanged(); } } diff --git a/libnymea-app/zigbee/zigbeemanager.h b/libnymea-app/zigbee/zigbeemanager.h index 680049a8..93658c85 100644 --- a/libnymea-app/zigbee/zigbeemanager.h +++ b/libnymea-app/zigbee/zigbeemanager.h @@ -46,6 +46,7 @@ class ZigbeeManager : public QObject { Q_OBJECT Q_PROPERTY(Engine* engine READ engine WRITE setEngine NOTIFY engineChanged) + Q_PROPERTY(bool fetchingData READ fetchingData NOTIFY fetchingDataChanged) Q_PROPERTY(QStringList availableBackends READ availableBackends NOTIFY availableBackendsChanged) Q_PROPERTY(ZigbeeAdapters *adapters READ adapters CONSTANT) @@ -81,6 +82,8 @@ public: void setEngine(Engine *engine); Engine *engine() const; + bool fetchingData() const; + QStringList availableBackends() const; ZigbeeAdapters *adapters() const; ZigbeeNetworks *networks() const; @@ -95,6 +98,7 @@ public: signals: void engineChanged(); + void fetchingDataChanged(); void availableBackendsChanged(); void addNetworkReply(int commandId, const QString &error, const QUuid &networkUuid); void removeNodeReply(int commandId, const QString &error); @@ -118,6 +122,7 @@ private: private: Engine* m_engine = nullptr; + bool m_fetchingData = false; QStringList m_availableBackends; ZigbeeAdapters *m_adapters = nullptr; ZigbeeNetworks *m_networks = nullptr; diff --git a/nymea-app/ui/system/ZigbeeSettingsPage.qml b/nymea-app/ui/system/ZigbeeSettingsPage.qml index 43d7931f..4b55f72b 100644 --- a/nymea-app/ui/system/ZigbeeSettingsPage.qml +++ b/nymea-app/ui/system/ZigbeeSettingsPage.qml @@ -61,12 +61,20 @@ SettingsPageBase { engine: _engine } + Item { Layout.fillWidth: true Layout.preferredHeight: root.height - visible: zigbeeManager.networks.count == 0 + visible: zigbeeManager.fetchingData || zigbeeManager.networks.count == 0 + + BusyIndicator { + anchors.centerIn: parent + visible: zigbeeManager.fetchingData + running: visible + } EmptyViewPlaceholder { + visible: !zigbeeManager.fetchingData && zigbeeManager.networks.count == 0 width: parent.width - app.margins * 2 anchors.centerIn: parent title: qsTr("ZigBee")