#include "selfdrive/ui/qt/onroad/onroad_home.h" #include #include #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)); }