Merge PR #774: Update ZigbeeNodesProxy filter when a device changes reachable state

This commit is contained in:
Jenkins nymea 2022-02-21 00:56:04 +01:00
commit 0d0625a36a
4 changed files with 34 additions and 5 deletions

View File

@ -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<uint>(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 &params
// 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();
}
}

View File

@ -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;

View File

@ -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<int> &roles = QVector<int>()){
if (roles.contains(ZigbeeNodes::RoleReachable) && (!m_showOffline || !m_showOnline)) {
invalidateFilter();
emit countChanged();
}
});
setSourceModel(m_zigbeeNodes);

View File

@ -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")
@ -173,8 +181,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 +191,6 @@ SettingsPageBase {
showOnline: false
}
}
}
}
}