From c4054428207c60fe2e96103554692ac7f7dcf968 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 5 May 2021 02:30:50 +0800 Subject: [PATCH] Sidebar: update text and color in one place (#20777) * do not set text&color in ctor * cleanup Co-authored-by: Adeeb Shihadeh --- selfdrive/ui/qt/sidebar.cc | 113 ++++++++++++++++++++----------------- selfdrive/ui/qt/sidebar.h | 18 +++--- 2 files changed, 69 insertions(+), 62 deletions(-) diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc index e024d8cf..f6ae501c 100644 --- a/selfdrive/ui/qt/sidebar.cc +++ b/selfdrive/ui/qt/sidebar.cc @@ -2,35 +2,37 @@ #include "sidebar.h" #include "qt_window.h" -StatusWidget::StatusWidget(QString label, QString msg, QColor c, QWidget* parent) : QFrame(parent) { - layout.setSpacing(0); +StatusWidget::StatusWidget(bool has_substatus, QWidget *parent) : QFrame(parent) { + layout = new QVBoxLayout(); + layout->setSpacing(0); - if(msg.length() > 0){ - layout.setContentsMargins(50, 24, 16, 24); - status.setAlignment(Qt::AlignLeft | Qt::AlignHCenter); - status.setStyleSheet(R"(font-size: 65px; font-weight: 500;)"); + status = new QLabel(this); - substatus.setAlignment(Qt::AlignLeft | Qt::AlignHCenter); - substatus.setStyleSheet(R"(font-size: 30px; font-weight: 400;)"); + if (has_substatus) { + layout->setContentsMargins(50, 24, 16, 24); + status->setAlignment(Qt::AlignLeft | Qt::AlignHCenter); + status->setStyleSheet(R"(font-size: 65px; font-weight: 500;)"); - layout.addWidget(&status, 0, Qt::AlignLeft); - layout.addWidget(&substatus, 0, Qt::AlignLeft); + substatus = new QLabel(this); + substatus->setAlignment(Qt::AlignLeft | Qt::AlignHCenter); + substatus->setStyleSheet(R"(font-size: 30px; font-weight: 400;)"); + + layout->addWidget(status, 0, Qt::AlignLeft); + layout->addWidget(substatus, 0, Qt::AlignLeft); } else { - layout.setContentsMargins(40, 24, 16, 24); + layout->setContentsMargins(40, 24, 16, 24); - status.setAlignment(Qt::AlignCenter); - status.setStyleSheet(R"(font-size: 38px; font-weight: 500;)"); - layout.addWidget(&status, 0, Qt::AlignCenter); + status->setAlignment(Qt::AlignCenter); + status->setStyleSheet(R"(font-size: 38px; font-weight: 500;)"); + layout->addWidget(status, 0, Qt::AlignCenter); } - update(label, msg, c); - setMinimumHeight(124); setStyleSheet("background-color: transparent;"); - setLayout(&layout); + setLayout(layout); } -void StatusWidget::paintEvent(QPaintEvent *e){ +void StatusWidget::paintEvent(QPaintEvent *e) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing, true); p.setPen(QPen(QColor(0xb2b2b2), 3, Qt::SolidLine, Qt::FlatCap)); @@ -43,10 +45,11 @@ void StatusWidget::paintEvent(QPaintEvent *e){ p.drawRoundedRect(QRectF(6, 6, size().width()-12, size().height()-12), 25, 25); } -void StatusWidget::update(QString label, QString msg, QColor c) { - status.setText(label); - substatus.setText(msg); - +void StatusWidget::update(const QString &label, const QColor &c, const QString &msg) { + status->setText(label); + if (substatus != nullptr) { + substatus->setText(msg); + } if (color != c) { color = c; repaint(); @@ -54,26 +57,27 @@ void StatusWidget::update(QString label, QString msg, QColor c) { return; } -SignalWidget::SignalWidget(QString text, int strength, QWidget* parent) : QFrame(parent), _strength(strength) { - layout.setMargin(0); - layout.setSpacing(0); - layout.insertSpacing(0, 45); +SignalWidget::SignalWidget(QWidget *parent) : QFrame(parent), _strength(0) { + layout = new QVBoxLayout(); + layout->setMargin(0); + layout->setSpacing(0); + layout->insertSpacing(0, 45); - label.setText(text); - layout.addWidget(&label, 0, Qt::AlignLeft); - label.setStyleSheet(R"(font-size: 35px; font-weight: 400;)"); + label = new QLabel(this); + label->setStyleSheet(R"(font-size: 35px; font-weight: 400;)"); + layout->addWidget(label, 0, Qt::AlignLeft); setFixedWidth(177); - setLayout(&layout); + setLayout(layout); } -void SignalWidget::paintEvent(QPaintEvent *e){ +void SignalWidget::paintEvent(QPaintEvent *e) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing, true); p.setPen(Qt::NoPen); p.setBrush(Qt::white); - for (int i = 0; i < 5 ; i++){ - if(i == _strength){ + for (int i = 0; i < 5; i++) { + if (i == _strength) { p.setPen(Qt::NoPen); p.setBrush(Qt::darkGray); } @@ -81,13 +85,16 @@ void SignalWidget::paintEvent(QPaintEvent *e){ } } -void SignalWidget::update(QString text, int strength){ - label.setText(text); - _strength = strength; +void SignalWidget::update(const QString &text, int strength) { + label->setText(text); + if (_strength != strength) { + _strength = strength; + repaint(); + } } -Sidebar::Sidebar(QWidget* parent) : QFrame(parent) { - QVBoxLayout* layout = new QVBoxLayout(); +Sidebar::Sidebar(QWidget *parent) : QFrame(parent) { + QVBoxLayout *layout = new QVBoxLayout(); layout->setContentsMargins(25, 50, 25, 50); layout->setSpacing(35); setFixedSize(300, vwp_h); @@ -100,16 +107,16 @@ Sidebar::Sidebar(QWidget* parent) : QFrame(parent) { layout->addWidget(s_btn, 0, Qt::AlignHCenter); QObject::connect(s_btn, &QPushButton::pressed, this, &Sidebar::openSettings); - signal = new SignalWidget("--", 0, this); + signal = new SignalWidget(this); layout->addWidget(signal, 0, Qt::AlignTop | Qt::AlignHCenter); - temp = new StatusWidget("0°C", "TEMP", QColor(255, 255, 255), this); + temp = new StatusWidget(true, this); layout->addWidget(temp, 0, Qt::AlignTop); - panda = new StatusWidget("NO\nPANDA", "", QColor(201, 34, 49), this); + panda = new StatusWidget(false, this); layout->addWidget(panda, 0, Qt::AlignTop); - connect = new StatusWidget("CONNECT\nOFFLINE", "", QColor(218, 202, 37), this); + connect = new StatusWidget(false, this); layout->addWidget(connect, 0, Qt::AlignTop); QImage image = QImageReader("../assets/images/button_home.png").read(); @@ -131,22 +138,22 @@ Sidebar::Sidebar(QWidget* parent) : QFrame(parent) { setLayout(layout); } -void Sidebar::update(const UIState &s){ +void Sidebar::update(const UIState &s) { static std::map> connectivity_map = { - {NET_ERROR, {"CONNECT\nERROR", COLOR_DANGER}}, - {NET_CONNECTED, {"CONNECT\nONLINE", COLOR_GOOD}}, - {NET_DISCONNECTED, {"CONNECT\nOFFLINE", COLOR_WARNING}}, + {NET_ERROR, {"CONNECT\nERROR", COLOR_DANGER}}, + {NET_CONNECTED, {"CONNECT\nONLINE", COLOR_GOOD}}, + {NET_DISCONNECTED, {"CONNECT\nOFFLINE", COLOR_WARNING}}, }; auto net_params = connectivity_map[s.scene.athenaStatus]; - connect->update(net_params.first, "", net_params.second); + connect->update(net_params.first, net_params.second); static std::map temp_severity_map = { - {cereal::DeviceState::ThermalStatus::GREEN, COLOR_GOOD}, - {cereal::DeviceState::ThermalStatus::YELLOW, COLOR_WARNING}, - {cereal::DeviceState::ThermalStatus::RED, COLOR_DANGER}, - {cereal::DeviceState::ThermalStatus::DANGER, COLOR_DANGER}}; + {cereal::DeviceState::ThermalStatus::GREEN, COLOR_GOOD}, + {cereal::DeviceState::ThermalStatus::YELLOW, COLOR_WARNING}, + {cereal::DeviceState::ThermalStatus::RED, COLOR_DANGER}, + {cereal::DeviceState::ThermalStatus::DANGER, COLOR_DANGER}}; QString temp_val = QString("%1 °C").arg((int)s.scene.deviceState.getAmbientTempC()); - temp->update(temp_val, "TEMP", temp_severity_map[s.scene.deviceState.getThermalStatus()]); + temp->update(temp_val, temp_severity_map[s.scene.deviceState.getThermalStatus()], "TEMP"); static std::map network_type_map = { {cereal::DeviceState::NetworkType::NONE, "--"}, @@ -177,5 +184,5 @@ void Sidebar::update(const UIState &s){ panda_message = QString("SAT CNT\n%1").arg(s.scene.satelliteCount); } #endif - panda->update(panda_message, "", panda_color); + panda->update(panda_message, panda_color); } diff --git a/selfdrive/ui/qt/sidebar.h b/selfdrive/ui/qt/sidebar.h index 982f7515..7ef34de2 100644 --- a/selfdrive/ui/qt/sidebar.h +++ b/selfdrive/ui/qt/sidebar.h @@ -12,16 +12,16 @@ class SignalWidget : public QFrame { Q_OBJECT public: - SignalWidget(QString text, int strength, QWidget* parent = 0); - void update(QString text, int strength); - QLabel label; + SignalWidget(QWidget* parent = 0); + void update(const QString &text, int strength); + QLabel *label; int _strength = 0; protected: void paintEvent(QPaintEvent*) override; private: - QVBoxLayout layout; + QVBoxLayout *layout; const float _dotspace = 37; // spacing between dots const float _top = 10; @@ -32,17 +32,17 @@ class StatusWidget : public QFrame { Q_OBJECT public: - StatusWidget(QString label, QString msg, QColor c, QWidget* parent = 0); - void update(QString label, QString msg, QColor c); + StatusWidget(bool has_substatus, QWidget* parent = 0); + void update(const QString &label, const QColor &c, const QString &msg = ""); protected: void paintEvent(QPaintEvent*) override; private: + QLabel *status; + QLabel *substatus = nullptr; QColor color = COLOR_WARNING; - QLabel status; - QLabel substatus; - QVBoxLayout layout; + QVBoxLayout *layout; }; class Sidebar : public QFrame {