You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.3 KiB
122 lines
3.3 KiB
#pragma once
|
|
|
|
#include <memory>
|
|
|
|
#include <QFrame>
|
|
#include <QJsonArray>
|
|
#include <QJsonDocument>
|
|
#include <QJsonObject>
|
|
#include <QLabel>
|
|
#include <QPushButton>
|
|
#include <QVBoxLayout>
|
|
|
|
#include "common/params.h"
|
|
#include "selfdrive/ui/qt/util.h"
|
|
#include "selfdrive/ui/qt/widgets/controls.h"
|
|
|
|
const QString NAV_TYPE_FAVORITE = "favorite";
|
|
const QString NAV_TYPE_RECENT = "recent";
|
|
|
|
const QString NAV_FAVORITE_LABEL_HOME = "home";
|
|
const QString NAV_FAVORITE_LABEL_WORK = "work";
|
|
|
|
class NavDestination;
|
|
class DestinationWidget;
|
|
|
|
class MapSettings : public QFrame {
|
|
Q_OBJECT
|
|
public:
|
|
explicit MapSettings(bool closeable = false, QWidget *parent = nullptr);
|
|
|
|
void navigateTo(const QJsonObject &place);
|
|
void parseResponse(const QString &response, bool success);
|
|
void updateCurrentRoute();
|
|
|
|
private:
|
|
void showEvent(QShowEvent *event) override;
|
|
void refresh();
|
|
|
|
Params params;
|
|
QString cur_destinations;
|
|
QVBoxLayout *destinations_layout;
|
|
std::unique_ptr<NavDestination> current_destination;
|
|
DestinationWidget *current_widget;
|
|
|
|
QPixmap close_icon;
|
|
|
|
signals:
|
|
void closeSettings();
|
|
};
|
|
|
|
class NavDestination {
|
|
public:
|
|
explicit NavDestination(const QJsonObject &place)
|
|
: type_(place["save_type"].toString()), label_(place["label"].toString()),
|
|
name_(place["place_name"].toString()), details_(place["place_details"].toString()),
|
|
latitude_(place["latitude"].toDouble()), longitude_(place["longitude"].toDouble()) {
|
|
// if details starts with `name, ` remove it
|
|
if (details_.startsWith(name_ + ", ")) {
|
|
details_ = details_.mid(name_.length() + 2);
|
|
}
|
|
}
|
|
|
|
QString type() const { return type_; }
|
|
QString label() const { return label_; }
|
|
QString name() const { return name_; }
|
|
QString details() const { return details_; }
|
|
|
|
bool isFavorite() const { return type_ == NAV_TYPE_FAVORITE; }
|
|
bool isRecent() const { return type_ == NAV_TYPE_RECENT; }
|
|
|
|
bool operator==(const NavDestination &rhs) {
|
|
return type_ == rhs.type_ && label_ == rhs.label_ && name_ == rhs.name_ &&
|
|
details_ == rhs.details_ && latitude_ == rhs.latitude_ && longitude_ == rhs.longitude_;
|
|
}
|
|
|
|
QJsonObject toJson() const {
|
|
QJsonObject obj;
|
|
obj["save_type"] = type_;
|
|
obj["label"] = label_;
|
|
obj["place_name"] = name_;
|
|
obj["place_details"] = details_;
|
|
obj["latitude"] = latitude_;
|
|
obj["longitude"] = longitude_;
|
|
return obj;
|
|
}
|
|
|
|
private:
|
|
QString type_, label_, name_, details_;
|
|
double latitude_, longitude_;
|
|
};
|
|
|
|
class DestinationWidget : public QPushButton {
|
|
Q_OBJECT
|
|
public:
|
|
explicit DestinationWidget(QWidget *parent = nullptr);
|
|
|
|
void set(NavDestination *, bool current = false);
|
|
void unset(const QString &label, bool current = false);
|
|
|
|
signals:
|
|
void actionClicked();
|
|
|
|
private:
|
|
struct NavIcons {
|
|
QPixmap home, work, favorite, recent, directions;
|
|
};
|
|
|
|
static NavIcons icons() {
|
|
static NavIcons nav_icons {
|
|
loadPixmap("../assets/navigation/icon_home.svg", {48, 48}),
|
|
loadPixmap("../assets/navigation/icon_work.svg", {48, 48}),
|
|
loadPixmap("../assets/navigation/icon_favorite.svg", {48, 48}),
|
|
loadPixmap("../assets/navigation/icon_recent.svg", {48, 48}),
|
|
loadPixmap("../assets/navigation/icon_directions.svg", {48, 48}),
|
|
};
|
|
return nav_icons;
|
|
}
|
|
|
|
private:
|
|
QLabel *icon, *title, *subtitle;
|
|
QPushButton *action;
|
|
};
|
|
|