Localizare împărțită pe clientul QT

Cum să-l folosesc?

Utilizare trivială

În cadrul unei conversații, utilizatorul poate face clic pe icoana locației pentru a afișa o hartă. Dacă Location Services este activat pe dispozitiv, poziția utilizatorului va fi afișată pe hartă, împreună cu locațiile tuturor celorlalți membri care își împărtășesc locația (din toate conversațiile contului selectat). Utilizatorul poate activa și dezactiva partajarea locației făcând clic pe butoanele de partajare a locației. De parțial, locația utilizatorului este partajată timp de 15 minute, dar această setare poate fi modificată în setările aplicației.

Când un utilizator își împărtășește locația în o conversație, o pictură roșie a locației va apărea pe icoana conversației. Dacă utilizatorul primește o locație de la un alt membru, o pictură portocalie a locației va fi afișată pe toate conversațiile în care este prezentul membru.

Utilizatorul poate interacționa cu harta prin recentare, zoomare, mutare și închidere. Harta poate fi, de asemenea, fixată sau despinsată. Când harta este despinsă, poate fi repinsată dacă utilizatorul este în contul potrivit. Această caracteristică permite utilizatorului să păstreze harta vizibilă în timp ce continuă să folosească Jami.

Utilizare avansată

Multipărire

scenariu

Utilizatorul împărtășește deja locația cu conversația A și conversația B.

Caracteristica

Dacă utilizatorul trece la conversație C, harta este încă vizibilă și utilizatorul are două opțiuni

  1. Faceți clic pe butonul de partajare a locatiei pentru a împărtăși, de asemenea, locația cu membrii conversației C.

  2. Faceți clic pe butonul de sfârșit al partajării locației. Acest lucru va apărea într-un pop-up care permite utilizatorului să dezactiveze partajarea locației în întregime sau să nu mai împărtășească locația cu membrii conversației C.

Ferestrele cu șapte

Dacă fereastra este desființată, utilizatorul nu va putea să facă clic pe butonul de partajare a locatiei deoarece fereastra nu mai este conectată la o conversație. Pentru a începe partajarea locatiei cu noi persoane, utilizatorul trebuie să re-pin fereastra.

Conturi multiple

Fiecare cont are propria sa harta unica. Dacă utilizatorul desface harta în timp ce se află pe contul A, apoi trece la contul B și desface harta, două hărți vor fi vizibile. Hărțile pentru conturile A și B afișează pozițiile împărțite cu aceste conturi, respectiv, și sunt complet separate una de alta

Cum funcţionează?

Introducere

Această caracteristică este împărțită în trei părți:

  1. Trimite poziţia

  2. Primirea unei poziții

  3. Afișarea unei poziții

Pentru a determina locația, este utilizat [Qt Positioning]https://doc.qt.io/qt-6/qtpositioning-index.html) API. Odată ce poziția este determinată, este trimisă ca un mesaj pe DHT și este transmisă clientului. Poziția primită este apoi afișată folosind biblioteca JavaScript [OpenLayers]https://openlayers.org/).

Trimiterea unei poziții

De îndată ce o hartă este deschisă, clasa Positioning se ocupă de recuperarea poziției curente folosind clasa QGeoPositionInfoSource a modulei QtPositioning. Poziția este apoi convertisă în format JSON și este transmisă la positionManager. Această clasă coordonează întregul proces de partajare a pozițiilor. Poziția este apoi împărtășită prin funcția sendPosition().

  • Localizat prin semnalul localPositionReceived astfel încât utilizatorul să poată vedea propria sa poziție

  • În DHT, toate conversațiile sunt incluse în lista positionShareConvIds_. Această listă conține cheile tuturor conversațiilor cu care utilizatorul dorește să își împărtășească poziția.

Formatul JSON al unei poziții este următorul:

  • Tip (seriul de poziție sau de oprire)

  • Latitudinea

  • Lungiţitudinea

  • Timp (neutilizat de QtClient)

Un exemplu de date: {\"lat\":45.51616583988481,\"long\":-73.620693,\"time\":1671658862000,\"type\":\"Posiție\"}

Când trimite poziția la daemon, URI autorului este transmisă, de asemenea.

Când utilizatorul încetează să își împărtășească poziția cu o conversație, ID-ul conversației este pur și simplu eliminat din lista positionShareConvIds_.

Primirea unei poziții

Când o poziție este primită, aceasta declanșează slotul „onPositionReceived() „. Indiferent dacă este vorba de o poziție locală din modulul QtPositioning sau o poziție dintr-un alt contact. La nivelul positionManager, lista objectListSharingUris_ stochează toate pozițiile clientului. Poziția este fie:

  • Adăugată (URI nu este prezentă în listă)

  • Actualizate (URI-ul este deja prezent în listă)

  • În cazul în care se utilizează un sistem de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului de control al sistemului (SCSD)

Poziția este stocată în listă sub forma unui obiect de tip positionObject. Acest tip permite un câine de supraveghere pentru fiecare poziție.

Afișarea unei poziții

Când o poziție este primită (slot onPositionReceived() ), poziția este transmisă la Qml, care la rândul său trimite informațiile la biblioteca JavaScript [https://openlayers.org/). Modul Qt WebEngine permite să creeze podul între tehnologia web a bibliotecii și Qml. Fiecare poziție este reprezentată de un strat adăugat la hartă. Funcția newPosition() adaugă un strat nou, funcția updatePosition() actualizează coordonatele stratului, iar funcția removePosition() elimina stratul.