From 15283d977880fc60b8f9732772256e8337d6ac8e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 20 May 2025 15:28:55 -0700 Subject: [PATCH] draft --- selfdrive/ui/qt/network/networking.cc | 24 ++++++++++++- selfdrive/ui/qt/network/networking.h | 1 + selfdrive/ui/qt/network/wifi_manager.cc | 1 + selfdrive/ui/qt/widgets/controls.h | 46 ++++++++++++++++++++----- 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/selfdrive/ui/qt/network/networking.cc b/selfdrive/ui/qt/network/networking.cc index f7e13f2c55..4d9486b496 100644 --- a/selfdrive/ui/qt/network/networking.cc +++ b/selfdrive/ui/qt/network/networking.cc @@ -184,7 +184,6 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid list->addItem(cellularMeteredToggle); // Wi-Fi metered toggle - std::vector longi_button_texts{tr("Unmetered"), tr("Default"), tr("Metered")}; wifiMeteredToggle = new ToggleControl(tr("Wi-Fi Network Metered"), tr("Prevent large data uploads when on a metered Wi-FI connection"), "", false); wifiMeteredToggle->setEnabled(false); QObject::connect(wifiMeteredToggle, &ToggleControl::toggleFlipped, [=](bool state) { @@ -201,6 +200,22 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid }); list->addItem(wifiMeteredToggle); + std::vector metered_button_texts{tr("unmetered"), tr("metered"), tr("default")}; + wifiMeteredToggle2 = new MultiButtonControl(tr("Wi-Fi Network Metered"), tr("Prevent large data uploads when on a metered Wi-FI connection"), "", metered_button_texts); + QObject::connect(wifiMeteredToggle2, &MultiButtonControl::buttonClicked, [=](int id) { + std::cout << "Set Wi-Fi metered to " << id << std::endl; + wifiMeteredToggle2->setEnabled(false); + auto pending_call = wifi->setCurrentNetworkMetered(id == 1); + if (pending_call) { + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(*pending_call); + QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [=]() { + refresh(); + watcher->deleteLater(); + }); + } + }); + list->addItem(wifiMeteredToggle2); + // Hidden Network hiddenNetworkButton = new ButtonControl(tr("Hidden Network"), tr("CONNECT")); connect(hiddenNetworkButton, &ButtonControl::clicked, [=]() { @@ -241,15 +256,22 @@ void AdvancedNetworking::refresh() { wifiMeteredToggle->setEnabled(false); wifiMeteredToggle->setValue(""); wifiMeteredToggle->setToggled(true); + + wifiMeteredToggle2->setEnabled(false); } else if (wifi->ipv4_address != "") { bool metered = wifi->currentNetworkMetered(); wifiMeteredToggle->setEnabled(true); wifiMeteredToggle->setValue(""); wifiMeteredToggle->setToggled(metered); + + wifiMeteredToggle2->setEnabled(true); + wifiMeteredToggle2->setCheckedButton(metered ? 1 : 0); } else { wifiMeteredToggle->setEnabled(false); wifiMeteredToggle->setValue("Disconnected"); wifiMeteredToggle->setToggled(false); + + wifiMeteredToggle2->setEnabled(false); } update(); diff --git a/selfdrive/ui/qt/network/networking.h b/selfdrive/ui/qt/network/networking.h index a42dfb9c01..207aded3b4 100644 --- a/selfdrive/ui/qt/network/networking.h +++ b/selfdrive/ui/qt/network/networking.h @@ -67,6 +67,7 @@ private: ButtonControl* hiddenNetworkButton; ToggleControl* cellularMeteredToggle; ToggleControl* wifiMeteredToggle; + MultiButtonControl* wifiMeteredToggle2; WifiManager* wifi = nullptr; Params params; diff --git a/selfdrive/ui/qt/network/wifi_manager.cc b/selfdrive/ui/qt/network/wifi_manager.cc index 747bed1f67..f759e4d31e 100644 --- a/selfdrive/ui/qt/network/wifi_manager.cc +++ b/selfdrive/ui/qt/network/wifi_manager.cc @@ -398,6 +398,7 @@ std::optional WifiManager::setCurrentNetworkMetered(bool meter int meteredInt = metered ? NM_METERED_YES : NM_METERED_NO; Connection settings = getConnectionSettings(conn); settings["connection"]["metered"] = meteredInt; + std::cout << "done\n"; return asyncCall(conn.path(), NM_DBUS_INTERFACE_SETTINGS_CONNECTION, "Update", QVariant::fromValue(settings)); } } diff --git a/selfdrive/ui/qt/widgets/controls.h b/selfdrive/ui/qt/widgets/controls.h index 6452d64758..e0b3329d0f 100644 --- a/selfdrive/ui/qt/widgets/controls.h +++ b/selfdrive/ui/qt/widgets/controls.h @@ -190,10 +190,10 @@ private: bool store_confirm = false; }; -class ButtonParamControl : public AbstractControl { +class MultiButtonControl : public AbstractControl { Q_OBJECT public: - ButtonParamControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, + MultiButtonControl(const QString &title, const QString &desc, const QString &icon, const std::vector &button_texts, const int minimum_button_width = 225) : AbstractControl(title, desc, icon) { const QString style = R"( QPushButton { @@ -211,28 +211,34 @@ public: QPushButton:checked:enabled { background-color: #33Ab4C; } + QPushButton:checked:disabled { + background-color: #9933Ab4C; + } QPushButton:disabled { color: #33E4E4E4; } )"; - key = param.toStdString(); - int value = atoi(params.get(key).c_str()); + // TODO: none of these look good +// QPushButton:checked:disabled { +// background-color: #227722; +// } +// QPushButton:checked:disabled { +// background-color: #3333Ab4C; +// } button_group = new QButtonGroup(this); button_group->setExclusive(true); for (int i = 0; i < button_texts.size(); i++) { QPushButton *button = new QPushButton(button_texts[i], this); button->setCheckable(true); - button->setChecked(i == value); + button->setChecked(i == 0); button->setStyleSheet(style); button->setMinimumWidth(minimum_button_width); hlayout->addWidget(button); button_group->addButton(button, i); } - QObject::connect(button_group, QOverload::of(&QButtonGroup::buttonClicked), [=](int id) { - params.put(key, std::to_string(id)); - }); + QObject::connect(button_group, QOverload::of(&QButtonGroup::buttonClicked), this, &MultiButtonControl::buttonClicked); } void setEnabled(bool enable) { @@ -245,6 +251,29 @@ public: button_group->button(id)->setChecked(true); } +signals: + void buttonClicked(int id); + +protected: + QButtonGroup *button_group; +}; + +class ButtonParamControl : public MultiButtonControl { + Q_OBJECT +public: + ButtonParamControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, + const std::vector &button_texts, const int minimum_button_width = 225) : MultiButtonControl(title, desc, icon, button_texts, minimum_button_width) { + key = param.toStdString(); + int value = atoi(params.get(key).c_str()); + if (value > 0 && value >= button_texts.size()) { + button_group->button(value)->setChecked(false); + } + + QObject::connect(this, QOverload::of(&MultiButtonControl::buttonClicked), [=](int id) { + params.put(key, std::to_string(id)); + }); + } + void refresh() { int value = atoi(params.get(key).c_str()); button_group->button(value)->setChecked(true); @@ -257,7 +286,6 @@ public: private: std::string key; Params params; - QButtonGroup *button_group; }; class ListWidget : public QWidget {