You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.6 KiB
129 lines
3.6 KiB
1 year ago
|
#include "selfdrive/ui/qt/onroad/onroad_home.h"
|
||
|
|
||
|
#include <QPainter>
|
||
|
|
||
|
#ifdef ENABLE_MAPS
|
||
|
#include "selfdrive/ui/qt/maps/map_helpers.h"
|
||
|
#include "selfdrive/ui/qt/maps/map_panel.h"
|
||
|
#endif
|
||
|
|
||
|
#include "selfdrive/ui/qt/util.h"
|
||
|
|
||
|
OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) {
|
||
|
QVBoxLayout *main_layout = new QVBoxLayout(this);
|
||
|
main_layout->setMargin(UI_BORDER_SIZE);
|
||
|
QStackedLayout *stacked_layout = new QStackedLayout;
|
||
|
stacked_layout->setStackingMode(QStackedLayout::StackAll);
|
||
|
main_layout->addLayout(stacked_layout);
|
||
|
|
||
|
nvg = new AnnotatedCameraWidget(VISION_STREAM_ROAD, this);
|
||
|
|
||
|
QWidget * split_wrapper = new QWidget;
|
||
|
split = new QHBoxLayout(split_wrapper);
|
||
|
split->setContentsMargins(0, 0, 0, 0);
|
||
|
split->setSpacing(0);
|
||
|
split->addWidget(nvg);
|
||
|
|
||
|
if (getenv("DUAL_CAMERA_VIEW")) {
|
||
|
CameraWidget *arCam = new CameraWidget("camerad", VISION_STREAM_ROAD, true, this);
|
||
|
split->insertWidget(0, arCam);
|
||
|
}
|
||
|
|
||
|
if (getenv("MAP_RENDER_VIEW")) {
|
||
|
CameraWidget *map_render = new CameraWidget("navd", VISION_STREAM_MAP, false, this);
|
||
|
split->insertWidget(0, map_render);
|
||
|
}
|
||
|
|
||
|
stacked_layout->addWidget(split_wrapper);
|
||
|
|
||
|
alerts = new OnroadAlerts(this);
|
||
|
alerts->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
||
|
stacked_layout->addWidget(alerts);
|
||
|
|
||
|
// setup stacking order
|
||
|
alerts->raise();
|
||
|
|
||
|
setAttribute(Qt::WA_OpaquePaintEvent);
|
||
|
QObject::connect(uiState(), &UIState::uiUpdate, this, &OnroadWindow::updateState);
|
||
|
QObject::connect(uiState(), &UIState::offroadTransition, this, &OnroadWindow::offroadTransition);
|
||
|
QObject::connect(uiState(), &UIState::primeChanged, this, &OnroadWindow::primeChanged);
|
||
|
}
|
||
|
|
||
|
void OnroadWindow::updateState(const UIState &s) {
|
||
|
if (!s.scene.started) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (s.scene.map_on_left) {
|
||
|
split->setDirection(QBoxLayout::LeftToRight);
|
||
|
} else {
|
||
|
split->setDirection(QBoxLayout::RightToLeft);
|
||
|
}
|
||
|
|
||
|
alerts->updateState(s);
|
||
|
nvg->updateState(s);
|
||
|
|
||
|
QColor bgColor = bg_colors[s.status];
|
||
|
if (bg != bgColor) {
|
||
|
// repaint border
|
||
|
bg = bgColor;
|
||
|
update();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void OnroadWindow::mousePressEvent(QMouseEvent* e) {
|
||
|
#ifdef ENABLE_MAPS
|
||
|
if (map != nullptr) {
|
||
|
bool sidebarVisible = geometry().x() > 0;
|
||
|
bool show_map = !sidebarVisible;
|
||
|
map->setVisible(show_map && !map->isVisible());
|
||
|
}
|
||
|
#endif
|
||
|
// propagation event to parent(HomeWindow)
|
||
|
QWidget::mousePressEvent(e);
|
||
|
}
|
||
|
|
||
|
void OnroadWindow::createMapWidget() {
|
||
|
#ifdef ENABLE_MAPS
|
||
|
auto m = new MapPanel(get_mapbox_settings());
|
||
|
map = m;
|
||
|
QObject::connect(m, &MapPanel::mapPanelRequested, this, &OnroadWindow::mapPanelRequested);
|
||
|
QObject::connect(nvg->map_settings_btn, &MapSettingsButton::clicked, m, &MapPanel::toggleMapSettings);
|
||
|
nvg->map_settings_btn->setEnabled(true);
|
||
|
|
||
|
m->setFixedWidth(topWidget(this)->width() / 2 - UI_BORDER_SIZE);
|
||
|
split->insertWidget(0, m);
|
||
|
// hidden by default, made visible when navRoute is published
|
||
|
m->setVisible(false);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void OnroadWindow::offroadTransition(bool offroad) {
|
||
|
#ifdef ENABLE_MAPS
|
||
|
if (!offroad) {
|
||
|
if (map == nullptr && (uiState()->hasPrime() || !MAPBOX_TOKEN.isEmpty())) {
|
||
|
createMapWidget();
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
alerts->clear();
|
||
|
}
|
||
|
|
||
|
void OnroadWindow::primeChanged(bool prime) {
|
||
|
#ifdef ENABLE_MAPS
|
||
|
if (map && (!prime && MAPBOX_TOKEN.isEmpty())) {
|
||
|
nvg->map_settings_btn->setEnabled(false);
|
||
|
nvg->map_settings_btn->setVisible(false);
|
||
|
map->deleteLater();
|
||
|
map = nullptr;
|
||
|
} else if (!map && (prime || !MAPBOX_TOKEN.isEmpty())) {
|
||
|
createMapWidget();
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void OnroadWindow::paintEvent(QPaintEvent *event) {
|
||
|
QPainter p(this);
|
||
|
p.fillRect(rect(), QColor(bg.red(), bg.green(), bg.blue(), 255));
|
||
|
}
|