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 } } + } } }