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/214/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 <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(); | ||||
| }; | ||||
					Loading…
					
					
				
		Reference in new issue