From ed862f012b3bf6a7ca9b40ea9e4d786cbc5f554c Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sun, 14 Jul 2024 00:08:34 -0400 Subject: [PATCH] ListWidget - ListWidgetSP --- selfdrive/ui/qt/offroad/settings.h | 4 +++ selfdrive/ui/qt/widgets/controls.h | 31 +++++++------------ .../qt/offroad/custom_offsets_settings.cc | 2 +- .../sunnypilot/qt/offroad/display_settings.cc | 2 +- .../sunnypilot/qt/offroad/display_settings.h | 2 +- .../qt/offroad/lane_change_settings.cc | 2 +- .../ui/sunnypilot/qt/offroad/mads_settings.cc | 2 +- .../qt/offroad/monitoring_settings.cc | 2 +- .../ui/sunnypilot/qt/offroad/osm_settings.cc | 2 +- .../offroad/speed_limit_control_settings.cc | 2 +- .../qt/offroad/speed_limit_policy_settings.cc | 2 +- .../offroad/speed_limit_warning_settings.cc | 2 +- .../qt/offroad/sunnylink_settings.cc | 2 +- .../qt/offroad/sunnypilot_settings.cc | 2 +- .../sunnypilot/qt/offroad/vehicle_settings.cc | 2 +- .../sunnypilot/qt/offroad/vehicle_settings.h | 2 +- .../sunnypilot/qt/offroad/visuals_settings.cc | 2 +- .../sunnypilot/qt/offroad/visuals_settings.h | 2 +- selfdrive/ui/sunnypilot/qt/sp_priv_util.h | 22 +++++++++++++ .../sunnypilot/qt/widgets/sp_priv_controls.h | 24 ++++++++++++++ 20 files changed, 77 insertions(+), 36 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index 037aa7070a..4f3f282005 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -13,7 +13,11 @@ #include "selfdrive/ui/ui.h" #include "selfdrive/ui/qt/util.h" +#ifdef SUNNYPILOT +#include "selfdrive/ui/sunnypilot/qt/widgets/sp_priv_controls.h" +#else #include "selfdrive/ui/qt/widgets/controls.h" +#endif #ifdef SUNNYPILOT #include "selfdrive/ui/sunnypilot/qt/widgets/sp_priv_controls.h" diff --git a/selfdrive/ui/qt/widgets/controls.h b/selfdrive/ui/qt/widgets/controls.h index 831345c838..4cf6154fe1 100644 --- a/selfdrive/ui/qt/widgets/controls.h +++ b/selfdrive/ui/qt/widgets/controls.h @@ -281,7 +281,7 @@ private: class ListWidget : public QWidget { Q_OBJECT public: - explicit ListWidget(QWidget *parent = 0, const bool split_line = true) : QWidget(parent), _split_line(split_line), outer_layout(this) { + explicit ListWidget(QWidget *parent = 0) : QWidget(parent), outer_layout(this) { outer_layout.setMargin(0); outer_layout.setSpacing(0); outer_layout.addLayout(&inner_layout); @@ -293,22 +293,11 @@ class ListWidget : public QWidget { inline void addItem(QLayout *layout) { inner_layout.addLayout(layout); } inline void setSpacing(int spacing) { inner_layout.setSpacing(spacing); } - inline void AddWidgetAt(const int index, QWidget *new_widget) { inner_layout.insertWidget(index, new_widget); } - inline void RemoveWidgetAt(const int index) { - if (QLayoutItem* item; (item = inner_layout.takeAt(index)) != nullptr) { - if(item->widget()) delete item->widget(); - delete item; - } - } - - inline void ReplaceOrAddWidget(QWidget *old_widget, QWidget *new_widget) { - if (const int index = inner_layout.indexOf(old_widget); index != -1) { - RemoveWidgetAt(index); - AddWidgetAt(index, new_widget); - } else { - addItem(new_widget); - } - } +#ifdef SUNNYPILOT + LIST_WIDGET_FUNCTION_1 + LIST_WIDGET_FUNCTION_2 + LIST_WIDGET_FUCNTION_3 +#endif private: void paintEvent(QPaintEvent *) override { @@ -316,7 +305,7 @@ private: p.setPen(Qt::gray); for (int i = 0; i < inner_layout.count() - 1; ++i) { QWidget *widget = inner_layout.itemAt(i)->widget(); - if ((widget == nullptr || widget->isVisible()) && _split_line) { + if (widget == nullptr || widget->isVisible()) { QRect r = inner_layout.itemAt(i)->geometry(); int bottom = r.bottom() + inner_layout.spacing() / 2; p.drawLine(r.left() + 40, bottom, r.right() - 40, bottom); @@ -324,9 +313,11 @@ private: } } QVBoxLayout outer_layout; - QVBoxLayout inner_layout; - bool _split_line; +#ifdef SUNNYPILOT +protected: +#endif + QVBoxLayout inner_layout; }; // convenience class for wrapping layouts diff --git a/selfdrive/ui/sunnypilot/qt/offroad/custom_offsets_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/custom_offsets_settings.cc index 73c6e8cf1a..7327183d0f 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/custom_offsets_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/custom_offsets_settings.cc @@ -10,7 +10,7 @@ CustomOffsetsSettings::CustomOffsetsSettings(QWidget* parent) : QWidget(parent) connect(back, &QPushButton::clicked, [=]() { emit backPress(); }); main_layout->addWidget(back, 0, Qt::AlignLeft); - ListWidget *list = new ListWidget(this, false); + ListWidgetSP *list = new ListWidgetSP(this, false); // Controls: Camera Offset (cm) camera_offset = new CameraOffset(); diff --git a/selfdrive/ui/sunnypilot/qt/offroad/display_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/display_settings.cc index 2a6d44bd34..7121ba31c2 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/display_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/display_settings.cc @@ -1,6 +1,6 @@ #include "selfdrive/ui/sunnypilot/qt/offroad/display_settings.h" -DisplayPanel::DisplayPanel(QWidget *parent) : ListWidget(parent, false) { +DisplayPanel::DisplayPanel(QWidget *parent) : ListWidgetSP(parent, false) { // param, title, desc, icon std::vector> toggle_defs{ { diff --git a/selfdrive/ui/sunnypilot/qt/offroad/display_settings.h b/selfdrive/ui/sunnypilot/qt/offroad/display_settings.h index 41aac101bc..a68c58a463 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/display_settings.h +++ b/selfdrive/ui/sunnypilot/qt/offroad/display_settings.h @@ -50,7 +50,7 @@ private: Params params; }; -class DisplayPanel : public ListWidget { +class DisplayPanel : public ListWidgetSP { Q_OBJECT public: diff --git a/selfdrive/ui/sunnypilot/qt/offroad/lane_change_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/lane_change_settings.cc index 10fcf2e1c6..29be4c065c 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/lane_change_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/lane_change_settings.cc @@ -10,7 +10,7 @@ LaneChangeSettings::LaneChangeSettings(QWidget* parent) : QWidget(parent) { connect(back, &QPushButton::clicked, [=]() { emit backPress(); }); main_layout->addWidget(back, 0, Qt::AlignLeft); - ListWidget *list = new ListWidget(this, false); + ListWidgetSP *list = new ListWidgetSP(this, false); // param, title, desc, icon std::vector> toggle_defs{ { diff --git a/selfdrive/ui/sunnypilot/qt/offroad/mads_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/mads_settings.cc index 3b64fac1cf..d6dfcaa809 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/mads_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/mads_settings.cc @@ -10,7 +10,7 @@ MadsSettings::MadsSettings(QWidget* parent) : QWidget(parent) { connect(back, &QPushButton::clicked, [=]() { emit backPress(); }); main_layout->addWidget(back, 0, Qt::AlignLeft); - ListWidget *list = new ListWidget(this, false); + ListWidgetSP *list = new ListWidgetSP(this, false); // param, title, desc, icon std::vector> toggle_defs{ { diff --git a/selfdrive/ui/sunnypilot/qt/offroad/monitoring_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/monitoring_settings.cc index 6afa087eb4..6fbb0b9d7b 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/monitoring_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/monitoring_settings.cc @@ -3,7 +3,7 @@ MonitoringPanel::MonitoringPanel(QWidget *parent) : QFrame(parent) { main_layout = new QStackedLayout(this); - ListWidget *list = new ListWidget(this, false); + ListWidgetSP *list = new ListWidgetSP(this, false); // param, title, desc, icon std::vector> toggle_defs{ { diff --git a/selfdrive/ui/sunnypilot/qt/offroad/osm_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/osm_settings.cc index be3837262a..f9310e6aa7 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/osm_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/osm_settings.cc @@ -3,7 +3,7 @@ OsmPanel::OsmPanel(QWidget *parent) : QFrame(parent) { main_layout = new QStackedLayout(this); - const auto list = new ListWidget(this, false); + const auto list = new ListWidgetSP(this, false); list->addItem(mapdVersion = new LabelControl(tr("Mapd Version"), "Loading...")); list->addItem(setupOsmDeleteMapsButton(parent)); list->addItem(offlineMapsETA = new LabelControl(tr("Offline Maps ETA"), "")); diff --git a/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_control_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_control_settings.cc index e4c5b7e711..66f33348ef 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_control_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_control_settings.cc @@ -10,7 +10,7 @@ SlcSettings::SlcSettings(QWidget* parent) : QWidget(parent) { connect(back, &QPushButton::clicked, [=]() { emit backPress(); }); main_layout->addWidget(back, 0, Qt::AlignLeft); - ListWidget *list = new ListWidget(this, false); + ListWidgetSP *list = new ListWidgetSP(this, false); std::vector speed_limit_engage_texts{tr("Auto"), tr("User Confirm")}; speed_limit_engage_settings = new ButtonParamControlSP( diff --git a/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_policy_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_policy_settings.cc index bc5ec30e73..6cdcf3cdf3 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_policy_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_policy_settings.cc @@ -10,7 +10,7 @@ SpeedLimitPolicySettings::SpeedLimitPolicySettings(QWidget* parent) : QWidget(pa connect(back, &QPushButton::clicked, [=]() { emit backPress(); }); main_layout->addWidget(back, 0, Qt::AlignLeft); - ListWidget *list = new ListWidget(this, false); + ListWidgetSP *list = new ListWidgetSP(this, false); speed_limit_policy = new ButtonParamControlSP( "SpeedLimitControlPolicy", diff --git a/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_warning_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_warning_settings.cc index 71566b8368..9ef87848a4 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_warning_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/speed_limit_warning_settings.cc @@ -10,7 +10,7 @@ SpeedLimitWarningSettings::SpeedLimitWarningSettings(QWidget* parent) : QWidget( connect(back, &QPushButton::clicked, [=]() { emit backPress(); }); main_layout->addWidget(back, 0, Qt::AlignLeft); - ListWidget *list = new ListWidget(this, false); + ListWidgetSP *list = new ListWidgetSP(this, false); std::vector speed_limit_warning_texts{tr("Off"), tr("Display"), tr("Chime")}; speed_limit_warning_settings = new ButtonParamControlSP( diff --git a/selfdrive/ui/sunnypilot/qt/offroad/sunnylink_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/sunnylink_settings.cc index 3f00c92c37..67f18c6a21 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/sunnylink_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/sunnylink_settings.cc @@ -16,7 +16,7 @@ SunnylinkPanel::SunnylinkPanel(QWidget* parent) : QFrame(parent) { connect(uiState(), &UIState::sunnylinkRolesChanged, this, &SunnylinkPanel::updateLabels); connect(uiState(), &UIState::sunnylinkDeviceUsersChanged, this, &SunnylinkPanel::updateLabels); - auto list = new ListWidget(this, false); + auto list = new ListWidgetSP(this, false); sunnylinkEnabledBtn = new ParamControlSP( "SunnylinkEnabled", tr("Enable sunnylink"), diff --git a/selfdrive/ui/sunnypilot/qt/offroad/sunnypilot_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/sunnypilot_settings.cc index ef7c26f8db..99af0f0d27 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/sunnypilot_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/sunnypilot_settings.cc @@ -3,7 +3,7 @@ SunnypilotPanel::SunnypilotPanel(QWidget *parent) : QFrame(parent) { main_layout = new QStackedLayout(this); - ListWidget *list = new ListWidget(this, false); + ListWidgetSP *list = new ListWidgetSP(this, false); // param, title, desc, icon std::vector> toggle_defs{ { diff --git a/selfdrive/ui/sunnypilot/qt/offroad/vehicle_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/vehicle_settings.cc index 00a9dc4b26..5bbdf843c5 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/vehicle_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/vehicle_settings.cc @@ -67,7 +67,7 @@ void VehiclePanel::updateToggles() { setCarBtn->setText(((set == "=== Not Selected ===") || (set.length() == 0)) ? prompt_select : set); } -SPVehiclesTogglesPanel::SPVehiclesTogglesPanel(VehiclePanel *parent) : ListWidget(parent, false) { +SPVehiclesTogglesPanel::SPVehiclesTogglesPanel(VehiclePanel *parent) : ListWidgetSP(parent, false) { setSpacing(50); // Hyundai/Kia/Genesis diff --git a/selfdrive/ui/sunnypilot/qt/offroad/vehicle_settings.h b/selfdrive/ui/sunnypilot/qt/offroad/vehicle_settings.h index a154d6df97..1e31636d73 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/vehicle_settings.h +++ b/selfdrive/ui/sunnypilot/qt/offroad/vehicle_settings.h @@ -31,7 +31,7 @@ private: QString prompt_select = tr("Select your car"); }; -class SPVehiclesTogglesPanel : public ListWidget { +class SPVehiclesTogglesPanel : public ListWidgetSP { Q_OBJECT public: explicit SPVehiclesTogglesPanel(VehiclePanel *parent); diff --git a/selfdrive/ui/sunnypilot/qt/offroad/visuals_settings.cc b/selfdrive/ui/sunnypilot/qt/offroad/visuals_settings.cc index 3ccd7e148f..d96f4d8ec2 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/visuals_settings.cc +++ b/selfdrive/ui/sunnypilot/qt/offroad/visuals_settings.cc @@ -1,6 +1,6 @@ #include "selfdrive/ui/sunnypilot/qt/offroad/visuals_settings.h" -VisualsPanel::VisualsPanel(QWidget *parent) : ListWidget(parent) { +VisualsPanel::VisualsPanel(QWidget *parent) : ListWidgetSP(parent) { // param, title, desc, icon std::vector> toggle_defs{ { diff --git a/selfdrive/ui/sunnypilot/qt/offroad/visuals_settings.h b/selfdrive/ui/sunnypilot/qt/offroad/visuals_settings.h index 5b20af11da..244bc09b7e 100644 --- a/selfdrive/ui/sunnypilot/qt/offroad/visuals_settings.h +++ b/selfdrive/ui/sunnypilot/qt/offroad/visuals_settings.h @@ -3,7 +3,7 @@ #include "selfdrive/ui/ui.h" #include "selfdrive/ui/sunnypilot/qt/widgets/sp_priv_controls.h" -class VisualsPanel : public ListWidget { +class VisualsPanel : public ListWidgetSP { Q_OBJECT public: diff --git a/selfdrive/ui/sunnypilot/qt/sp_priv_util.h b/selfdrive/ui/sunnypilot/qt/sp_priv_util.h index c6e74dba82..3bc4bb7f65 100644 --- a/selfdrive/ui/sunnypilot/qt/sp_priv_util.h +++ b/selfdrive/ui/sunnypilot/qt/sp_priv_util.h @@ -22,3 +22,25 @@ #define BUTTON_CONTROL_FUNCTION_1 \ inline void click() { btn.click(); } \ + +// ListWidget +#define LIST_WIDGET_FUNCTION_1 \ + inline void AddWidgetAt(const int index, QWidget *new_widget) { inner_layout.insertWidget(index, new_widget); } \ + +#define LIST_WIDGET_FUNCTION_2 \ + inline void RemoveWidgetAt(const int index) { \ + if (QLayoutItem* item; (item = inner_layout.takeAt(index)) != nullptr) { \ + if(item->widget()) delete item->widget(); \ + delete item; \ + } \ + } \ + +#define LIST_WIDGET_FUCNTION_3 \ + inline void ReplaceOrAddWidget(QWidget *old_widget, QWidget *new_widget) { \ + if (const int index = inner_layout.indexOf(old_widget); index != -1) { \ + RemoveWidgetAt(index); \ + AddWidgetAt(index, new_widget); \ + } else { \ + addItem(new_widget); \ + } \ + } \ diff --git a/selfdrive/ui/sunnypilot/qt/widgets/sp_priv_controls.h b/selfdrive/ui/sunnypilot/qt/widgets/sp_priv_controls.h index b65bbca962..4d3baf8b3f 100644 --- a/selfdrive/ui/sunnypilot/qt/widgets/sp_priv_controls.h +++ b/selfdrive/ui/sunnypilot/qt/widgets/sp_priv_controls.h @@ -183,6 +183,30 @@ private: bool button_group_enabled = true; }; +class ListWidgetSP : public ListWidget { + Q_OBJECT + +public: + explicit ListWidgetSP(QWidget *parent = 0, const bool split_line = true) : ListWidget(parent), _split_line(split_line) { + } + +private: + void paintEvent(QPaintEvent *) override { + QPainter p(this); + p.setPen(Qt::gray); + for (int i = 0; i < inner_layout.count() - 1; ++i) { + QWidget *widget = inner_layout.itemAt(i)->widget(); + if ((widget == nullptr || widget->isVisible()) && _split_line) { + QRect r = inner_layout.itemAt(i)->geometry(); + int bottom = r.bottom() + inner_layout.spacing() / 2; + p.drawLine(r.left() + 40, bottom, r.right() - 40, bottom); + } + } + } + + bool _split_line = false; +}; + class OptionControlSP : public AbstractControlSP { Q_OBJECT