|
|
|
@ -4,33 +4,81 @@ |
|
|
|
|
#include <algorithm> |
|
|
|
|
|
|
|
|
|
#include <QPainter> |
|
|
|
|
#include <QStackedLayout> |
|
|
|
|
|
|
|
|
|
BodyWindow::BodyWindow(QWidget *parent) : fuel_filter(1.0, 5., 1. / UI_FREQ), QLabel(parent) { |
|
|
|
|
#include "selfdrive/common/params.h" |
|
|
|
|
|
|
|
|
|
RecordButton::RecordButton(QWidget *parent) : QPushButton(parent) { |
|
|
|
|
setCheckable(true); |
|
|
|
|
setChecked(false); |
|
|
|
|
setFixedSize(148, 148); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void RecordButton::paintEvent(QPaintEvent *event) { |
|
|
|
|
QPainter p(this); |
|
|
|
|
p.setRenderHint(QPainter::Antialiasing); |
|
|
|
|
|
|
|
|
|
QPoint center(width() / 2, height() / 2); |
|
|
|
|
|
|
|
|
|
QColor bg(isChecked() ? "#FFFFFF" : "#404040"); |
|
|
|
|
QColor accent(isChecked() ? "#FF0000" : "#FFFFFF"); |
|
|
|
|
if (isDown()) { |
|
|
|
|
accent.setAlphaF(0.7); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
p.setPen(Qt::NoPen); |
|
|
|
|
p.setBrush(bg); |
|
|
|
|
p.drawEllipse(center, 74, 74); |
|
|
|
|
|
|
|
|
|
p.setPen(QPen(accent, 6)); |
|
|
|
|
p.setBrush(Qt::NoBrush); |
|
|
|
|
p.drawEllipse(center, 42, 42); |
|
|
|
|
|
|
|
|
|
p.setPen(Qt::NoPen); |
|
|
|
|
p.setBrush(accent); |
|
|
|
|
p.drawEllipse(center, 22, 22); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BodyWindow::BodyWindow(QWidget *parent) : fuel_filter(1.0, 5., 1. / UI_FREQ), QWidget(parent) { |
|
|
|
|
QStackedLayout *layout = new QStackedLayout(this); |
|
|
|
|
layout->setStackingMode(QStackedLayout::StackAll); |
|
|
|
|
|
|
|
|
|
QWidget *w = new QWidget; |
|
|
|
|
QVBoxLayout *vlayout = new QVBoxLayout(w); |
|
|
|
|
vlayout->setMargin(45); |
|
|
|
|
layout->addWidget(w); |
|
|
|
|
|
|
|
|
|
// face
|
|
|
|
|
face = new QLabel(); |
|
|
|
|
face->setAlignment(Qt::AlignCenter); |
|
|
|
|
layout->addWidget(face); |
|
|
|
|
awake = new QMovie("../assets/body/awake.gif"); |
|
|
|
|
awake->setCacheMode(QMovie::CacheAll); |
|
|
|
|
sleep = new QMovie("../assets/body/sleep.gif"); |
|
|
|
|
sleep->setCacheMode(QMovie::CacheAll); |
|
|
|
|
|
|
|
|
|
QPalette p(Qt::black); |
|
|
|
|
setPalette(p); |
|
|
|
|
setAutoFillBackground(true); |
|
|
|
|
|
|
|
|
|
setAlignment(Qt::AlignCenter); |
|
|
|
|
|
|
|
|
|
setAttribute(Qt::WA_TransparentForMouseEvents, true); |
|
|
|
|
// record button
|
|
|
|
|
btn = new RecordButton(this); |
|
|
|
|
vlayout->addWidget(btn, 0, Qt::AlignBottom | Qt::AlignRight); |
|
|
|
|
QObject::connect(btn, &QPushButton::clicked, [=](bool checked) { |
|
|
|
|
Params().putBool("EnableLogging", checked); |
|
|
|
|
}); |
|
|
|
|
w->raise(); |
|
|
|
|
|
|
|
|
|
QObject::connect(uiState(), &UIState::uiUpdate, this, &BodyWindow::updateState); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void BodyWindow::paintEvent(QPaintEvent *event) { |
|
|
|
|
QLabel::paintEvent(event); |
|
|
|
|
//QLabel::paintEvent(event);
|
|
|
|
|
|
|
|
|
|
QPainter p(this); |
|
|
|
|
p.setRenderHint(QPainter::Antialiasing); |
|
|
|
|
|
|
|
|
|
p.translate(width() - 136, 16); |
|
|
|
|
p.fillRect(rect(), QColor(0, 0, 0)); |
|
|
|
|
|
|
|
|
|
// battery outline + detail
|
|
|
|
|
p.translate(width() - 136, 16); |
|
|
|
|
const QColor gray = QColor("#737373"); |
|
|
|
|
p.setBrush(Qt::NoBrush); |
|
|
|
|
p.setPen(QPen(gray, 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); |
|
|
|
@ -79,9 +127,9 @@ void BodyWindow::updateState(const UIState &s) { |
|
|
|
|
// TODO: use carState.standstill when that's fixed
|
|
|
|
|
const bool standstill = std::abs(cs.getVEgo()) < 0.01; |
|
|
|
|
QMovie *m = standstill ? sleep : awake; |
|
|
|
|
if (m != movie()) { |
|
|
|
|
setMovie(m); |
|
|
|
|
movie()->start(); |
|
|
|
|
if (m != face->movie()) { |
|
|
|
|
face->setMovie(m); |
|
|
|
|
face->movie()->start(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
update(); |
|
|
|
|