From 0dd1dcc7d06e8d5873dc9a2fa5c3e220295bfc1c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 24 Jul 2023 22:27:01 -0700 Subject: [PATCH] ui: new nav settings button (#29068) * add image * remove extra spacing * add images * use nav-settings-square-smaller.png * draft * clean up * kinda works! * nop need to update state * can just use clicked * MORE * remove old button * slightly smaller (todo change image)) * this works but is ugly * remove old settings button * draft * no it's not * draft 2.0 * clean up * clean up * let's make map_settings_btn public * since we don't have map, use enabled * fix image size * can do clean up in another PR show * add line * rename * useless spacing * use old nav icon * handle DM icon (and test) * clean up * no reason * remove old image * don't use setCurrentIndex * Revert "don't use setCurrentIndex" This reverts commit 6fde765a3cd3a9ee39205614587a23fbfbc60950. * also can use a ternary * seems cleanest This reverts commit f9287230704b94f46b6bb5376d9a17075a20caf7. --- selfdrive/ui/qt/maps/map.cc | 29 --------------------- selfdrive/ui/qt/maps/map.h | 2 -- selfdrive/ui/qt/maps/map_panel.cc | 8 ++++++ selfdrive/ui/qt/maps/map_panel.h | 3 +++ selfdrive/ui/qt/onroad.cc | 42 ++++++++++++++++++++++++++++--- selfdrive/ui/qt/onroad.h | 20 +++++++++++++-- 6 files changed, 68 insertions(+), 36 deletions(-) diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc index 785ebdc77..bcc028d80 100644 --- a/selfdrive/ui/qt/maps/map.cc +++ b/selfdrive/ui/qt/maps/map.cc @@ -34,29 +34,6 @@ MapWindow::MapWindow(const QMapboxGLSettings &settings) : m_settings(settings), map_eta->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); map_eta->setFixedHeight(120); - // Settings button - QSize icon_size(120, 120); - directions_icon = loadPixmap("../assets/navigation/icon_directions_outlined.svg", icon_size); - settings_icon = loadPixmap("../assets/navigation/icon_settings.svg", icon_size); - - settings_btn = new QPushButton(directions_icon, "", this); - settings_btn->setIconSize(icon_size); - settings_btn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - settings_btn->setStyleSheet(R"( - QPushButton { - background-color: #96000000; - border-radius: 50px; - padding: 24px; - margin-left: 30px; - } - QPushButton:pressed { - background-color: #D9000000; - } - )"); - QObject::connect(settings_btn, &QPushButton::clicked, [=]() { - emit requestSettings(true); - }); - error = new QLabel(this); error->setStyleSheet(R"(color:white;padding:50px 11px;font-size: 90px; background-color:rgb(0, 0, 0, 150);)"); error->setAlignment(Qt::AlignCenter); @@ -64,8 +41,6 @@ MapWindow::MapWindow(const QMapboxGLSettings &settings) : m_settings(settings), overlay_layout->addWidget(error); overlay_layout->addWidget(map_instructions); overlay_layout->addStretch(1); - overlay_layout->addWidget(settings_btn, Qt::AlignLeft); - overlay_layout->addSpacing(UI_BORDER_SIZE); overlay_layout->addWidget(map_eta); auto last_gps_position = coordinate_from_param("LastGPSPosition"); @@ -252,10 +227,6 @@ void MapWindow::updateState(const UIState &s) { } else { clearRoute(); } - - if (isVisible()) { - settings_btn->setIcon(map_eta->isVisible() ? settings_icon : directions_icon); - } } if (sm.rcv_frame("navRoute") != route_rcv_frame) { diff --git a/selfdrive/ui/qt/maps/map.h b/selfdrive/ui/qt/maps/map.h index e419a9e5c..d57f6517b 100644 --- a/selfdrive/ui/qt/maps/map.h +++ b/selfdrive/ui/qt/maps/map.h @@ -68,8 +68,6 @@ private: QLabel *error; MapInstructions* map_instructions; MapETA* map_eta; - QPushButton *settings_btn; - QPixmap directions_icon, settings_icon; // Blue with normal nav, green when nav is input into the model QColor getNavPathColor(bool nav_enabled) { diff --git a/selfdrive/ui/qt/maps/map_panel.cc b/selfdrive/ui/qt/maps/map_panel.cc index b2d00bf04..f1b8f812f 100644 --- a/selfdrive/ui/qt/maps/map_panel.cc +++ b/selfdrive/ui/qt/maps/map_panel.cc @@ -33,3 +33,11 @@ MapPanel::MapPanel(const QMapboxGLSettings &mapboxSettings, QWidget *parent) : Q }); content_stack->addWidget(settings); } + +void MapPanel::toggleMapSettings() { + // show settings if not visible, then toggle between map and settings + int new_index = isVisible() ? (1 - content_stack->currentIndex()) : 1; + content_stack->setCurrentIndex(new_index); + emit mapPanelRequested(); + show(); +} diff --git a/selfdrive/ui/qt/maps/map_panel.h b/selfdrive/ui/qt/maps/map_panel.h index 488250a63..43a2cc7c8 100644 --- a/selfdrive/ui/qt/maps/map_panel.h +++ b/selfdrive/ui/qt/maps/map_panel.h @@ -13,6 +13,9 @@ public: signals: void mapPanelRequested(); +public slots: + void toggleMapSettings(); + private: QStackedLayout *content_stack; }; diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index ef711afd5..0c126304d 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -92,6 +92,8 @@ void OnroadWindow::offroadTransition(bool offroad) { 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); @@ -221,17 +223,45 @@ void ExperimentalButton::paintEvent(QPaintEvent *event) { } +// MapSettingsButton +MapSettingsButton::MapSettingsButton(QWidget *parent) : QPushButton(parent) { + setFixedSize(btn_size, btn_size); + settings_img = loadPixmap("../assets/navigation/icon_directions_outlined.svg", {img_size, img_size}); + + // hidden by default, made visible if map is created (has prime or mapbox token) + setVisible(false); + setEnabled(false); +} + +void MapSettingsButton::paintEvent(QPaintEvent *event) { + QPainter p(this); + p.setRenderHint(QPainter::Antialiasing); + + QPoint center(btn_size / 2, btn_size / 2); + + p.setOpacity(1.0); + p.setPen(Qt::NoPen); + p.setBrush(QColor(0, 0, 0, 166)); + p.drawEllipse(center, btn_size / 2, btn_size / 2); + p.setOpacity(isDown() ? 0.6 : 1.0); + p.drawPixmap((btn_size - img_size) / 2, (btn_size - img_size) / 2, settings_img); +} + + // Window that shows camera view and variety of info drawn on top AnnotatedCameraWidget::AnnotatedCameraWidget(VisionStreamType type, QWidget* parent) : fps_filter(UI_FREQ, 3, 1. / UI_FREQ), CameraWidget("camerad", type, true, parent) { pm = std::make_unique>({"uiDebug"}); - QVBoxLayout *main_layout = new QVBoxLayout(this); + main_layout = new QVBoxLayout(this); main_layout->setMargin(UI_BORDER_SIZE); main_layout->setSpacing(0); experimental_btn = new ExperimentalButton(this); main_layout->addWidget(experimental_btn, 0, Qt::AlignTop | Qt::AlignRight); + map_settings_btn = new MapSettingsButton(this); + main_layout->addWidget(map_settings_btn, 0, Qt::AlignBottom | Qt::AlignRight); + dm_img = loadPixmap("../assets/img_driver_face.png", {img_size + 5, img_size + 5}); } @@ -276,7 +306,7 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { setProperty("speed", cur_speed); setProperty("setSpeed", set_speed); setProperty("speedUnit", s.scene.is_metric ? tr("km/h") : tr("mph")); - setProperty("hideDM", (cs.getAlertSize() != cereal::ControlsState::AlertSize::NONE)); + setProperty("hideBottomIcons", (cs.getAlertSize() != cereal::ControlsState::AlertSize::NONE)); setProperty("status", s.status); // update engageability/experimental mode button @@ -288,6 +318,12 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { setProperty("rightHandDM", dm_state.getIsRHD()); // DM icon transition dm_fade_state = std::clamp(dm_fade_state+0.2*(0.5-dmActive), 0.0, 1.0); + + // hide map settings button for alerts and flip for right hand DM + if (map_settings_btn->isEnabled()) { + map_settings_btn->setVisible(!hideBottomIcons); + main_layout->setAlignment(map_settings_btn, (rightHandDM ? Qt::AlignLeft : Qt::AlignRight) | Qt::AlignBottom); + } } void AnnotatedCameraWidget::drawHud(QPainter &p) { @@ -648,7 +684,7 @@ void AnnotatedCameraWidget::paintGL() { } // DMoji - if (!hideDM && (sm.rcv_frame("driverStateV2") > s->scene.started_frame)) { + if (!hideBottomIcons && (sm.rcv_frame("driverStateV2") > s->scene.started_frame)) { update_dmonitoring(s, sm["driverStateV2"].getDriverStateV2(), dm_fade_state, rightHandDM); drawDriverState(painter, s); } diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index 955ddf254..0dd95877a 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -47,6 +47,19 @@ private: bool engageable; }; + +class MapSettingsButton : public QPushButton { + Q_OBJECT + +public: + explicit MapSettingsButton(QWidget *parent = 0); + +private: + void paintEvent(QPaintEvent *event) override; + + QPixmap settings_img; +}; + // container window for the NVG UI class AnnotatedCameraWidget : public CameraWidget { Q_OBJECT @@ -60,7 +73,7 @@ class AnnotatedCameraWidget : public CameraWidget { Q_PROPERTY(bool is_metric MEMBER is_metric); Q_PROPERTY(bool dmActive MEMBER dmActive); - Q_PROPERTY(bool hideDM MEMBER hideDM); + Q_PROPERTY(bool hideBottomIcons MEMBER hideBottomIcons); Q_PROPERTY(bool rightHandDM MEMBER rightHandDM); Q_PROPERTY(int status MEMBER status); @@ -68,10 +81,13 @@ public: explicit AnnotatedCameraWidget(VisionStreamType type, QWidget* parent = 0); void updateState(const UIState &s); + MapSettingsButton *map_settings_btn; + private: void drawIcon(QPainter &p, int x, int y, QPixmap &img, QBrush bg, float opacity); void drawText(QPainter &p, int x, int y, const QString &text, int alpha = 255); + QVBoxLayout *main_layout; ExperimentalButton *experimental_btn; QPixmap dm_img; float speed; @@ -81,7 +97,7 @@ private: bool is_cruise_set = false; bool is_metric = false; bool dmActive = false; - bool hideDM = false; + bool hideBottomIcons = false; bool rightHandDM = false; float dm_fade_state = 1.0; bool has_us_speed_limit = false;