מיקום שיתוף ב-QT Client
איך להשתמש בו?
שימוש קל
בשיחה, המשתמש יכול ללחוץ על הדמות של המיקום כדי להציג מפה. אם Location Services
הוא פעיל על המכשיר, המיקום של המשתמש יראה על המפה, יחד עם המיקומים של כל חברי אחרים המשתתפים במיקומם (מכל השיחות של החשבון הנבחר). המשתמש יכול להפעיל ולתנת שיתוף מיקום על ידי ללחוץ על כפתורים שיתוף מיקום. בדפוס, המיקום של המשתמש משתף במשך 15 דקות, אך ההגדרות הזו ניתן לשנות בהגדרות של האפליקציה.
כאשר משתמש משתף את מיקומו בשיחה, ייראה סמל מיקום אדום על סמל השיחה. אם המשתמש מקבל מיקום מחבר אחר, ייראה סמל מיקום כתום על כל השיחות שבהן החבר נוכח.
המשתמש יכול לתקשר עם המפה על ידי מעודכנות, הזום, זז, וסגור אותה. המפה יכולה גם להיות מחוסרת או לא מחוסרת. כאשר המפה אינה מחוסרת, היא יכולה להיות מחוסרת אם המשתמש נמצא בחשבון הנכון. תכונה זו מאפשרת למשתמש לשמור על המפה ברורה תוך המשך להשתמש בג’מי.
שימוש מתקדם
שיתוף רב
סצנתר
המשתמש כבר משתף את המיקום עם שיחה A ושיחה B.
תכונה
אם המשתמש עובר לשיחה C, המפה עדיין נראית והמשתמש יש שתי אפשרויות
לחץ על כפתור שיתוף מיקום כדי גם לשתף מיקום עם חברי השיחה C.
לחץ על כפתור קץ שיתוף מיקום. זה יציג פופ-אפ המאפשר למשתמש או להפעיל את שיתוף מיקום לחלוטין או רק להפסיק לשתף את מיקומו עם חברי השיחה C.
חלון מופק
אם החלון אינו מחובר, המשתמש לא יוכל ללחוץ על כפתור שיתוף המיקום מכיוון שהחלון אינו מחובר יותר לשיחה. כדי להתחיל לשתף את המיקום עם אנשים חדשים, המשתמש חייב לחבר מחדש את החלון. ציין כי פנוי החלון אינו משפיע על שיתוף המיקום המתמשך. בנוסף, ללחוץ על כפתור סוף שיתוף המיקום בזמן שהחלון מחובר יפסיק את כל שיתוף המיקום הנוכחי ולא יופיע פופ-אפ לאפשר למשתמש לבחור שיחה מסוימת להפסיק לשתף.
חשבונות רבים
לכל חשבון יש מפה ייחודית משלה. אם המשתמש מפיל את המפה בזמן שעל חשבון A, ואז עובר לחשבון B ומפיל את המפה, שתי מפות יראו. המפות עבור חשבונות A ו-B מציגות את המקומות המשותפים עם חשבונות אלה, בהתאמה, והם נפרדים לחלוטין אחד מהשני
איך זה עובד?
הקדמה
תכונה זו מחולקת לשלושה חלקים:
שולח את עמדתו של אחד
מקבלת משרה
הצגת עמדה
כדי לקבוע את המיקום, [Qt Positioning] (https://doc.qt.io/qt-6/qtpositioning-index.html) API משמש. לאחר שהמיקום נקבע, הוא נשלח כתודעה על DHT ונעברת לקלינט. המיקום הנקבל מופיע לאחר מכן באמצעות ספריית JavaScript [OpenLayers] (https://openlayers.org/).
שלוח עמדה
ברגע שמפת נפתחת, מעמד Positioning
מטפל בקבלת העמדה הנוכחית באמצעות מעמד QGeoPositionInfoSource
של מודול QtPositioning
. מעמד זה הופך לעצב JSON ומעבר ל positionManager
. מעמד זה מתאים לכל תהליך שיתוף העמדה. מעמד זה משותף באמצעות פונקציה sendPosition()
. הוא משותף:
מקומית באמצעות סימן
localPositionReceived
כך שהמשתמש יוכל לראות את עמדתו שלוב- DHT לכל השיחות ברשימה
positionShareConvIds_
. ברשימה זו מכילים את המפתחות של כל השיחות שבהן המשתמש רוצה לשתף את עמדתו. מרמז זה, מקבלים את URI של כל המשתתפים ומשלחים מסר עמדות לכל משתתף.
פורמט JSON של עמדה הוא כדלקמן:
סוג (מסר עמדות או עצירה)
אוחרים
אורך
זמן (לא בשימוש על ידי הקבלן)
דוגמה של נתונים: {\"lat\":45.51616583988481,\"long\":-73.620693,\"זמן\":1671658862000,\"סוג\":\"מעמד\"}
כאשר שולחים את המיקום לדיימון, URI של המחבר מועבר גם.
כאשר המשתמש מפסיק לשתף את עמדתו בשיחה, ID של השיחה פשוט מוסר מהרשימה positionShareConvIds_
. הודעה ”פסק“ נשלחת גם לכל משתתף.
מקבלת משרה
כאשר נקלט עמדה, זה מפעיל את הפלט »onPositionReceived() ». בין אם זה עמדה מקומית ממודול QtPositioning
או עמדה ממתקשר אחר. ברמה positionManager
, רשימת objectListSharingUris_
מאחסנת את כל עמדות הלקוח.
הוספת (ה-URI לא נוכח ברשימה)
מעודכנת (ה-URI כבר קיים ברשימה)
מחוקק (סוג = ”מפסק“)
המיקום מאוחסן ברשימה בצורה של אובייקט של סוג positionObject
. סוג זה מאפשר שמרש כל עמדה. אם המיקום אינו מעודכן בתוך תקופה מסוימת, הוא מוסר מהרשימה.
הצגת עמדה
כאשר נקלט עמדה (slot onPositionReceived()
) נפעיל, עמדה מועברת ל Qml אשר בתורו שולחת את המידע לספרייה [OpenLayers]https://openlayers.org/) JavaScript. מודול Qt WebEngine
מאפשר לגשר בין הטכנולוגיה האינטרנט של הספרייה ו- Qml. כל עמדה נצגנת על ידי שכבה הוספת למפה. פונקציה newPosition()
מוסיפה שכבה חדשה, פונקציה updatePosition()
מעדכן את הקואורדינטות של שכבה, ו פונקציה removePosition()
מורידה את שכבה.