InterfaceGPS 0.1.0
Interface embarquée Qt pour navigation, multimédia, caméra et télémétrie
Chargement...
Recherche...
Aucune correspondance
homeassistant.cpp
Aller à la documentation de ce fichier.
1
10#include "homeassistant.h"
11#include "clavier.h"
12#include <QVBoxLayout>
13#include <QWebEngineSettings>
14#include <QWebEngineProfile>
15#include <QApplication>
16#include <QTimer>
17
18HAPage::HAPage(QWebEngineProfile* profile, QObject* parent) : QWebEnginePage(profile, parent) {}
19
20void HAPage::javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString &message, int lineNumber, const QString &sourceID) {
21 // Écoute spécifique du message "SHOW_KEYBOARD" envoyé par notre script injecté
22 if (message == "SHOW_KEYBOARD") {
24 }
25
26 // Appel de la méthode parente pour conserver le comportement standard
27 QWebEnginePage::javaScriptConsoleMessage(level, message, lineNumber, sourceID);
28}
29
30HomeAssistant::HomeAssistant(QWidget* parent) : QWidget(parent) {
31 QVBoxLayout* layout = new QVBoxLayout(this);
32 layout->setContentsMargins(0, 0, 0, 0);
33
34 // --- CONFIGURATION DU PROFIL WEB (Persistance) ---
35 // Permet de conserver la session de connexion à Home Assistant entre les redémarrages.
36 QWebEngineProfile *profile = new QWebEngineProfile("HA_Profile", this);
37 profile->setPersistentStoragePath(qApp->applicationDirPath() + "/web_data");
38 profile->setPersistentCookiesPolicy(QWebEngineProfile::ForcePersistentCookies);
39
40 // Instanciation de notre page personnalisée pour l'interception des logs
41 HAPage *page = new HAPage(profile, this);
42
43 // Liaison du signal de la page au déclenchement du clavier C++
44 connect(page, &HAPage::showKeyboardRequested, this, &HomeAssistant::openKeyboard);
45
46 m_view = new QWebEngineView(this);
47 m_view->setPage(page);
48
49 // --- CONFIGURATION DES PERFORMANCES WEBENGINE ---
50 QWebEngineSettings *s = m_view->settings();
51 s->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true);
52 s->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true);
53 s->setAttribute(QWebEngineSettings::AllowRunningInsecureContent, true); // Requis si HA n'est pas en HTTPS localement
54 s->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture, false);
55 s->setAttribute(QWebEngineSettings::LocalStorageEnabled, true);
56 s->setAttribute(QWebEngineSettings::Accelerated2dCanvasEnabled, true); // Boost l'affichage des graphiques
57 s->setAttribute(QWebEngineSettings::WebGLEnabled, true);
58 s->setAttribute(QWebEngineSettings::ScrollAnimatorEnabled, true); // Rendu fluide du défilement
59
60 // URL locale du serveur Home Assistant
61 m_view->setUrl(QUrl("http://192.168.1.158:8123"));
62
63 // --- INJECTION JAVASCRIPT ---
64 // Une fois la page chargée, on injecte un script qui écoute les clics sur les champs de texte
65 connect(m_view, &QWebEngineView::loadFinished, [this]() {
66 m_view->page()->runJavaScript(
67 "window._ha_last_input = null;"
68 "window.addEventListener('focusin', (e) => {"
69 " let active = e.composedPath()[0];"
70 " if (active && (active.tagName === 'INPUT' || active.tagName === 'TEXTAREA')) {"
71 " window._ha_last_input = active;"
72 " console.log('SHOW_KEYBOARD');" // Ce message est intercepté par HAPage
73 " }"
74 "});"
75 );
76 });
77
78 layout->addWidget(m_view);
79}
80
81void HomeAssistant::openKeyboard() {
82 // Sécurité "Anti-Rebond" (Debounce) pour éviter d'ouvrir 10 claviers
83 // si le JavaScript s'emballe et envoie plusieurs événements d'un coup.
84 static bool isKeyboardOpen = false;
85 if (isKeyboardOpen) return;
86
87 isKeyboardOpen = true;
88
89 // Instanciation modale du clavier virtuel
90 Clavier clavier(this);
91
92 // Si l'utilisateur valide sa saisie
93 if (clavier.exec() == QDialog::Accepted) {
94 QString res = clavier.getText();
95
96 // Échappement des guillemets pour ne pas casser la syntaxe JavaScript lors de l'injection
97 res.replace("'", "\\'");
98 res.replace("\"", "\\\"");
99
100 // Script JavaScript pour injecter le texte dans le champ web ciblé
101 // et simuler les événements "input" et "change" pour que le framework web (ex: Vue/React) prenne en compte la valeur.
102 QString js = QString(
103 "if (window._ha_last_input) {"
104 " window._ha_last_input.value = '%1';"
105 " window._ha_last_input.dispatchEvent(new Event('input', { bubbles: true }));"
106 " window._ha_last_input.dispatchEvent(new Event('change', { bubbles: true }));"
107 " window._ha_last_input.blur();"
108 "}"
109 ).arg(res);
110
111 m_view->page()->runJavaScript(js);
112 } else {
113 // Si l'utilisateur annule (ferme le clavier sans valider), on retire le focus HTML
114 m_view->page()->runJavaScript(
115 "if (window._ha_last_input) {"
116 " window._ha_last_input.blur();"
117 "}"
118 );
119 }
120
121 // Réinitialisation du verrouillage Anti-Rebond après un court délai
122 QTimer::singleShot(400, []() {
123 isKeyboardOpen = false;
124 });
125}
Interface de saisie tactile sur mesure pour l'application embarquée. S'ouvre sous forme de boîte de d...
Definition clavier.h:29
Surcharge de la page web pour intercepter les événements de la console. Cette classe permet d'écouter...
HAPage(QWebEngineProfile *profile, QObject *parent=nullptr)
Constructeur de la page web personnalisée.
void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString &message, int lineNumber, const QString &sourceID) override
Intercepte les messages de la console JavaScript. Si le message correspond à un mot-clé précis (ex: "...
void showKeyboardRequested()
Émis lorsque le code JavaScript détecte un focus sur un champ de saisie.
HomeAssistant(QWidget *parent=nullptr)
Constructeur de l'interface Home Assistant.
Rôle architectural : Clavier virtuel propriétaire utilisé par les écrans de saisie.
Rôle architectural : Intégration embarquée de l'interface Home Assistant.