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 clearpull/21380/head
parent
a5112bfb2e
commit
c21ea8b506
14 changed files with 269 additions and 4 deletions
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 8.2 KiB |
@ -1,19 +1,124 @@ |
|||||||
#include "map_settings.h" |
#include "map_settings.h" |
||||||
|
|
||||||
|
#include <QDebug> |
||||||
|
|
||||||
|
#include "selfdrive/ui/qt/request_repeater.h" |
||||||
#include "selfdrive/ui/qt/widgets/controls.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) { |
MapPanel::MapPanel(QWidget* parent) : QWidget(parent) { |
||||||
QVBoxLayout *main_layout = new QVBoxLayout(this); |
QVBoxLayout *main_layout = new QVBoxLayout(this); |
||||||
Params params = Params(); |
Params params = Params(); |
||||||
|
|
||||||
QString dongle = QString::fromStdString(params.get("DongleId", false)); |
// Home
|
||||||
// TODO: Add buttons for home/work shortcuts
|
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", |
main_layout->addWidget(new ParamControl("NavSettingTime24h", |
||||||
"Show ETA in 24h format", |
"Show ETA in 24h format", |
||||||
"Use 24h format instead of am/pm", |
"Use 24h format instead of am/pm", |
||||||
"", |
"", |
||||||
this)); |
this)); |
||||||
main_layout->addStretch(); |
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 |
#pragma once |
||||||
#include <QWidget> |
#include <QWidget> |
||||||
|
#include <QLabel> |
||||||
|
#include <QPushButton> |
||||||
|
#include <QJsonObject> |
||||||
|
#include <QJsonDocument> |
||||||
|
#include <QJsonArray> |
||||||
|
|
||||||
class MapPanel : public QWidget { |
class MapPanel : public QWidget { |
||||||
Q_OBJECT |
Q_OBJECT |
||||||
public: |
public: |
||||||
explicit MapPanel(QWidget* parent = nullptr); |
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(); |
||||||
}; |
}; |
Loading…
Reference in new issue