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
old-commit-hash: c21ea8b506
commatwo_master
Willem Melching 4 years ago committed by GitHub
parent 1f8a63af7e
commit dc19c670b6
  1. 3
      selfdrive/assets/navigation/home.png
  2. 3
      selfdrive/assets/navigation/home.svg
  3. 3
      selfdrive/assets/navigation/home_inactive.png
  4. 3
      selfdrive/assets/navigation/work.png
  5. 3
      selfdrive/assets/navigation/work.svg
  6. 3
      selfdrive/assets/navigation/work_inactive.png
  7. 1
      selfdrive/common/params.cc
  8. 4
      selfdrive/ui/qt/home.cc
  9. 1
      selfdrive/ui/qt/home.h
  10. 1
      selfdrive/ui/qt/maps/map.cc
  11. 109
      selfdrive/ui/qt/maps/map_settings.cc
  12. 18
      selfdrive/ui/qt/maps/map_settings.h
  13. 4
      selfdrive/ui/qt/offroad/settings.cc
  14. 4
      selfdrive/ui/qt/window.cc

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6e2fcc5b07c69bb71506257a37d0fd6abe3bd53892f34d6600a3a09795174da5
size 6128

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:62f1548c61503d8fdb03592413c38204834d52b30b6fb18d1a9982229616a97e
size 2713

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d5dc1f7709720d51911e1c2bd61a6bed9fe30c48807b9f26f542e280c54c1a74
size 9165

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:49aef21620a5d2666c87975b28c6eb1cc8e613c80e504d97f5278cde25872c9d
size 5570

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d2495943fec4ab00b1df5e4e6227bbec45ec57b19b25be561d616292316212f8
size 2188

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:93e6a2b405bbbdf48d54fc7c37612430f6688cf8541ee59b984d6add3b8f02a7
size 8446

@ -151,6 +151,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"ApiCache_DriveStats", PERSISTENT},
{"ApiCache_Device", PERSISTENT},
{"ApiCache_Owner", PERSISTENT},
{"ApiCache_NavDestinations", PERSISTENT},
{"AthenadPid", PERSISTENT},
{"CalibrationParams", PERSISTENT},
{"CarBatteryCapacity", PERSISTENT},

@ -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);

@ -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;

@ -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;
}

@ -1,19 +1,124 @@
#include "map_settings.h"
#include <QDebug>
#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());
}

@ -1,8 +1,24 @@
#pragma once
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
class MapPanel : public QWidget {
Q_OBJECT
public:
explicit MapPanel(QWidget* parent = nullptr);
};
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();
};

@ -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;

@ -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) {

Loading…
Cancel
Save