mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-02 03:52:11 +08:00
networking: show correct strength for mesh networks (#21690)
* update seen network if higher strength * keep in wifiManager * more readable old-commit-hash: 1ada078857cc3de28c8013a3c2994d680338f274
This commit is contained in:
@@ -89,13 +89,11 @@ void Networking::connectToNetwork(const Network &n) {
|
||||
}
|
||||
|
||||
void Networking::wrongPassword(const QString &ssid) {
|
||||
for (Network n : wifi->seen_networks) {
|
||||
if (n.ssid == ssid) {
|
||||
QString pass = InputDialog::getText("Wrong password", this, "for \"" + n.ssid +"\"", true, 8);
|
||||
if (!pass.isEmpty()) {
|
||||
wifi->connect(n, pass);
|
||||
}
|
||||
return;
|
||||
if (wifi->seenNetworks.contains(ssid)) {
|
||||
const Network &n = wifi->seenNetworks.value(ssid);
|
||||
QString pass = InputDialog::getText("Wrong password", this, "for \"" + n.ssid +"\"", true, 8);
|
||||
if (!pass.isEmpty()) {
|
||||
wifi->connect(n, pass);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -228,16 +226,18 @@ void WifiUI::refresh() {
|
||||
// TODO: don't rebuild this every time
|
||||
clearLayout(main_layout);
|
||||
|
||||
if (wifi->seen_networks.size() == 0) {
|
||||
if (wifi->seenNetworks.size() == 0) {
|
||||
QLabel *scanning = new QLabel("Scanning for networks...");
|
||||
scanning->setStyleSheet("font-size: 65px;");
|
||||
main_layout->addWidget(scanning, 0, Qt::AlignCenter);
|
||||
return;
|
||||
}
|
||||
QList<Network> sortedNetworks = wifi->seenNetworks.values();
|
||||
std::sort(sortedNetworks.begin(), sortedNetworks.end(), compare_by_strength);
|
||||
|
||||
// add networks
|
||||
int i = 0;
|
||||
for (Network &network : wifi->seen_networks) {
|
||||
for (Network &network : sortedNetworks) {
|
||||
QHBoxLayout *hlayout = new QHBoxLayout;
|
||||
hlayout->setContentsMargins(44, 0, 73, 0);
|
||||
hlayout->setSpacing(50);
|
||||
@@ -284,13 +284,13 @@ void WifiUI::refresh() {
|
||||
|
||||
// Strength indicator
|
||||
QLabel *strength = new QLabel();
|
||||
strength->setPixmap(strengths[std::clamp((int)network.strength/26, 0, 3)]);
|
||||
strength->setPixmap(strengths[std::clamp((int)round(network.strength / 33.), 0, 3)]);
|
||||
hlayout->addWidget(strength, 0, Qt::AlignRight);
|
||||
|
||||
main_layout->addLayout(hlayout);
|
||||
|
||||
// Don't add the last horizontal line
|
||||
if (i+1 < wifi->seen_networks.size()) {
|
||||
if (i+1 < wifi->seenNetworks.size()) {
|
||||
main_layout->addWidget(horizontal_line(), 0);
|
||||
}
|
||||
i++;
|
||||
|
||||
@@ -78,8 +78,7 @@ void WifiManager::refreshNetworks() {
|
||||
if (adapter.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
seen_networks.clear();
|
||||
seen_ssids.clear();
|
||||
seenNetworks.clear();
|
||||
ipv4_address = get_ipv4_address();
|
||||
|
||||
QDBusInterface nm(NM_DBUS_SERVICE, adapter, NM_DBUS_INTERFACE_DEVICE_WIRELESS, bus);
|
||||
@@ -87,11 +86,12 @@ void WifiManager::refreshNetworks() {
|
||||
|
||||
const QDBusReply<QList<QDBusObjectPath>> &response = nm.call("GetAllAccessPoints");
|
||||
for (const QDBusObjectPath &path : response.value()) {
|
||||
QByteArray ssid = get_property(path.path(), "Ssid");
|
||||
if (ssid.isEmpty() || seen_ssids.contains(ssid)) {
|
||||
const QByteArray &ssid = get_property(path.path(), "Ssid");
|
||||
unsigned int strength = get_ap_strength(path.path());
|
||||
if (ssid.isEmpty() || (seenNetworks.contains(ssid) &&
|
||||
strength <= seenNetworks.value(ssid).strength)) {
|
||||
continue;
|
||||
}
|
||||
unsigned int strength = get_ap_strength(path.path());
|
||||
SecurityType security = getSecurityType(path.path());
|
||||
ConnectedType ctype;
|
||||
QString activeSsid = (activeAp != "" && activeAp != "/") ? get_property(activeAp, "Ssid") : "";
|
||||
@@ -104,11 +104,9 @@ void WifiManager::refreshNetworks() {
|
||||
ctype = ConnectedType::CONNECTED;
|
||||
}
|
||||
}
|
||||
Network network = {path.path(), ssid, strength, ctype, security};
|
||||
seen_ssids.push_back(ssid);
|
||||
seen_networks.push_back(network);
|
||||
Network network = {ssid, strength, ctype, security};
|
||||
seenNetworks[ssid] = network;
|
||||
}
|
||||
std::sort(seen_networks.begin(), seen_networks.end(), compare_by_strength);
|
||||
}
|
||||
|
||||
QString WifiManager::get_ipv4_address() {
|
||||
|
||||
@@ -26,12 +26,12 @@ typedef QMap<QString, QMap<QString, QVariant>> Connection;
|
||||
typedef QVector<QMap<QString, QVariant>> IpConfig;
|
||||
|
||||
struct Network {
|
||||
QString path;
|
||||
QByteArray ssid;
|
||||
unsigned int strength;
|
||||
ConnectedType connected;
|
||||
SecurityType security_type;
|
||||
};
|
||||
bool compare_by_strength(const Network &a, const Network &b);
|
||||
|
||||
class WifiManager : public QWidget {
|
||||
Q_OBJECT
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
explicit WifiManager(QWidget* parent);
|
||||
|
||||
void requestScan();
|
||||
QVector<Network> seen_networks;
|
||||
QMap<QString, Network> seenNetworks;
|
||||
QMap<QDBusObjectPath, QString> knownConnections;
|
||||
QString ipv4_address;
|
||||
|
||||
@@ -63,7 +63,6 @@ public:
|
||||
QString getTetheringPassword();
|
||||
|
||||
private:
|
||||
QVector<QByteArray> seen_ssids;
|
||||
QString adapter; // Path to network manager wifi-device
|
||||
QDBusConnection bus = QDBusConnection::systemBus();
|
||||
unsigned int raw_adapter_state; // Connection status https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NMDeviceState
|
||||
|
||||
Reference in New Issue
Block a user