29 m_suggestionsModel =
new QStringListModel(
this);
30 m_searchCompleter =
new QCompleter(m_suggestionsModel,
this);
31 m_searchCompleter->setCaseSensitivity(Qt::CaseInsensitive);
32 m_searchCompleter->setFilterMode(Qt::MatchContains);
33 m_searchCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
34 ui->editSearch->setCompleter(m_searchCompleter);
37 ui->editSearch->installEventFilter(
this);
41 m_suggestionDebounceTimer =
new QTimer(
this);
42 m_suggestionDebounceTimer->setSingleShot(
true);
43 m_suggestionDebounceTimer->setInterval(800);
46 connect(m_searchCompleter,
static_cast<void (QCompleter::*)(
const QString &)
>(&QCompleter::activated),
47 this, &NavigationPage::onSuggestionChosen);
49 connect(m_suggestionDebounceTimer, &QTimer::timeout,
50 this, &NavigationPage::triggerSuggestionsSearch);
52 connect(ui->editSearch, &QLineEdit::textEdited,
this, [
this](
const QString &text) {
53 if (!m_ignoreTextUpdate && text.length() >= 2) {
54 m_suggestionDebounceTimer->start();
60 m_mapView =
new QQuickWidget(
this);
63 QString mapboxKey = QString::fromLocal8Bit(qgetenv(
"MAPBOX_API_KEY")).trimmed();
66 m_mapView->rootContext()->setContextProperty(
"mapboxApiKey", mapboxKey);
67 m_mapView->setResizeMode(QQuickWidget::SizeRootObjectToView);
70 auto setupQmlConnections = [
this]() {
71 QObject* root = m_mapView->rootObject();
73 connect(root, SIGNAL(routeInfoUpdated(QString,QString)),
this, SLOT(onRouteInfoReceived(QString,QString)));
74 connect(root, SIGNAL(suggestionsUpdated(QString)),
this, SLOT(onSuggestionsReceived(QString)));
78 connect(m_mapView, &QQuickWidget::statusChanged,
this, [setupQmlConnections](QQuickWidget::Status status){
79 if (status == QQuickWidget::Ready) setupQmlConnections();
83 m_mapView->setSource(QUrl(
"qrc:/map.qml"));
84 ui->mapLayout->addWidget(m_mapView);
87 connect(ui->btnZoomIn, &QPushButton::clicked,
this, [
this](){
88 if (m_mapView && m_mapView->rootObject()) {
89 double z = m_mapView->rootObject()->property(
"carZoom").toDouble();
90 m_mapView->rootObject()->setProperty(
"carZoom", z + 1);
93 connect(ui->btnZoomOut, &QPushButton::clicked,
this, [
this](){
94 if (m_mapView && m_mapView->rootObject()) {
95 double z = m_mapView->rootObject()->property(
"carZoom").toDouble();
96 m_mapView->rootObject()->setProperty(
"carZoom", z - 1);
99 connect(ui->btnCenter, &QPushButton::clicked,
this, [
this](){
100 if(m_mapView && m_mapView->rootObject()) {
101 QMetaObject::invokeMethod(m_mapView->rootObject(),
"recenterMap");
104 connect(ui->btnToggleSearch, &QPushButton::clicked,
this, [
this](){
105 setSearchControlsVisible(!ui->editSearch->isVisible());
107 connect(ui->btnStopRoute, &QPushButton::clicked,
this, [
this](){
108 if (m_mapView && m_mapView->rootObject()) {
109 QMetaObject::invokeMethod(m_mapView->rootObject(),
"stopNavigation");
111 setSearchControlsVisible(
true);
113 connect(ui->btnSearch, &QPushButton::clicked,
this, [
this](){
114 requestRouteForText(ui->editSearch->text());
Contrôleur de la page de navigation GPS. Héberge la carte (codée en QML) au sein de l'interface C++....
void routeSearchRequested(const QString &destination)
Demande le calcul d'un itinéraire vers une destination textuelle.
void suggestionsSearchRequested(const QString &query)
Demande une liste de suggestions d'adresses pour l'autocomplétion.
void telemetryRefreshRequested(double lat, double lon, double heading, double speedKmh)
Transporte un snapshot télémétrique vers la couche cartographique.
void bindTelemetry(TelemetryData *t)
Connecte le bus de télémétrie à la carte.
bool eventFilter(QObject *obj, QEvent *event) override
Filtre d'événements global pour ce widget. Utilisé ici pour intercepter les clics sur la barre de rec...
NavigationPage(QWidget *parent=nullptr)
Constructeur de la page de navigation.
Rôle architectural : Façade Widget de la navigation cartographique.