From c21ea8b50653bfb3b4c93e7042d7ffa62abfcf2a Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Tue, 22 Jun 2021 13:25:22 +0200 Subject: [PATCH] nav: home/work shortcuts (#21276) * add home/work widgets * remove todo * set contents from response * turn into buttons * add navigate button * fix includes * close settings on nav press * close sidebar when closing settings * use live api endpoint * larger fonts * more text fits * only place name * remove static response * properly clear --- selfdrive/assets/navigation/home.png | Bin 0 -> 6128 bytes selfdrive/assets/navigation/home.svg | 65 +++++++++++ selfdrive/assets/navigation/home_inactive.png | Bin 0 -> 9165 bytes selfdrive/assets/navigation/work.png | Bin 0 -> 5570 bytes selfdrive/assets/navigation/work.svg | 66 +++++++++++ selfdrive/assets/navigation/work_inactive.png | Bin 0 -> 8446 bytes selfdrive/common/params.cc | 1 + selfdrive/ui/qt/home.cc | 4 + selfdrive/ui/qt/home.h | 1 + selfdrive/ui/qt/maps/map.cc | 1 + selfdrive/ui/qt/maps/map_settings.cc | 109 +++++++++++++++++- selfdrive/ui/qt/maps/map_settings.h | 18 ++- selfdrive/ui/qt/offroad/settings.cc | 4 +- selfdrive/ui/qt/window.cc | 4 + 14 files changed, 269 insertions(+), 4 deletions(-) create mode 100644 selfdrive/assets/navigation/home.png create mode 100644 selfdrive/assets/navigation/home.svg create mode 100644 selfdrive/assets/navigation/home_inactive.png create mode 100644 selfdrive/assets/navigation/work.png create mode 100644 selfdrive/assets/navigation/work.svg create mode 100644 selfdrive/assets/navigation/work_inactive.png diff --git a/selfdrive/assets/navigation/home.png b/selfdrive/assets/navigation/home.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4f65c7d7a8367e4d4241e6318b67dd5005de95 GIT binary patch literal 6128 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 vdj7Tpe{0_BT~)Yw-$7so_YnLJ&zZ + + + + + image/svg+xml + + + + + + + + + + diff --git a/selfdrive/assets/navigation/home_inactive.png b/selfdrive/assets/navigation/home_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..a58fd3864fdf30a983878556fe17b9a85ee1ccc8 GIT binary patch literal 9165 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 literal 0 HcmV?d00001 diff --git a/selfdrive/assets/navigation/work.png b/selfdrive/assets/navigation/work.png new file mode 100644 index 0000000000000000000000000000000000000000..611f9b038dc9cd271b9ff79bbc70e32b1c342630 GIT binary patch literal 5570 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 N + + + + + image/svg+xml + + + + + + + + + + diff --git a/selfdrive/assets/navigation/work_inactive.png b/selfdrive/assets/navigation/work_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..679e6a54b2852e69248e8387ef0b251f05b4e23f GIT binary patch literal 8446 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 literal 0 HcmV?d00001 diff --git a/selfdrive/common/params.cc b/selfdrive/common/params.cc index 582291c183..a440352743 100644 --- a/selfdrive/common/params.cc +++ b/selfdrive/common/params.cc @@ -151,6 +151,7 @@ std::unordered_map keys = { {"ApiCache_DriveStats", PERSISTENT}, {"ApiCache_Device", PERSISTENT}, {"ApiCache_Owner", PERSISTENT}, + {"ApiCache_NavDestinations", PERSISTENT}, {"AthenadPid", PERSISTENT}, {"CalibrationParams", PERSISTENT}, {"CarBatteryCapacity", PERSISTENT}, diff --git a/selfdrive/ui/qt/home.cc b/selfdrive/ui/qt/home.cc index 4fef26de24..f2ac7ff6d2 100644 --- a/selfdrive/ui/qt/home.cc +++ b/selfdrive/ui/qt/home.cc @@ -44,6 +44,10 @@ HomeWindow::HomeWindow(QWidget* parent) : QWidget(parent) { slayout->addWidget(driver_view); } +void HomeWindow::showSidebar(bool show) { + sidebar->setVisible(show); +} + void HomeWindow::offroadTransition(bool offroad) { if (offroad) { slayout->setCurrentWidget(home); diff --git a/selfdrive/ui/qt/home.h b/selfdrive/ui/qt/home.h index db3e2f8f6e..ab60af0a21 100644 --- a/selfdrive/ui/qt/home.h +++ b/selfdrive/ui/qt/home.h @@ -54,6 +54,7 @@ signals: public slots: void offroadTransition(bool offroad); void showDriverView(bool show); + void showSidebar(bool show); protected: void mousePressEvent(QMouseEvent* e) override; diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc index d74e753d90..7bfb97b581 100644 --- a/selfdrive/ui/qt/maps/map.cc +++ b/selfdrive/ui/qt/maps/map.cc @@ -276,6 +276,7 @@ void MapWindow::recomputeRoute() { if (*new_destination != nav_destination) { setVisible(true); // Show map on destination set/change + // TODO: close sidebar should_recompute = true; } diff --git a/selfdrive/ui/qt/maps/map_settings.cc b/selfdrive/ui/qt/maps/map_settings.cc index f6a3bdaeb2..bf17091bc9 100644 --- a/selfdrive/ui/qt/maps/map_settings.cc +++ b/selfdrive/ui/qt/maps/map_settings.cc @@ -1,19 +1,124 @@ #include "map_settings.h" +#include + +#include "selfdrive/ui/qt/request_repeater.h" #include "selfdrive/ui/qt/widgets/controls.h" +#include "selfdrive/common/util.h" +static QString shorten(const QString &str, int max_len) { + return str.size() > max_len ? str.left(max_len).trimmed() + "…" : str; +} MapPanel::MapPanel(QWidget* parent) : QWidget(parent) { QVBoxLayout *main_layout = new QVBoxLayout(this); Params params = Params(); - QString dongle = QString::fromStdString(params.get("DongleId", false)); - // TODO: Add buttons for home/work shortcuts + // Home + QHBoxLayout *home_layout = new QHBoxLayout; + home_button = new QPushButton; + home_button->setIconSize(QSize(200, 200)); + home_layout->addWidget(home_button); + + home_address = new QLabel; + home_address->setWordWrap(true); + home_layout->addSpacing(30); + home_layout->addWidget(home_address); + home_layout->addStretch(); + + // Work + QHBoxLayout *work_layout = new QHBoxLayout; + work_button = new QPushButton; + work_button->setIconSize(QSize(200, 200)); + work_layout->addWidget(work_button); + + work_address = new QLabel; + work_address->setWordWrap(true); + work_layout->addSpacing(30); + work_layout->addWidget(work_address); + work_layout->addStretch(); + + // Home & Work layout + QHBoxLayout *home_work_layout = new QHBoxLayout; + home_work_layout->addLayout(home_layout, 1); + home_work_layout->addSpacing(50); + home_work_layout->addLayout(work_layout, 1); + main_layout->addLayout(home_work_layout); + main_layout->addSpacing(50); + main_layout->addWidget(horizontal_line()); + + // Settings main_layout->addWidget(new ParamControl("NavSettingTime24h", "Show ETA in 24h format", "Use 24h format instead of am/pm", "", this)); main_layout->addStretch(); + + clear(); + + std::string dongle_id = Params().get("DongleId"); + if (util::is_valid_dongle_id(dongle_id)) { + std::string url = "https://api.commadotai.com/v1/navigation/" + dongle_id + "/locations"; + RequestRepeater* repeater = new RequestRepeater(this, QString::fromStdString(url), "ApiCache_NavDestinations", 30); + QObject::connect(repeater, &RequestRepeater::receivedResponse, this, &MapPanel::parseResponse); + } +} + +void MapPanel::clear() { + home_button->setIcon(QPixmap("../assets/navigation/home_inactive.png")); + home_address->setStyleSheet(R"(font-size: 50px; color: grey;)"); + home_address->setText("No home\nlocation set"); + home_button->disconnect(); + + work_button->setIcon(QPixmap("../assets/navigation/work_inactive.png")); + work_address->setStyleSheet(R"(font-size: 50px; color: grey;)"); + work_address->setText("No work\nlocation set"); + work_button->disconnect(); +} + + +void MapPanel::parseResponse(const QString &response) { + QJsonDocument doc = QJsonDocument::fromJson(response.trimmed().toUtf8()); + if (doc.isNull()) { + qDebug() << "JSON Parse failed on navigation locations"; + return; + } + + clear(); + + for (auto location : doc.array()) { + auto obj = location.toObject(); + + auto type = obj["save_type"].toString(); + auto label = obj["label"].toString(); + auto name = obj["place_name"].toString(); + auto details = shorten(obj["place_details"].toString(), 30); + + if (type == "favorite") { + if (label == "home") { + home_address->setText(name); + home_address->setStyleSheet(R"(font-size: 50px; color: white;)"); + home_button->setIcon(QPixmap("../assets/navigation/home.png")); + QObject::connect(home_button, &QPushButton::clicked, [=]() { + navigateTo(obj); + emit closeSettings(); + }); + } else if (label == "work") { + work_address->setText(name); + work_address->setStyleSheet(R"(font-size: 50px; color: white;)"); + work_button->setIcon(QPixmap("../assets/navigation/work.png")); + QObject::connect(work_button, &QPushButton::clicked, [=]() { + navigateTo(obj); + emit closeSettings(); + }); + } + } + } +} + +void MapPanel::navigateTo(const QJsonObject &place) { + QJsonDocument doc(place); + Params().put("NavDestination", doc.toJson().toStdString()); } diff --git a/selfdrive/ui/qt/maps/map_settings.h b/selfdrive/ui/qt/maps/map_settings.h index b2deec696f..26e4f95f95 100644 --- a/selfdrive/ui/qt/maps/map_settings.h +++ b/selfdrive/ui/qt/maps/map_settings.h @@ -1,8 +1,24 @@ #pragma once #include +#include +#include +#include +#include +#include class MapPanel : public QWidget { Q_OBJECT public: explicit MapPanel(QWidget* parent = nullptr); -}; \ No newline at end of file + + void navigateTo(const QJsonObject &place); + void parseResponse(const QString &response); + void clear(); + +private: + QPushButton *home_button, *work_button; + QLabel *home_address, *work_address; + +signals: + void closeSettings(); +}; diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 84f3533858..4ec5b6ebe0 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -345,7 +345,9 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { #ifdef ENABLE_MAPS if (!Params().get("MapboxToken").empty()) { - panels.push_back({"Navigation", new MapPanel(this)}); + auto map_panel = new MapPanel(this); + panels.push_back({"Navigation", map_panel}); + QObject::connect(map_panel, &MapPanel::closeSettings, this, &SettingsWindow::closeSettings); } #endif const int padding = panels.size() > 3 ? 25 : 35; diff --git a/selfdrive/ui/qt/window.cc b/selfdrive/ui/qt/window.cc index 2a821abde4..04c50684b0 100644 --- a/selfdrive/ui/qt/window.cc +++ b/selfdrive/ui/qt/window.cc @@ -67,6 +67,10 @@ void MainWindow::openSettings() { void MainWindow::closeSettings() { main_layout->setCurrentWidget(homeWindow); + + if (QUIState::ui_state.scene.started) { + emit homeWindow->showSidebar(false); + } } bool MainWindow::eventFilter(QObject *obj, QEvent *event) {