#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(); // 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()); }