MUI should be a status bar (#23287)

pull/23326/head
Robbe Derks 2022-01-04 12:15:18 +01:00 committed by GitHub
parent f2c17bbcde
commit a1e201ef5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 91 additions and 4 deletions

View File

@ -1,11 +1,83 @@
#include <QApplication>
#include <QtWidgets>
#include <QTimer>
#include <QGraphicsScene>
#include "cereal/messaging/messaging.h"
#include "selfdrive/ui/ui.h"
#include "selfdrive/ui/qt/qt_window.h"
class StatusBar : public QGraphicsRectItem {
private:
QLinearGradient linear_gradient;
QRadialGradient radial_gradient;
QTimer animation_timer;
const int animation_length = 10;
int animation_index = 0;
public:
StatusBar(double x, double y, double width, double height) : QGraphicsRectItem {x, y, width, height} {
linear_gradient = QLinearGradient(0, 0, 0, height/2);
linear_gradient.setSpread(QGradient::ReflectSpread);
radial_gradient = QRadialGradient(width/2, height/2, width/8);
QObject::connect(&animation_timer, &QTimer::timeout, [=]() {
animation_index++;
animation_index %= animation_length;
});
animation_timer.start(50);
}
void solidColor(QColor color) {
QColor dark_color = QColor(color);
dark_color.setAlphaF(0.5);
linear_gradient.setColorAt(0, dark_color);
linear_gradient.setColorAt(1, color);
setBrush(QBrush(linear_gradient));
}
// these need to be called continuously for the animations to work.
// can probably clean that up with some more abstractions
void blinkingColor(QColor color) {
QColor dark_color = QColor(color);
dark_color.setAlphaF(0.1);
int radius = (rect().width() / animation_length) * animation_index;
QPoint center = QPoint(rect().width()/2, rect().height()/2);
radial_gradient.setCenter(center);
radial_gradient.setFocalPoint(center);
radial_gradient.setRadius(radius);
radial_gradient.setColorAt(1, dark_color);
radial_gradient.setColorAt(0, color);
setBrush(QBrush(radial_gradient));
}
void laneChange(cereal::LateralPlan::LaneChangeDirection direction) {
QColor dark_color = QColor(bg_colors[STATUS_ENGAGED]);
dark_color.setAlphaF(0.1);
int x = (rect().width() / animation_length) * animation_index;
QPoint center = QPoint(((direction == cereal::LateralPlan::LaneChangeDirection::RIGHT) ? x : (rect().width() - x)), rect().height()/2);
radial_gradient.setCenter(center);
radial_gradient.setFocalPoint(center);
radial_gradient.setRadius(rect().width()/5);
radial_gradient.setColorAt(1, dark_color);
radial_gradient.setColorAt(0, bg_colors[STATUS_ENGAGED]);
setBrush(QBrush(radial_gradient));
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override {
painter->setPen(QPen());
painter->setBrush(brush());
double rounding_radius = rect().height()/2;
painter->drawRoundedRect(rect(), rounding_radius, rounding_radius);
}
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget w;
@ -15,12 +87,18 @@ int main(int argc, char *argv[]) {
// our beautiful UI
QVBoxLayout *layout = new QVBoxLayout(&w);
QLabel *label = new QLabel("");
layout->addWidget(label, 0, Qt::AlignCenter);
QGraphicsScene *scene = new QGraphicsScene();
StatusBar *status_bar = new StatusBar(0, 0, 1000, 50);
scene->addItem(status_bar);
QGraphicsView *graphics_view = new QGraphicsView(scene);
layout->insertSpacing(0, 400);
layout->addWidget(graphics_view, 0, Qt::AlignCenter);
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [=]() {
static SubMaster sm({"deviceState", "controlsState"});
static SubMaster sm({"deviceState", "controlsState", "lateralPlan"});
bool onroad_prev = sm.allAliveAndValid({"deviceState"}) &&
sm["deviceState"].getDeviceState().getStarted();
@ -37,7 +115,16 @@ int main(int argc, char *argv[]) {
} else if (cs.getAlertStatus() == cereal::ControlsState::AlertStatus::CRITICAL) {
status = STATUS_ALERT;
}
label->setStyleSheet(QString("color: %1; font-size: 250px;").arg(bg_colors[status].name()));
auto lp = sm["lateralPlan"].getLateralPlan();
if (lp.getLaneChangeState() == cereal::LateralPlan::LaneChangeState::PRE_LANE_CHANGE || status == STATUS_ALERT) {
status_bar->blinkingColor(bg_colors[status]);
} else if (lp.getLaneChangeState() == cereal::LateralPlan::LaneChangeState::LANE_CHANGE_STARTING ||
lp.getLaneChangeState() == cereal::LateralPlan::LaneChangeState::LANE_CHANGE_FINISHING) {
status_bar->laneChange(lp.getLaneChangeDirection());
} else {
status_bar->solidColor(bg_colors[status]);
}
}
if ((onroad != onroad_prev) || sm.frame < 2) {