ListWidget - ListWidgetSP

This commit is contained in:
Jason Wen
2024-07-14 00:08:34 -04:00
parent 7a1ff6cd01
commit ed862f012b
20 changed files with 77 additions and 36 deletions
+4
View File
@@ -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"
+11 -20
View File
@@ -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
@@ -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();
@@ -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<std::tuple<QString, QString, QString, QString>> toggle_defs{
{
@@ -50,7 +50,7 @@ private:
Params params;
};
class DisplayPanel : public ListWidget {
class DisplayPanel : public ListWidgetSP {
Q_OBJECT
public:
@@ -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<std::tuple<QString, QString, QString, QString>> toggle_defs{
{
@@ -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<std::tuple<QString, QString, QString, QString>> toggle_defs{
{
@@ -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<std::tuple<QString, QString, QString, QString>> toggle_defs{
{
@@ -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"), ""));
@@ -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<QString> speed_limit_engage_texts{tr("Auto"), tr("User Confirm")};
speed_limit_engage_settings = new ButtonParamControlSP(
@@ -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",
@@ -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<QString> speed_limit_warning_texts{tr("Off"), tr("Display"), tr("Chime")};
speed_limit_warning_settings = new ButtonParamControlSP(
@@ -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"),
@@ -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<std::tuple<QString, QString, QString, QString>> toggle_defs{
{
@@ -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
@@ -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);
@@ -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<std::tuple<QString, QString, QString, QString>> toggle_defs{
{
@@ -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:
+22
View File
@@ -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); \
} \
} \
@@ -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