Sidebar: update text and color in one place (#20777)

* do not set text&color in ctor

* cleanup

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
albatross
Dean Lee 2021-05-05 02:30:50 +08:00 committed by GitHub
parent 27d3f820bf
commit c405442820
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 69 additions and 62 deletions

View File

@ -2,35 +2,37 @@
#include "sidebar.h" #include "sidebar.h"
#include "qt_window.h" #include "qt_window.h"
StatusWidget::StatusWidget(QString label, QString msg, QColor c, QWidget* parent) : QFrame(parent) { StatusWidget::StatusWidget(bool has_substatus, QWidget *parent) : QFrame(parent) {
layout.setSpacing(0); layout = new QVBoxLayout();
layout->setSpacing(0);
if(msg.length() > 0){ status = new QLabel(this);
layout.setContentsMargins(50, 24, 16, 24);
status.setAlignment(Qt::AlignLeft | Qt::AlignHCenter);
status.setStyleSheet(R"(font-size: 65px; font-weight: 500;)");
substatus.setAlignment(Qt::AlignLeft | Qt::AlignHCenter); if (has_substatus) {
substatus.setStyleSheet(R"(font-size: 30px; font-weight: 400;)"); 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); substatus = new QLabel(this);
layout.addWidget(&substatus, 0, Qt::AlignLeft); 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 { } else {
layout.setContentsMargins(40, 24, 16, 24); layout->setContentsMargins(40, 24, 16, 24);
status.setAlignment(Qt::AlignCenter); status->setAlignment(Qt::AlignCenter);
status.setStyleSheet(R"(font-size: 38px; font-weight: 500;)"); status->setStyleSheet(R"(font-size: 38px; font-weight: 500;)");
layout.addWidget(&status, 0, Qt::AlignCenter); layout->addWidget(status, 0, Qt::AlignCenter);
} }
update(label, msg, c);
setMinimumHeight(124); setMinimumHeight(124);
setStyleSheet("background-color: transparent;"); setStyleSheet("background-color: transparent;");
setLayout(&layout); setLayout(layout);
} }
void StatusWidget::paintEvent(QPaintEvent *e){ void StatusWidget::paintEvent(QPaintEvent *e) {
QPainter p(this); QPainter p(this);
p.setRenderHint(QPainter::Antialiasing, true); p.setRenderHint(QPainter::Antialiasing, true);
p.setPen(QPen(QColor(0xb2b2b2), 3, Qt::SolidLine, Qt::FlatCap)); 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); p.drawRoundedRect(QRectF(6, 6, size().width()-12, size().height()-12), 25, 25);
} }
void StatusWidget::update(QString label, QString msg, QColor c) { void StatusWidget::update(const QString &label, const QColor &c, const QString &msg) {
status.setText(label); status->setText(label);
substatus.setText(msg); if (substatus != nullptr) {
substatus->setText(msg);
}
if (color != c) { if (color != c) {
color = c; color = c;
repaint(); repaint();
@ -54,26 +57,27 @@ void StatusWidget::update(QString label, QString msg, QColor c) {
return; return;
} }
SignalWidget::SignalWidget(QString text, int strength, QWidget* parent) : QFrame(parent), _strength(strength) { SignalWidget::SignalWidget(QWidget *parent) : QFrame(parent), _strength(0) {
layout.setMargin(0); layout = new QVBoxLayout();
layout.setSpacing(0); layout->setMargin(0);
layout.insertSpacing(0, 45); layout->setSpacing(0);
layout->insertSpacing(0, 45);
label.setText(text); label = new QLabel(this);
layout.addWidget(&label, 0, Qt::AlignLeft); label->setStyleSheet(R"(font-size: 35px; font-weight: 400;)");
label.setStyleSheet(R"(font-size: 35px; font-weight: 400;)"); layout->addWidget(label, 0, Qt::AlignLeft);
setFixedWidth(177); setFixedWidth(177);
setLayout(&layout); setLayout(layout);
} }
void SignalWidget::paintEvent(QPaintEvent *e){ void SignalWidget::paintEvent(QPaintEvent *e) {
QPainter p(this); QPainter p(this);
p.setRenderHint(QPainter::Antialiasing, true); p.setRenderHint(QPainter::Antialiasing, true);
p.setPen(Qt::NoPen); p.setPen(Qt::NoPen);
p.setBrush(Qt::white); p.setBrush(Qt::white);
for (int i = 0; i < 5 ; i++){ for (int i = 0; i < 5; i++) {
if(i == _strength){ if (i == _strength) {
p.setPen(Qt::NoPen); p.setPen(Qt::NoPen);
p.setBrush(Qt::darkGray); p.setBrush(Qt::darkGray);
} }
@ -81,13 +85,16 @@ void SignalWidget::paintEvent(QPaintEvent *e){
} }
} }
void SignalWidget::update(QString text, int strength){ void SignalWidget::update(const QString &text, int strength) {
label.setText(text); label->setText(text);
_strength = strength; if (_strength != strength) {
_strength = strength;
repaint();
}
} }
Sidebar::Sidebar(QWidget* parent) : QFrame(parent) { Sidebar::Sidebar(QWidget *parent) : QFrame(parent) {
QVBoxLayout* layout = new QVBoxLayout(); QVBoxLayout *layout = new QVBoxLayout();
layout->setContentsMargins(25, 50, 25, 50); layout->setContentsMargins(25, 50, 25, 50);
layout->setSpacing(35); layout->setSpacing(35);
setFixedSize(300, vwp_h); setFixedSize(300, vwp_h);
@ -100,16 +107,16 @@ Sidebar::Sidebar(QWidget* parent) : QFrame(parent) {
layout->addWidget(s_btn, 0, Qt::AlignHCenter); layout->addWidget(s_btn, 0, Qt::AlignHCenter);
QObject::connect(s_btn, &QPushButton::pressed, this, &Sidebar::openSettings); 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); 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); 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); 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); layout->addWidget(connect, 0, Qt::AlignTop);
QImage image = QImageReader("../assets/images/button_home.png").read(); QImage image = QImageReader("../assets/images/button_home.png").read();
@ -131,22 +138,22 @@ Sidebar::Sidebar(QWidget* parent) : QFrame(parent) {
setLayout(layout); setLayout(layout);
} }
void Sidebar::update(const UIState &s){ void Sidebar::update(const UIState &s) {
static std::map<NetStatus, std::pair<QString, QColor>> connectivity_map = { static std::map<NetStatus, std::pair<QString, QColor>> connectivity_map = {
{NET_ERROR, {"CONNECT\nERROR", COLOR_DANGER}}, {NET_ERROR, {"CONNECT\nERROR", COLOR_DANGER}},
{NET_CONNECTED, {"CONNECT\nONLINE", COLOR_GOOD}}, {NET_CONNECTED, {"CONNECT\nONLINE", COLOR_GOOD}},
{NET_DISCONNECTED, {"CONNECT\nOFFLINE", COLOR_WARNING}}, {NET_DISCONNECTED, {"CONNECT\nOFFLINE", COLOR_WARNING}},
}; };
auto net_params = connectivity_map[s.scene.athenaStatus]; 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<cereal::DeviceState::ThermalStatus, QColor> temp_severity_map = { static std::map<cereal::DeviceState::ThermalStatus, QColor> temp_severity_map = {
{cereal::DeviceState::ThermalStatus::GREEN, COLOR_GOOD}, {cereal::DeviceState::ThermalStatus::GREEN, COLOR_GOOD},
{cereal::DeviceState::ThermalStatus::YELLOW, COLOR_WARNING}, {cereal::DeviceState::ThermalStatus::YELLOW, COLOR_WARNING},
{cereal::DeviceState::ThermalStatus::RED, COLOR_DANGER}, {cereal::DeviceState::ThermalStatus::RED, COLOR_DANGER},
{cereal::DeviceState::ThermalStatus::DANGER, COLOR_DANGER}}; {cereal::DeviceState::ThermalStatus::DANGER, COLOR_DANGER}};
QString temp_val = QString("%1 °C").arg((int)s.scene.deviceState.getAmbientTempC()); 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<cereal::DeviceState::NetworkType, const char *> network_type_map = { static std::map<cereal::DeviceState::NetworkType, const char *> network_type_map = {
{cereal::DeviceState::NetworkType::NONE, "--"}, {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); panda_message = QString("SAT CNT\n%1").arg(s.scene.satelliteCount);
} }
#endif #endif
panda->update(panda_message, "", panda_color); panda->update(panda_message, panda_color);
} }

View File

@ -12,16 +12,16 @@ class SignalWidget : public QFrame {
Q_OBJECT Q_OBJECT
public: public:
SignalWidget(QString text, int strength, QWidget* parent = 0); SignalWidget(QWidget* parent = 0);
void update(QString text, int strength); void update(const QString &text, int strength);
QLabel label; QLabel *label;
int _strength = 0; int _strength = 0;
protected: protected:
void paintEvent(QPaintEvent*) override; void paintEvent(QPaintEvent*) override;
private: private:
QVBoxLayout layout; QVBoxLayout *layout;
const float _dotspace = 37; // spacing between dots const float _dotspace = 37; // spacing between dots
const float _top = 10; const float _top = 10;
@ -32,17 +32,17 @@ class StatusWidget : public QFrame {
Q_OBJECT Q_OBJECT
public: public:
StatusWidget(QString label, QString msg, QColor c, QWidget* parent = 0); StatusWidget(bool has_substatus, QWidget* parent = 0);
void update(QString label, QString msg, QColor c); void update(const QString &label, const QColor &c, const QString &msg = "");
protected: protected:
void paintEvent(QPaintEvent*) override; void paintEvent(QPaintEvent*) override;
private: private:
QLabel *status;
QLabel *substatus = nullptr;
QColor color = COLOR_WARNING; QColor color = COLOR_WARNING;
QLabel status; QVBoxLayout *layout;
QLabel substatus;
QVBoxLayout layout;
}; };
class Sidebar : public QFrame { class Sidebar : public QFrame {