diff --git a/selfdrive/ui/sunnypilot/qt/widgets/controls.h b/selfdrive/ui/sunnypilot/qt/widgets/controls.h index 0565690b20..21c317eac6 100644 --- a/selfdrive/ui/sunnypilot/qt/widgets/controls.h +++ b/selfdrive/ui/sunnypilot/qt/widgets/controls.h @@ -219,7 +219,7 @@ class ButtonParamControlSP : public AbstractControlSP_SELECTOR { public: ButtonParamControlSP(const QString ¶m, const QString &title, const QString &desc, const QString &icon, - const std::vector &button_texts, const int minimum_button_width = 300) : AbstractControlSP_SELECTOR(title, desc, icon), button_texts(button_texts) { + const std::vector &button_texts, const int minimum_button_width = 300, const bool inline_layout = false) : AbstractControlSP_SELECTOR(title, desc, icon), button_texts(button_texts), is_inline_layout(inline_layout) { const QString style = R"( QPushButton { border-radius: 20px; @@ -246,6 +246,19 @@ public: key = param.toStdString(); int value = atoi(params.get(key).c_str()); + if (inline_layout) { + button_param_layout->setMargin(0); + button_param_layout->setSpacing(0); + if (!title.isEmpty()) { + main_layout->removeWidget(title_label); + hlayout->addWidget(title_label, 1); + } + if (spacingItem != nullptr && main_layout->indexOf(spacingItem) != -1) { + main_layout->removeItem(spacingItem); + spacingItem = nullptr; + } + } + button_group = new QButtonGroup(this); button_group->setExclusive(true); for (int i = 0; i < button_texts.size(); i++) { @@ -254,12 +267,18 @@ public: button->setChecked(i == value); button->setStyleSheet(style); button->setMinimumWidth(minimum_button_width); - if (i == 0) hlayout->addSpacing(2); - hlayout->addWidget(button); + if (i == 0) button_param_layout->addSpacing(2); + button_param_layout->addWidget(button); button_group->addButton(button, i); } - hlayout->setAlignment(Qt::AlignLeft); + button_param_layout->setAlignment(Qt::AlignLeft); + if (is_inline_layout) { + QFrame *container = new QFrame; + container->setLayout(button_param_layout); + container->setStyleSheet("background-color: #393939; border-radius: 20px;"); + hlayout->addWidget(container); + } QObject::connect(button_group, QOverload::of(&QButtonGroup::buttonClicked), [=](int id) { params.put(key, std::to_string(id)); @@ -314,6 +333,10 @@ public: protected: void paintEvent(QPaintEvent *event) override { + if (is_inline_layout) { + return; + } + QPainter p(this); p.setRenderHint(QPainter::Antialiasing); @@ -348,6 +371,8 @@ private: std::vector button_texts; bool button_group_enabled = true; + bool is_inline_layout; + QHBoxLayout *button_param_layout = is_inline_layout ? new QHBoxLayout() : hlayout; }; class ListWidgetSP : public QWidget { @@ -416,8 +441,8 @@ class OptionControlSP : public AbstractControlSP_SELECTOR { Q_OBJECT private: - bool isInlineLayout; - QHBoxLayout *optionSelectorLayout = isInlineLayout ? new QHBoxLayout() : hlayout; + bool is_inline_layout; + QHBoxLayout *optionSelectorLayout = is_inline_layout ? new QHBoxLayout() : hlayout; struct MinMaxValue { int min_value; @@ -438,7 +463,7 @@ private: public: OptionControlSP(const QString ¶m, const QString &title, const QString &desc, const QString &icon, - const MinMaxValue &range, const int per_value_change = 1, const bool inline_layout = false, const QMap *valMap = nullptr) : AbstractControlSP_SELECTOR(title, desc, icon, nullptr), _title(title), valueMap(valMap), isInlineLayout(inline_layout) { + const MinMaxValue &range, const int per_value_change = 1, const bool inline_layout = false, const QMap *valMap = nullptr) : AbstractControlSP_SELECTOR(title, desc, icon, nullptr), _title(title), valueMap(valMap), is_inline_layout(inline_layout) { const QString style = R"( QPushButton { border-radius: 20px; @@ -513,7 +538,7 @@ public: } optionSelectorLayout->setAlignment(Qt::AlignLeft); - if (isInlineLayout) { + if (is_inline_layout) { QFrame *container = new QFrame; container->setLayout(optionSelectorLayout); container->setStyleSheet("background-color: #393939; border-radius: 20px;"); @@ -540,7 +565,7 @@ public: protected: void paintEvent(QPaintEvent *event) override { - if (isInlineLayout) { + if (is_inline_layout) { return; }