diff --git a/selfdrive/common/params.h b/selfdrive/common/params.h index 505bfcb082..2bb636dbde 100644 --- a/selfdrive/common/params.h +++ b/selfdrive/common/params.h @@ -43,6 +43,10 @@ public: return params_path; } + inline std::string getParamPath(std::string key) { + return params_path + "/d/" + key; + } + template std::optional get(const char *key, bool block = false) { std::istringstream iss(get(key, block)); diff --git a/selfdrive/ui/qt/maps/map_settings.cc b/selfdrive/ui/qt/maps/map_settings.cc index c91f1c586c..770b019023 100644 --- a/selfdrive/ui/qt/maps/map_settings.cc +++ b/selfdrive/ui/qt/maps/map_settings.cc @@ -55,34 +55,64 @@ MapPanel::MapPanel(QWidget* parent) : QWidget(parent) { main_layout->addWidget(horizontal_line()); main_layout->addSpacing(20); + // Current route + { + current_widget = new QWidget(this); + QVBoxLayout *current_layout = new QVBoxLayout(current_widget); + + QLabel *title = new QLabel("Current Destination"); + title->setStyleSheet("font-size: 55px"); + current_layout->addWidget(title); + + current_route = new ButtonControl("", "CLEAR"); + current_route->setStyleSheet("padding-left: 40px;"); + current_layout->addWidget(current_route); + QObject::connect(current_route, &ButtonControl::clicked, [=]() { + params.remove("NavDestination"); + updateCurrentRoute(); + }); + + current_layout->addSpacing(10); + current_layout->addWidget(horizontal_line()); + current_layout->addSpacing(20); + } + main_layout->addWidget(current_widget); + // Recents + QLabel *recents_title = new QLabel("Recent Destinations"); + recents_title->setStyleSheet("font-size: 55px"); + main_layout->addWidget(recents_title); + main_layout->addSpacing(20); + recent_layout = new QVBoxLayout; QWidget *recent_widget = new LayoutWidget(recent_layout, this); ScrollView *recent_scroller = new ScrollView(recent_widget, this); - main_layout->addWidget(recent_scroller, 1); + main_layout->addWidget(recent_scroller); + // No prime upsell QWidget * no_prime_widget = new QWidget; - QVBoxLayout *no_prime_layout = new QVBoxLayout(no_prime_widget); - QLabel *signup_header = new QLabel("Try the Navigation Beta"); - signup_header->setStyleSheet(R"(font-size: 75px; color: white; font-weight:600;)"); - signup_header->setAlignment(Qt::AlignCenter); - - no_prime_layout->addWidget(signup_header); - no_prime_layout->addSpacing(50); - - QLabel *screenshot = new QLabel; - QPixmap pm = QPixmap("../assets/navigation/screenshot.png"); - screenshot->setPixmap(pm.scaledToWidth(vwp_w * 0.5, Qt::SmoothTransformation)); - no_prime_layout->addWidget(screenshot, 0, Qt::AlignHCenter); - - QLabel *signup = new QLabel("Get turn-by-turn directions displayed and more with a comma \nprime subscription. Sign up now: https://connect.comma.ai"); - signup->setStyleSheet(R"(font-size: 45px; color: white; font-weight:300;)"); - signup->setAlignment(Qt::AlignCenter); - - no_prime_layout->addSpacing(50); - no_prime_layout->addWidget(signup); - - no_prime_layout->addStretch(); + { + QVBoxLayout *no_prime_layout = new QVBoxLayout(no_prime_widget); + QLabel *signup_header = new QLabel("Try the Navigation Beta"); + signup_header->setStyleSheet(R"(font-size: 75px; color: white; font-weight:600;)"); + signup_header->setAlignment(Qt::AlignCenter); + + no_prime_layout->addWidget(signup_header); + no_prime_layout->addSpacing(50); + + QLabel *screenshot = new QLabel; + QPixmap pm = QPixmap("../assets/navigation/screenshot.png"); + screenshot->setPixmap(pm.scaledToWidth(vwp_w * 0.5, Qt::SmoothTransformation)); + no_prime_layout->addWidget(screenshot, 0, Qt::AlignHCenter); + + QLabel *signup = new QLabel("Get turn-by-turn directions displayed and more with a comma \nprime subscription. Sign up now: https://connect.comma.ai"); + signup->setStyleSheet(R"(font-size: 45px; color: white; font-weight:300;)"); + signup->setAlignment(Qt::AlignCenter); + + no_prime_layout->addSpacing(20); + no_prime_layout->addWidget(signup); + no_prime_layout->addStretch(); + } stack->addWidget(main_widget); stack->addWidget(no_prime_widget); @@ -126,6 +156,10 @@ MapPanel::MapPanel(QWidget* parent) : QWidget(parent) { } } +void MapPanel::showEvent(QShowEvent *event) { + updateCurrentRoute(); +} + void MapPanel::clear() { home_button->setIcon(QPixmap("../assets/navigation/home_inactive.png")); home_address->setStyleSheet(R"(font-size: 50px; color: grey;)"); @@ -140,6 +174,16 @@ void MapPanel::clear() { clearLayout(recent_layout); } +void MapPanel::updateCurrentRoute() { + auto dest = QString::fromStdString(params.get("NavDestination")); + QJsonDocument doc = QJsonDocument::fromJson(dest.trimmed().toUtf8()); + if (dest.size() && !doc.isNull()) { + auto name = doc["place_name"].toString(); + auto details = doc["place_details"].toString(); + current_route->setTitle(shorten(name + " " + details, 42)); + } + current_widget->setVisible(dest.size() && !doc.isNull()); +} void MapPanel::parseResponse(const QString &response) { QJsonDocument doc = QJsonDocument::fromJson(response.trimmed().toUtf8()); diff --git a/selfdrive/ui/qt/maps/map_settings.h b/selfdrive/ui/qt/maps/map_settings.h index 2eb462d671..ec409c4962 100644 --- a/selfdrive/ui/qt/maps/map_settings.h +++ b/selfdrive/ui/qt/maps/map_settings.h @@ -9,6 +9,7 @@ #include #include "selfdrive/common/params.h" +#include "selfdrive/ui/qt/widgets/controls.h" class MapPanel : public QWidget { Q_OBJECT @@ -18,14 +19,19 @@ public: void navigateTo(const QJsonObject &place); void parseResponse(const QString &response); void failedResponse(const QString &response); + void updateCurrentRoute(); void clear(); private: + void showEvent(QShowEvent *event) override; + Params params; QStackedWidget *stack; QPushButton *home_button, *work_button; QLabel *home_address, *work_address; QVBoxLayout *recent_layout; + QWidget *current_widget; + ButtonControl *current_route; signals: void closeSettings(); diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 082fe68bed..1587cf8e14 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -209,9 +209,8 @@ SoftwarePanel::SoftwarePanel(QWidget* parent) : QWidget(parent) { updateBtn = new ButtonControl("Check for Update", ""); connect(updateBtn, &ButtonControl::clicked, [=]() { if (params.getBool("IsOffroad")) { - const QString paramsPath = QString::fromStdString(params.getParamsPath()); - fs_watch->addPath(paramsPath + "/d/LastUpdateTime"); - fs_watch->addPath(paramsPath + "/d/UpdateFailedCount"); + fs_watch->addPath(QString::fromStdString(params.getParamPath("LastUpdateTime"))); + fs_watch->addPath(QString::fromStdString(params.getParamPath("UpdateFailedCount"))); updateBtn->setText("CHECKING"); updateBtn->setEnabled(false); } diff --git a/selfdrive/ui/qt/widgets/controls.cc b/selfdrive/ui/qt/widgets/controls.cc index 2087977d05..2cc68be8b7 100644 --- a/selfdrive/ui/qt/widgets/controls.cc +++ b/selfdrive/ui/qt/widgets/controls.cc @@ -45,7 +45,7 @@ AbstractControl::AbstractControl(const QString &title, const QString &desc, cons if (!desc.isEmpty()) { description = new QLabel(desc); description->setContentsMargins(40, 20, 40, 20); - description->setStyleSheet("font-size: 40px; color:grey"); + description->setStyleSheet("font-size: 40px; color: grey"); description->setWordWrap(true); description->setVisible(false); main_layout->addWidget(description); diff --git a/selfdrive/ui/qt/widgets/controls.h b/selfdrive/ui/qt/widgets/controls.h index 317105961a..bfa25ce83c 100644 --- a/selfdrive/ui/qt/widgets/controls.h +++ b/selfdrive/ui/qt/widgets/controls.h @@ -33,7 +33,11 @@ class AbstractControl : public QFrame { public: void setDescription(const QString &desc) { - if(description) description->setText(desc); + if (description) description->setText(desc); + } + + void setTitle(const QString &title) { + title_label->setText(title); } signals: