diff --git a/libnymea-app/zigbee/zigbeeadaptersproxy.cpp b/libnymea-app/zigbee/zigbeeadaptersproxy.cpp
index 8786a873..cf1bee4a 100644
--- a/libnymea-app/zigbee/zigbeeadaptersproxy.cpp
+++ b/libnymea-app/zigbee/zigbeeadaptersproxy.cpp
@@ -94,6 +94,21 @@ void ZigbeeAdaptersProxy::setOnlyUnused(bool onlyUnused)
}
}
+QString ZigbeeAdaptersProxy::serialPortFilter() const
+{
+ return m_serialPortFilter;
+}
+
+void ZigbeeAdaptersProxy::setSerialPortFilter(const QString &serialPortFilter)
+{
+ if (m_serialPortFilter != serialPortFilter) {
+ m_serialPortFilter = serialPortFilter;
+ emit serialPortFilterChanged();
+ invalidateFilter();
+ emit countChanged();
+ }
+}
+
ZigbeeAdapter *ZigbeeAdaptersProxy::get(int index) const
{
if (index >= 0 && index < m_manager->adapters()->rowCount()) {
@@ -122,5 +137,9 @@ bool ZigbeeAdaptersProxy::filterAcceptsRow(int source_row, const QModelIndex &so
}
}
+ if (!m_serialPortFilter.isEmpty() && m_serialPortFilter != adapter->serialPort()) {
+ return false;
+ }
+
return true;
}
diff --git a/libnymea-app/zigbee/zigbeeadaptersproxy.h b/libnymea-app/zigbee/zigbeeadaptersproxy.h
index 7005d7eb..a2c6ced0 100644
--- a/libnymea-app/zigbee/zigbeeadaptersproxy.h
+++ b/libnymea-app/zigbee/zigbeeadaptersproxy.h
@@ -48,6 +48,7 @@ class ZigbeeAdaptersProxy : public QSortFilterProxyModel
// Optional filtering
Q_PROPERTY(ZigbeeAdaptersProxy::HardwareFilter hardwareFilter READ hardwareFilter WRITE setHardwareFilter NOTIFY hardwareFilterChanged)
Q_PROPERTY(bool onlyUnused READ onlyUnused WRITE setOnlyUnused NOTIFY onlyUnusedChanged)
+ Q_PROPERTY(QString serialPortFilter READ serialPortFilter WRITE setSerialPortFilter NOTIFY serialPortFilterChanged)
public:
enum HardwareFilter {
@@ -68,6 +69,9 @@ public:
bool onlyUnused() const;
void setOnlyUnused(bool onlyUnused);
+ QString serialPortFilter() const;
+ void setSerialPortFilter(const QString &serialPortFilter);
+
Q_INVOKABLE ZigbeeAdapter* get(int index) const;
protected:
@@ -78,11 +82,13 @@ signals:
void managerChanged();
void hardwareFilterChanged(HardwareFilter hardwareFilter);
void onlyUnusedChanged();
+ void serialPortFilterChanged();
private:
ZigbeeManager *m_manager = nullptr;
HardwareFilter m_hardwareFilter = HardwareFilterNone;
bool m_onlyUnused = false;
+ QString m_serialPortFilter;
};
#endif // ZIGBEEADAPTERSPROXY_H
diff --git a/libnymea-app/zigbee/zigbeenodesproxy.cpp b/libnymea-app/zigbee/zigbeenodesproxy.cpp
index 2149b448..b299f69e 100644
--- a/libnymea-app/zigbee/zigbeenodesproxy.cpp
+++ b/libnymea-app/zigbee/zigbeenodesproxy.cpp
@@ -91,6 +91,36 @@ void ZigbeeNodesProxy::setShowCoordinator(bool showCoordinator)
}
}
+bool ZigbeeNodesProxy::showOnline() const
+{
+ return m_showOnline;
+}
+
+void ZigbeeNodesProxy::setShowOnline(bool showOnline)
+{
+ if (m_showOnline != showOnline) {
+ m_showOnline = showOnline;
+ emit showOnlineChanged();
+ invalidateFilter();
+ emit countChanged();
+ }
+}
+
+bool ZigbeeNodesProxy::showOffline() const
+{
+ return m_showOffline;
+}
+
+void ZigbeeNodesProxy::setShowOffline(bool showOffline)
+{
+ if (m_showOffline != showOffline) {
+ m_showOffline = showOffline;
+ emit showOfflineChanged();
+ invalidateFilter();
+ emit countChanged();
+ }
+}
+
bool ZigbeeNodesProxy::newOnTop() const
{
return m_newOnTop;
@@ -120,6 +150,12 @@ bool ZigbeeNodesProxy::filterAcceptsRow(int source_row, const QModelIndex &sourc
if (!m_showCoordinator && node->type() == ZigbeeNode::ZigbeeNodeTypeCoordinator) {
return false;
}
+ if (!m_showOnline && node->reachable()) {
+ return false;
+ }
+ if (!m_showOffline && !node->reachable()) {
+ return false;
+ }
return true;
}
diff --git a/libnymea-app/zigbee/zigbeenodesproxy.h b/libnymea-app/zigbee/zigbeenodesproxy.h
index cc103659..836a0754 100644
--- a/libnymea-app/zigbee/zigbeenodesproxy.h
+++ b/libnymea-app/zigbee/zigbeenodesproxy.h
@@ -42,7 +42,10 @@ class ZigbeeNodesProxy : public QSortFilterProxyModel
Q_OBJECT
Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
Q_PROPERTY(ZigbeeNodes *zigbeeNodes READ zigbeeNodes WRITE setZigbeeNodes NOTIFY zigbeeNodesChanged)
+
Q_PROPERTY(bool showCoordinator READ showCoordinator WRITE setShowCoordinator NOTIFY showCoordinatorChanged)
+ Q_PROPERTY(bool showOnline READ showOnline WRITE setShowOnline NOTIFY showOnlineChanged)
+ Q_PROPERTY(bool showOffline READ showOffline WRITE setShowOffline NOTIFY showOfflineChanged)
Q_PROPERTY(bool newOnTop READ newOnTop WRITE setNewOnTop NOTIFY newOnTopChanged)
@@ -55,6 +58,12 @@ public:
bool showCoordinator() const;
void setShowCoordinator(bool showCoordinator);
+ bool showOnline() const;
+ void setShowOnline(bool showOnline);
+
+ bool showOffline() const;
+ void setShowOffline(bool showOffline);
+
bool newOnTop() const;
void setNewOnTop(bool newOnTop);
@@ -65,6 +74,8 @@ signals:
void zigbeeNodesChanged(ZigbeeNodes *zigbeeNodes);
void showCoordinatorChanged();
void newOnTopChanged();
+ void showOnlineChanged();
+ void showOfflineChanged();
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
@@ -74,6 +85,8 @@ private:
ZigbeeNodes *m_zigbeeNodes = nullptr;
bool m_showCoordinator = true;
+ bool m_showOnline = true;
+ bool m_showOffline = true;
bool m_newOnTop = false;
diff --git a/nymea-app/images.qrc b/nymea-app/images.qrc
index c3497c45..345ba286 100644
--- a/nymea-app/images.qrc
+++ b/nymea-app/images.qrc
@@ -271,5 +271,6 @@
ui/images/sensors/co.svg
ui/images/sensors/gas.svg
ui/images/contact-group.svg
+ ui/images/zigbee/TI.svg
diff --git a/nymea-app/ui/SettingsPage.qml b/nymea-app/ui/SettingsPage.qml
index cdcff4d5..7d5398b1 100644
--- a/nymea-app/ui/SettingsPage.qml
+++ b/nymea-app/ui/SettingsPage.qml
@@ -45,7 +45,7 @@ Page {
Flickable {
anchors.fill: parent
- contentHeight: layout.implicitHeight + (layout.isGrid ? app.margins * 2 : 0)
+ contentHeight: layout.implicitHeight + app.margins
clip: true
GridLayout {
diff --git a/nymea-app/ui/images/zigbee/TI.svg b/nymea-app/ui/images/zigbee/TI.svg
new file mode 100644
index 00000000..c1f44777
--- /dev/null
+++ b/nymea-app/ui/images/zigbee/TI.svg
@@ -0,0 +1,46 @@
+
+
+
+
diff --git a/nymea-app/ui/system/ZigbeeSettingsPage.qml b/nymea-app/ui/system/ZigbeeSettingsPage.qml
index bca47b1b..518e422c 100644
--- a/nymea-app/ui/system/ZigbeeSettingsPage.qml
+++ b/nymea-app/ui/system/ZigbeeSettingsPage.qml
@@ -85,10 +85,12 @@ SettingsPageBase {
Repeater {
model: zigbeeManager.networks
delegate: BigTile {
+ id: networkDelegate
Layout.fillWidth: true
interactive: false
+ property ZigbeeNetwork network: zigbeeManager.networks.get(index)
- onClicked: pageStack.push(Qt.resolvedUrl("ZigbeeNetworkPage.qml"), { zigbeeManager: zigbeeManager, network: zigbeeManager.networks.get(index) })
+ onClicked: pageStack.push(Qt.resolvedUrl("ZigbeeNetworkPage.qml"), { zigbeeManager: zigbeeManager, network: networkDelegate.network })
header: RowLayout {
ColorIcon {
@@ -152,23 +154,36 @@ SettingsPageBase {
RowLayout {
Label {
- Layout.fillWidth: true
- text: qsTr("MAC address:")
+ text: qsTr("Adapter:")
}
+
Label {
- text: model.macAddress
+ Layout.fillWidth: true
+ text: adaptersProxy.count > 0 ? adaptersProxy.get(0).description : ""
+ elide: Text.ElideRight
+
+ ZigbeeAdaptersProxy {
+ id: adaptersProxy
+ manager: zigbeeManager
+ serialPortFilter: networkDelegate.network.serialPort
+ }
}
}
- RowLayout {
- Label {
- Layout.fillWidth: true
- text: qsTr("Firmware version:")
- }
- Label {
- text: model.firmwareVersion
+ 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)
+
+ ZigbeeNodesProxy {
+ id: offlineNodes
+ zigbeeNodes: networkDelegate.network.nodes
+ showCoordinator: false
+ showOnline: false
}
}
+
}
}
}