#include "frogpilot/ui/qt/offroad/wheel_settings.h" FrogPilotWheelPanel::FrogPilotWheelPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; const std::vector> wheelToggles { {"DistanceButtonControl", tr("Distance Button"), tr("Action performed when the \"Distance\" button is pressed."), "../../frogpilot/assets/toggle_icons/icon_mute.png"}, {"LongDistanceButtonControl", tr("Distance Button (Long Press)"), tr("Action performed when the \"Distance\" button is pressed for more than 0.5 seconds."), "../../frogpilot/assets/toggle_icons/icon_mute.png"}, {"VeryLongDistanceButtonControl", tr("Distance Button (Very Long Press)"), tr("Action performed when the \"Distance\" button is pressed for more than 2.5 seconds."), "../../frogpilot/assets/toggle_icons/icon_mute.png"}, {"LKASButtonControl", tr("LKAS Button"), tr("Action performed when the \"LKAS\" button is pressed."), "../../frogpilot/assets/toggle_icons/icon_mute.png"} }; for (const auto &[param, title, desc, icon] : wheelToggles) { QMap functionsMap { {0, tr("No Action")}, {3, tr("Pause Steering")} }; QMap longitudinalFunctionsMap { {1, tr("Change \"Personality Profile\"")}, {2, tr("Force openpilot to Coast")}, {4, tr("Pause Acceleration/Braking")}, {5, tr("Toggle \"Experimental Mode\" On/Off")}, {6, tr("Toggle \"Traffic Mode\" On/Off")} }; ButtonControl *wheelToggle = new ButtonControl(title, tr("SELECT"), desc); QObject::connect(wheelToggle, &ButtonControl::clicked, [functionsMap, longitudinalFunctionsMap, key = param, parent, wheelToggle, this]() mutable { if (parent->hasOpenpilotLongitudinal) { QMap::const_iterator it; for (it = longitudinalFunctionsMap.constBegin(); it != longitudinalFunctionsMap.constEnd(); ++it) { functionsMap[it.key()] = it.value(); } } QString selection = MultiOptionDialog::getSelection(tr("Select a function to assign to this button"), functionsMap.values(), functionsMap[params.getInt(key.toStdString())], this); if (!selection.isEmpty()) { params.putInt(key.toStdString(), functionsMap.key(selection)); wheelToggle->setValue(selection); } }); QMap mergedFunctionsMap = functionsMap; QMap::const_iterator it; for (it = longitudinalFunctionsMap.constBegin(); it != longitudinalFunctionsMap.constEnd(); ++it) { mergedFunctionsMap[it.key()] = it.value(); } wheelToggle->setValue(mergedFunctionsMap[params.getInt(param.toStdString())]); toggles[param] = wheelToggle; addItem(wheelToggle); QObject::connect(wheelToggle, &AbstractControl::hideDescriptionEvent, [this]() { update(); }); QObject::connect(wheelToggle, &AbstractControl::showDescriptionEvent, [this]() { update(); }); } openDescriptions(forceOpenDescriptions, toggles); } void FrogPilotWheelPanel::showEvent(QShowEvent *event) { updateToggles(); } void FrogPilotWheelPanel::updateToggles() { for (auto &[key, toggle] : toggles) { bool setVisible = parent->tuningLevel >= parent->frogpilotToggleLevels[key].toDouble(); if (key == "LKASButtonControl") { setVisible &= !parent->isSubaru; setVisible &= !parent->lkasAllowedForAOL || !(params.getBool("AlwaysOnLateral") && params.getBool("AlwaysOnLateralLKAS")); } toggle->setVisible(setVisible); } openDescriptions(forceOpenDescriptions, toggles); update(); }