Add WiFi networks list filter option

This commit is contained in:
Simon Stürz 2024-09-13 16:13:39 +02:00
parent be79826d68
commit 316bce2a4e
17 changed files with 337 additions and 19 deletions

View File

@ -49,13 +49,57 @@ void WirelessAccessPointsProxy::setAccessPoints(WirelessAccessPoints *accessPoin
{ {
m_accessPoints = accessPoints; m_accessPoints = accessPoints;
emit accessPointsChanged(); emit accessPointsChanged();
setSourceModel(m_accessPoints); setSourceModel(m_accessPoints);
connect(accessPoints, &WirelessAccessPoints::countChanged, this, &WirelessAccessPointsProxy::countChanged); connect(accessPoints, &WirelessAccessPoints::countChanged, this, [this](){
sort(0, Qt::DescendingOrder);
invalidateFilter();
emit countChanged();
});
setSortRole(WirelessAccessPoints::WirelessAccesspointRoleSignalStrength); setSortRole(WirelessAccessPoints::WirelessAccesspointRoleSignalStrength);
sort(0, Qt::DescendingOrder); sort(0, Qt::DescendingOrder);
invalidateFilter();
emit countChanged();
} }
WirelessAccessPoint *WirelessAccessPointsProxy::get(int index) const WirelessAccessPoint *WirelessAccessPointsProxy::get(int index) const
{ {
return m_accessPoints->get(mapToSource(this->index(index, 0)).row()); return m_accessPoints->get(mapToSource(this->index(index, 0)).row());
} }
bool WirelessAccessPointsProxy::showDuplicates() const
{
return m_showDuplicates;
}
void WirelessAccessPointsProxy::setShowDuplicates(bool showDuplicates)
{
m_showDuplicates = showDuplicates;
emit showDuplicatesChanged();
sort(0, Qt::DescendingOrder);
invalidateFilter();
emit countChanged();
}
bool WirelessAccessPointsProxy::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
Q_UNUSED(source_parent)
if (m_showDuplicates)
return true;
WirelessAccessPoint *accessPoint = m_accessPoints->get(source_row);
// Check if this is the best signal strenght, otherwise filter out...
foreach (WirelessAccessPoint *ap, m_accessPoints->wirelessAccessPoints()) {
if (ap->ssid() == accessPoint->ssid() && ap->signalStrength() > accessPoint->signalStrength()) {
return false;
}
}
return true;
}

View File

@ -42,6 +42,8 @@ class WirelessAccessPointsProxy : public QSortFilterProxyModel
Q_OBJECT Q_OBJECT
Q_PROPERTY(int count READ rowCount NOTIFY countChanged) Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
Q_PROPERTY(WirelessAccessPoints* accessPoints READ accessPoints WRITE setAccessPoints) Q_PROPERTY(WirelessAccessPoints* accessPoints READ accessPoints WRITE setAccessPoints)
Q_PROPERTY(bool showDuplicates READ showDuplicates WRITE setShowDuplicates NOTIFY showDuplicatesChanged FINAL)
public: public:
explicit WirelessAccessPointsProxy(QObject *parent = nullptr); explicit WirelessAccessPointsProxy(QObject *parent = nullptr);
@ -50,12 +52,20 @@ public:
Q_INVOKABLE WirelessAccessPoint* get(int index) const; Q_INVOKABLE WirelessAccessPoint* get(int index) const;
bool showDuplicates() const;
void setShowDuplicates(bool showDuplicates);
signals: signals:
void countChanged(); void countChanged();
void accessPointsChanged(); void accessPointsChanged();
void showDuplicatesChanged();
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
private: private:
WirelessAccessPoints *m_accessPoints = nullptr; WirelessAccessPoints *m_accessPoints = nullptr;
bool m_showDuplicates = false;
}; };

View File

@ -319,5 +319,6 @@
<file>ui/devicepages/ThingStatusPage.qml</file> <file>ui/devicepages/ThingStatusPage.qml</file>
<file>ui/customviews/MultiStateChart.qml</file> <file>ui/customviews/MultiStateChart.qml</file>
<file>ui/devicepages/DeviceDetailsPage.qml</file> <file>ui/devicepages/DeviceDetailsPage.qml</file>
<file>ui/system/WirelessNetworksFilterSettingsPage.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -7524,6 +7524,21 @@ Toto prosím používejte pouze v případě, že jste si jisti tím co děláte
<translation>Přidat</translation> <translation>Přidat</translation>
</message> </message>
</context> </context>
<context>
<name>WirelessNetworksFilterSettingsPage</name>
<message>
<source>WiFi list options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show all networks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple networks with the same name get filterd out</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>WizardPageBase</name> <name>WizardPageBase</name>
<message> <message>

View File

@ -4499,7 +4499,7 @@ Bitte versuche es erneut.</translation>
Maybe the hardware is already in use.</source> Maybe the hardware is already in use.</source>
<translation>Verbindung zum Modbus RTU Master kann nicht hergestellt werden. <translation>Verbindung zum Modbus RTU Master kann nicht hergestellt werden.
Wird das Gerät bereits benutzt?</translation> Eventuell wird das Gerät bereits benutzt.</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to remove this Modbus RTU master?</source> <source>Are you sure you want to remove this Modbus RTU master?</source>
@ -7504,6 +7504,21 @@ Bitte benutze diese Funktion nur wenn Du sicher bist, dass es das ist was Du mö
<translation>Hinzufügen</translation> <translation>Hinzufügen</translation>
</message> </message>
</context> </context>
<context>
<name>WirelessNetworksFilterSettingsPage</name>
<message>
<source>WiFi list options</source>
<translation>WiFi Listen Optionen</translation>
</message>
<message>
<source>Show all networks</source>
<translation>Zeige alle Netzwerke</translation>
</message>
<message>
<source>Multiple networks with the same name get filterd out</source>
<translation>Mehrere Netzwerke mit gleichem Namen werden gefiltert</translation>
</message>
</context>
<context> <context>
<name>WizardPageBase</name> <name>WizardPageBase</name>
<message> <message>

View File

@ -7488,6 +7488,21 @@ Please only use this if you are sure you want this and consider reporting the is
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>WirelessNetworksFilterSettingsPage</name>
<message>
<source>WiFi list options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show all networks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple networks with the same name get filterd out</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>WizardPageBase</name> <name>WizardPageBase</name>
<message> <message>

View File

@ -7488,6 +7488,21 @@ Please only use this if you are sure you want this and consider reporting the is
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>WirelessNetworksFilterSettingsPage</name>
<message>
<source>WiFi list options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show all networks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple networks with the same name get filterd out</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>WizardPageBase</name> <name>WizardPageBase</name>
<message> <message>

View File

@ -7488,6 +7488,21 @@ Please only use this if you are sure you want this and consider reporting the is
<translation>Aggiungi</translation> <translation>Aggiungi</translation>
</message> </message>
</context> </context>
<context>
<name>WirelessNetworksFilterSettingsPage</name>
<message>
<source>WiFi list options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show all networks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple networks with the same name get filterd out</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>WizardPageBase</name> <name>WizardPageBase</name>
<message> <message>

View File

@ -7474,6 +7474,21 @@ Please only use this if you are sure you want this and consider reporting the is
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context>
<name>WirelessNetworksFilterSettingsPage</name>
<message>
<source>WiFi list options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show all networks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple networks with the same name get filterd out</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>WizardPageBase</name> <name>WizardPageBase</name>
<message> <message>

View File

@ -7510,6 +7510,21 @@ Als je fouten in de niet-officiële software vindt, geef deze dan door aan de on
<translation>Toevoegen</translation> <translation>Toevoegen</translation>
</message> </message>
</context> </context>
<context>
<name>WirelessNetworksFilterSettingsPage</name>
<message>
<source>WiFi list options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show all networks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple networks with the same name get filterd out</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>WizardPageBase</name> <name>WizardPageBase</name>
<message> <message>

View File

@ -7475,6 +7475,21 @@ Lütfen bunu istediğinizden eminseniz kullanın ve yayınlanmamış kanalları
<translation>Ekle</translation> <translation>Ekle</translation>
</message> </message>
</context> </context>
<context>
<name>WirelessNetworksFilterSettingsPage</name>
<message>
<source>WiFi list options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show all networks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple networks with the same name get filterd out</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>WizardPageBase</name> <name>WizardPageBase</name>
<message> <message>

View File

@ -7469,6 +7469,21 @@ Please only use this if you are sure you want this and consider reporting the is
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context>
<name>WirelessNetworksFilterSettingsPage</name>
<message>
<source>WiFi list options</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show all networks</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Multiple networks with the same name get filterd out</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>WizardPageBase</name> <name>WizardPageBase</name>
<message> <message>

View File

@ -197,7 +197,6 @@ SettingsPageBase {
} }
} }
Component { Component {
id: styleChangedDialog id: styleChangedDialog
Dialog { Dialog {

View File

@ -23,6 +23,8 @@ Page {
readonly property int visibleContentHeight: contentFlickable.height - contentContainer.y readonly property int visibleContentHeight: contentFlickable.height - contentContainer.y
property var headerButtons: []
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
spacing: Style.margins spacing: Style.margins
@ -46,6 +48,22 @@ Page {
Layout.preferredHeight: Style.iconSize + Style.smallMargins * 2 Layout.preferredHeight: Style.iconSize + Style.smallMargins * 2
Layout.preferredWidth: Style.iconSize + Style.smallMargins * 2 Layout.preferredWidth: Style.iconSize + Style.smallMargins * 2
} }
Row {
id: additionalIcons
anchors { right: parent.right; top: parent.top }
visible: !d.configOverlay
width: visible ? implicitWidth : 0
Repeater {
model: headerButtons
delegate: HeaderButton {
imageSource: root.headerButtons[index].iconSource
onClicked: root.headerButtons[index].trigger()
visible: root.headerButtons[index].visible
color: root.headerButtons[index].color
}
}
}
} }
Flickable { Flickable {

View File

@ -1,6 +1,8 @@
import QtQuick 2.3 import QtQuick 2.3
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Layouts 1.2 import QtQuick.Layouts 1.2
import Qt.labs.settings 1.1
import "../components" import "../components"
import Nymea 1.0 import Nymea 1.0
@ -503,6 +505,29 @@ WizardPageBase {
showNextButton: false showNextButton: false
onBack: pageStack.pop() onBack: pageStack.pop()
headerButtons: [
{
iconSource: "/ui/images/filters.svg",
color: Style.iconColor,
trigger: function() {
pageStack.push(Qt.createComponent("/ui/system/WirelessNetworksFilterSettingsPage.qml"),
{ wirelessAccessPointsProxy: wirelessAccessPointsModel });
},
visible: true
}
]
Settings {
id: settings
property bool wirelessShowDuplicates: false
}
WirelessAccessPointsProxy {
id: wirelessAccessPointsModel
showDuplicates: settings.wirelessShowDuplicates
accessPoints: wifiSetup.accessPoints
}
property var wifiSetup: null property var wifiSetup: null
Component.onCompleted: { Component.onCompleted: {
@ -519,15 +544,14 @@ WizardPageBase {
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
model: wifiSetup.accessPoints model: wirelessAccessPointsModel
clip: true clip: true
delegate: NymeaItemDelegate { delegate: NymeaItemDelegate {
width: parent.width width: parent.width
text: model.ssid !== "" ? model.ssid : qsTr("Hidden Network") text: model.ssid !== "" ? model.ssid : qsTr("Hidden Network")
subText: model.hostAddress subText: model.macAddress + (model.hostAddress === "" ? "" : (" (" + model.hostAddress + ")"))
prominentSubText: false
iconColor: model.selectedNetwork ? Style.accentColor : "#808080" iconColor: model.selectedNetwork ? Style.accentColor : "#808080"
iconName: { iconName: {
if (model.protected) { if (model.protected) {
@ -577,7 +601,6 @@ WizardPageBase {
visible: wifiSetup.wirelessServiceVersion >= 2 visible: wifiSetup.wirelessServiceVersion >= 2
onClicked: { onClicked: {
pageStack.push(hiddenWifiComponent, {wifiSetup: wifiSetup}) pageStack.push(hiddenWifiComponent, {wifiSetup: wifiSetup})
} }
} }
} }

View File

@ -32,8 +32,10 @@ import QtQuick 2.9
import QtQuick.Controls 2.1 import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.1 import QtQuick.Controls.Material 2.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import Qt.labs.settings 1.1
import Nymea 1.0 import Nymea 1.0
import "../components" import "qrc:/ui/components"
SettingsPageBase { SettingsPageBase {
id: root id: root
@ -398,11 +400,6 @@ SettingsPageBase {
property WirelessNetworkDevice wirelessNetworkDevice: null property WirelessNetworkDevice wirelessNetworkDevice: null
WirelessAccessPointsProxy {
id: apProxy
accessPoints: wirelessAccessPointsPage.wirelessNetworkDevice.accessPoints
}
SettingsPageSectionHeader { SettingsPageSectionHeader {
text: qsTr("Access Point") text: qsTr("Access Point")
} }
@ -442,8 +439,31 @@ SettingsPageBase {
} }
} }
SettingsPageSectionHeader { Settings {
text: qsTr("Connect to wireless network") id: settings
property bool wirelessShowDuplicates: false
}
WirelessAccessPointsProxy {
id: apProxy
accessPoints: wirelessAccessPointsPage.wirelessNetworkDevice ? wirelessAccessPointsPage.wirelessNetworkDevice.accessPoints : null
showDuplicates: settings.wirelessShowDuplicates
}
RowLayout {
Layout.fillWidth: true
SettingsPageSectionHeader {
Layout.fillWidth: true
text: qsTr("Connect to wireless network")
}
HeaderButton {
id: filterButton
imageSource: "/ui/images/filters.svg"
color: Style.iconColor
onClicked: pageStack.push(Qt.createComponent("/ui/system/WirelessNetworksFilterSettingsPage.qml"),
{ wirelessAccessPointsProxy: apProxy });
}
} }
Repeater { Repeater {
@ -544,7 +564,7 @@ SettingsPageBase {
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
validator: RegExpValidator { validator: RegExpValidator {
regExp: /^((?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){0,3}(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$/ regExp: /^((?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){0,3}(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$/
} }
} }
Label { Label {
@ -571,7 +591,7 @@ SettingsPageBase {
Layout.fillWidth: true Layout.fillWidth: true
validator: RegExpValidator { validator: RegExpValidator {
regExp: /^((?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){0,3}(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$/ regExp: /^((?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){0,3}(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$/
} }
} }
Label { Label {
@ -584,7 +604,7 @@ SettingsPageBase {
Layout.fillWidth: true Layout.fillWidth: true
validator: RegExpValidator { validator: RegExpValidator {
regExp: /^((?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){0,3}(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$/ regExp: /^((?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){0,3}(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$/
} }
} }
} }

View File

@ -0,0 +1,68 @@
import QtQuick 2.9
import QtQuick.Controls 2.9
import QtQuick.Layouts 1.2
import Qt.labs.settings 1.1
import "qrc:/ui/components"
import Nymea 1.0
Page {
id: root
title: qsTr("WiFi list options")
property WirelessAccessPointsProxy wirelessAccessPointsProxy: null
header: Item {
height: 28 + 2 * Style.margins
RowLayout {
anchors.fill: parent
spacing: app.margins
HeaderButton {
id: backButton
objectName: "backButton"
imageSource: "../images/back.svg"
onClicked: pageStack.pop();
}
Label {
Layout.fillWidth: true
id: titleLabel
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
text: root.title
font.pixelSize: app.largeFont
}
}
}
Settings {
id: settings
property bool wirelessShowDuplicates: false
}
ColumnLayout {
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: app.margins
NymeaItemDelegate {
Layout.fillWidth: true
text: qsTr("Show all networks")
subText: qsTr("Multiple networks with the same name get filterd out")
prominentSubText: false
progressive: false
additionalItem: Switch {
anchors.verticalCenter: parent.verticalCenter
checked: settings.wirelessShowDuplicates
onCheckedChanged: {
settings.wirelessShowDuplicates = checked
wirelessAccessPointsProxy.showDuplicates = checked
}
}
}
}
}