feat: Enhance message handling for drawings

- Added properties to the Message model to track drawing status and associated drawing ID.
- Updated AppProvider to mark messages as drawings and link them to their respective drawing IDs.
- Enhanced DrawingProvider to manage received drawings and their visibility.
- Implemented navigation to drawings in MapProvider, including dynamic zoom levels based on drawing size.
- Updated MessagesProvider to parse drawing messages and manage linked drawings.
- Enhanced MessagesTab to support drawing message interactions, including navigation and coordinate copying.
- Created DrawingMinimapPreview widget for visual representation of drawings in message bubbles.
- Improved DrawingToolbar to handle sharing of drawings, ensuring only unshared drawings are sent.
- Added utility functions in DrawingMessageParser for extracting drawing metadata.
This commit is contained in:
Janez T
2025-10-23 20:14:51 +02:00
parent f32667997e
commit 1688d6f538
25 changed files with 1504 additions and 114 deletions

View File

@@ -2508,5 +2508,18 @@
"sampleEchoSupport": "Unterstützung",
"sampleBaseCommand": "Basis-Kommando",
"sampleFieldCoordinator": "Feldkoordinator",
"sampleMedicalTeam": "Medizinisches Team"
"sampleMedicalTeam": "Medizinisches Team",
"mapDrawing": "Kartenzeichnung",
"drawingShared": "Kartenzeichnung",
"lineDrawing": "Linie",
"rectangleDrawing": "Rechteck",
"navigateToDrawing": "Zur Zeichnung navigieren",
"hideFromMap": "Von Karte ausblenden",
"copyCoordinates": "Koordinaten kopieren",
"coordinatesCopiedToClipboard": "Koordinaten in Zwischenablage kopiert",
"drawingHidden": "Zeichnung von Karte ausgeblendet",
"alreadyShared": "{count} bereits geteilt",
"newDrawingsShared": "{count} neue Zeichnung(en) geteilt",
"drawingTools": "Zeichenwerkzeuge"
}

View File

@@ -2990,5 +2990,73 @@
"sampleMedicalTeam": "Medical Team",
"@sampleMedicalTeam": {
"description": "Sample team name"
},
"mapDrawing": "Map Drawing",
"@mapDrawing": {
"description": "Label for map drawing messages"
},
"navigateToDrawing": "Navigate to Drawing",
"@navigateToDrawing": {
"description": "Option to navigate to drawing on map"
},
"copyCoordinates": "Copy Coordinates",
"@copyCoordinates": {
"description": "Option to copy coordinates to clipboard"
},
"hideFromMap": "Hide from Map",
"@hideFromMap": {
"description": "Option to hide drawing from map"
},
"lineDrawing": "Line Drawing",
"@lineDrawing": {
"description": "Label for line type drawings"
},
"rectangleDrawing": "Rectangle Drawing",
"@rectangleDrawing": {
"description": "Label for rectangle type drawings"
},
"coordinatesCopiedToClipboard": "Coordinates copied to clipboard",
"@coordinatesCopiedToClipboard": {
"description": "Success message when coordinates are copied"
},
"drawingShared": "Map Drawing",
"@drawingShared": {
"description": "Label for shared drawing notifications"
},
"drawingHidden": "Drawing hidden from map",
"@drawingHidden": {
"description": "Success message when drawing is hidden"
},
"alreadyShared": "{count, plural, =1{1 already shared} other{{count} already shared}}",
"@alreadyShared": {
"description": "Message showing how many drawings were already shared",
"placeholders": {
"count": {
"type": "int"
}
}
},
"newDrawingsShared": "Shared {count} new drawing{plural}",
"@newDrawingsShared": {
"description": "Success message after sharing new drawings",
"placeholders": {
"count": {
"type": "int"
},
"plural": {
"type": "String"
}
}
}
}

View File

@@ -2503,5 +2503,18 @@
"sampleEchoSupport": "Apoyo",
"sampleBaseCommand": "Comando de Base",
"sampleFieldCoordinator": "Coordinador de Campo",
"sampleMedicalTeam": "Equipo Médico"
"sampleMedicalTeam": "Equipo Médico",
"mapDrawing": "Dibujo del Mapa",
"drawingShared": "Dibujo del Mapa",
"lineDrawing": "Línea",
"rectangleDrawing": "Rectángulo",
"navigateToDrawing": "Navegar al Dibujo",
"hideFromMap": "Ocultar del Mapa",
"copyCoordinates": "Copiar Coordenadas",
"coordinatesCopiedToClipboard": "Coordenadas copiadas al portapapeles",
"drawingHidden": "Dibujo ocultado del mapa",
"alreadyShared": "{count} ya compartido",
"newDrawingsShared": "{count} nuevo(s) dibujo(s) compartido(s)",
"drawingTools": "Herramientas de Dibujo"
}

View File

@@ -2508,5 +2508,18 @@
"sampleEchoSupport": "Soutien",
"sampleBaseCommand": "Commandement de Base",
"sampleFieldCoordinator": "Coordinateur de Terrain",
"sampleMedicalTeam": "Équipe Médicale"
"sampleMedicalTeam": "Équipe Médicale",
"mapDrawing": "Dessin de Carte",
"drawingShared": "Dessin de Carte",
"lineDrawing": "Ligne",
"rectangleDrawing": "Rectangle",
"navigateToDrawing": "Naviguer vers le Dessin",
"hideFromMap": "Masquer de la Carte",
"copyCoordinates": "Copier les Coordonnées",
"coordinatesCopiedToClipboard": "Coordonnées copiées dans le presse-papiers",
"drawingHidden": "Dessin masqué de la carte",
"alreadyShared": "{count} déjà partagé",
"newDrawingsShared": "{count} nouveau(x) dessin(s) partagé(s)",
"drawingTools": "Outils de Dessin"
}

View File

@@ -918,5 +918,19 @@
"sampleEchoSupport": "Podrška",
"sampleBaseCommand": "Zapovjedništvo Baze",
"sampleFieldCoordinator": "Terenski Koordinator",
"sampleMedicalTeam": "Medicinski Tim"
"sampleMedicalTeam": "Medicinski Tim",
"mapDrawing": "Crtež karte",
"navigateToDrawing": "Navigiraj do crteža",
"copyCoordinates": "Kopiraj koordinate",
"hideFromMap": "Sakrij s karte",
"lineDrawing": "Linijski crtež",
"rectangleDrawing": "Pravokutni crtež",
"coordinatesCopiedToClipboard": "Koordinate kopirane u međuspremnik",
"drawingShared": "Crtež karte",
"drawingHidden": "Crtež sakriven s karte",
"alreadyShared": "{count, plural, =1{1 već podijeljeno} other{{count} već podijeljeno}}",
"newDrawingsShared": "Podijeljeno {count} novi{plural} crtež{plural}",
"drawingTools": "Alati za crtanje"
}

View File

@@ -2508,5 +2508,18 @@
"sampleEchoSupport": "Supporto",
"sampleBaseCommand": "Comando di Base",
"sampleFieldCoordinator": "Coordinatore sul Campo",
"sampleMedicalTeam": "Team Medico"
"sampleMedicalTeam": "Team Medico",
"mapDrawing": "Disegno della Mappa",
"drawingShared": "Disegno della Mappa",
"lineDrawing": "Linea",
"rectangleDrawing": "Rettangolo",
"navigateToDrawing": "Naviga al Disegno",
"hideFromMap": "Nascondi dalla Mappa",
"copyCoordinates": "Copia Coordinate",
"coordinatesCopiedToClipboard": "Coordinate copiate negli appunti",
"drawingHidden": "Disegno nascosto dalla mappa",
"alreadyShared": "{count} già condiviso",
"newDrawingsShared": "{count} nuovo(i) disegno(i) condiviso(i)",
"drawingTools": "Strumenti di Disegno"
}

View File

@@ -3188,6 +3188,72 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Medical Team'**
String get sampleMedicalTeam;
/// Label for map drawing messages
///
/// In en, this message translates to:
/// **'Map Drawing'**
String get mapDrawing;
/// Option to navigate to drawing on map
///
/// In en, this message translates to:
/// **'Navigate to Drawing'**
String get navigateToDrawing;
/// Option to copy coordinates to clipboard
///
/// In en, this message translates to:
/// **'Copy Coordinates'**
String get copyCoordinates;
/// Option to hide drawing from map
///
/// In en, this message translates to:
/// **'Hide from Map'**
String get hideFromMap;
/// Label for line type drawings
///
/// In en, this message translates to:
/// **'Line Drawing'**
String get lineDrawing;
/// Label for rectangle type drawings
///
/// In en, this message translates to:
/// **'Rectangle Drawing'**
String get rectangleDrawing;
/// Success message when coordinates are copied
///
/// In en, this message translates to:
/// **'Coordinates copied to clipboard'**
String get coordinatesCopiedToClipboard;
/// Label for shared drawing notifications
///
/// In en, this message translates to:
/// **'Map Drawing'**
String get drawingShared;
/// Success message when drawing is hidden
///
/// In en, this message translates to:
/// **'Drawing hidden from map'**
String get drawingHidden;
/// Message showing how many drawings were already shared
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 already shared} other{{count} already shared}}'**
String alreadyShared(int count);
/// Success message after sharing new drawings
///
/// In en, this message translates to:
/// **'Shared {count} new drawing{plural}'**
String newDrawingsShared(int count, String plural);
}
class _AppLocalizationsDelegate

View File

@@ -1782,4 +1782,42 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get sampleMedicalTeam => 'Medizinisches Team';
@override
String get mapDrawing => 'Kartenzeichnung';
@override
String get navigateToDrawing => 'Zur Zeichnung navigieren';
@override
String get copyCoordinates => 'Koordinaten kopieren';
@override
String get hideFromMap => 'Von Karte ausblenden';
@override
String get lineDrawing => 'Linie';
@override
String get rectangleDrawing => 'Rechteck';
@override
String get coordinatesCopiedToClipboard =>
'Koordinaten in Zwischenablage kopiert';
@override
String get drawingShared => 'Kartenzeichnung';
@override
String get drawingHidden => 'Zeichnung von Karte ausgeblendet';
@override
String alreadyShared(int count) {
return '$count bereits geteilt';
}
@override
String newDrawingsShared(int count, String plural) {
return '$count neue Zeichnung(en) geteilt';
}
}

View File

@@ -1758,4 +1758,47 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get sampleMedicalTeam => 'Medical Team';
@override
String get mapDrawing => 'Map Drawing';
@override
String get navigateToDrawing => 'Navigate to Drawing';
@override
String get copyCoordinates => 'Copy Coordinates';
@override
String get hideFromMap => 'Hide from Map';
@override
String get lineDrawing => 'Line Drawing';
@override
String get rectangleDrawing => 'Rectangle Drawing';
@override
String get coordinatesCopiedToClipboard => 'Coordinates copied to clipboard';
@override
String get drawingShared => 'Map Drawing';
@override
String get drawingHidden => 'Drawing hidden from map';
@override
String alreadyShared(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count already shared',
one: '1 already shared',
);
return '$_temp0';
}
@override
String newDrawingsShared(int count, String plural) {
return 'Shared $count new drawing$plural';
}
}

View File

@@ -373,7 +373,7 @@ class AppLocalizationsEs extends AppLocalizations {
String get deleteDrawing => 'Eliminar dibujo';
@override
String get drawingTools => 'Herramientas de dibujo';
String get drawingTools => 'Herramientas de Dibujo';
@override
String get drawLine => 'Dibujar línea';
@@ -1783,4 +1783,42 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get sampleMedicalTeam => 'Equipo Médico';
@override
String get mapDrawing => 'Dibujo del Mapa';
@override
String get navigateToDrawing => 'Navegar al Dibujo';
@override
String get copyCoordinates => 'Copiar Coordenadas';
@override
String get hideFromMap => 'Ocultar del Mapa';
@override
String get lineDrawing => 'Línea';
@override
String get rectangleDrawing => 'Rectángulo';
@override
String get coordinatesCopiedToClipboard =>
'Coordenadas copiadas al portapapeles';
@override
String get drawingShared => 'Dibujo del Mapa';
@override
String get drawingHidden => 'Dibujo ocultado del mapa';
@override
String alreadyShared(int count) {
return '$count ya compartido';
}
@override
String newDrawingsShared(int count, String plural) {
return '$count nuevo(s) dibujo(s) compartido(s)';
}
}

View File

@@ -375,7 +375,7 @@ class AppLocalizationsFr extends AppLocalizations {
String get deleteDrawing => 'Supprimer le dessin';
@override
String get drawingTools => 'Outils de dessin';
String get drawingTools => 'Outils de Dessin';
@override
String get drawLine => 'Tracer une ligne';
@@ -1789,4 +1789,42 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get sampleMedicalTeam => 'Équipe Médicale';
@override
String get mapDrawing => 'Dessin de Carte';
@override
String get navigateToDrawing => 'Naviguer vers le Dessin';
@override
String get copyCoordinates => 'Copier les Coordonnées';
@override
String get hideFromMap => 'Masquer de la Carte';
@override
String get lineDrawing => 'Ligne';
@override
String get rectangleDrawing => 'Rectangle';
@override
String get coordinatesCopiedToClipboard =>
'Coordonnées copiées dans le presse-papiers';
@override
String get drawingShared => 'Dessin de Carte';
@override
String get drawingHidden => 'Dessin masqué de la carte';
@override
String alreadyShared(int count) {
return '$count déjà partagé';
}
@override
String newDrawingsShared(int count, String plural) {
return '$count nouveau(x) dessin(s) partagé(s)';
}
}

View File

@@ -1766,4 +1766,48 @@ class AppLocalizationsHr extends AppLocalizations {
@override
String get sampleMedicalTeam => 'Medicinski Tim';
@override
String get mapDrawing => 'Crtež karte';
@override
String get navigateToDrawing => 'Navigiraj do crteža';
@override
String get copyCoordinates => 'Kopiraj koordinate';
@override
String get hideFromMap => 'Sakrij s karte';
@override
String get lineDrawing => 'Linijski crtež';
@override
String get rectangleDrawing => 'Pravokutni crtež';
@override
String get coordinatesCopiedToClipboard =>
'Koordinate kopirane u međuspremnik';
@override
String get drawingShared => 'Crtež karte';
@override
String get drawingHidden => 'Crtež sakriven s karte';
@override
String alreadyShared(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count već podijeljeno',
one: '1 već podijeljeno',
);
return '$_temp0';
}
@override
String newDrawingsShared(int count, String plural) {
return 'Podijeljeno $count novi$plural crtež$plural';
}
}

View File

@@ -374,7 +374,7 @@ class AppLocalizationsIt extends AppLocalizations {
String get deleteDrawing => 'Elimina Disegno';
@override
String get drawingTools => 'Strumenti di disegno';
String get drawingTools => 'Strumenti di Disegno';
@override
String get drawLine => 'Disegna Linea';
@@ -1781,4 +1781,41 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get sampleMedicalTeam => 'Team Medico';
@override
String get mapDrawing => 'Disegno della Mappa';
@override
String get navigateToDrawing => 'Naviga al Disegno';
@override
String get copyCoordinates => 'Copia Coordinate';
@override
String get hideFromMap => 'Nascondi dalla Mappa';
@override
String get lineDrawing => 'Linea';
@override
String get rectangleDrawing => 'Rettangolo';
@override
String get coordinatesCopiedToClipboard => 'Coordinate copiate negli appunti';
@override
String get drawingShared => 'Disegno della Mappa';
@override
String get drawingHidden => 'Disegno nascosto dalla mappa';
@override
String alreadyShared(int count) {
return '$count già condiviso';
}
@override
String newDrawingsShared(int count, String plural) {
return '$count nuovo(i) disegno(i) condiviso(i)';
}
}

View File

@@ -1769,4 +1769,47 @@ class AppLocalizationsSl extends AppLocalizations {
@override
String get sampleMedicalTeam => 'Medicinska Ekipa';
@override
String get mapDrawing => 'Risba zemljevida';
@override
String get navigateToDrawing => 'Navigiraj do risbe';
@override
String get copyCoordinates => 'Kopiraj koordinate';
@override
String get hideFromMap => 'Skrij z zemljevida';
@override
String get lineDrawing => 'Linijska risba';
@override
String get rectangleDrawing => 'Pravokotna risba';
@override
String get coordinatesCopiedToClipboard => 'Koordinate kopirane v odložišče';
@override
String get drawingShared => 'Risba zemljevida';
@override
String get drawingHidden => 'Risba skrita z zemljevida';
@override
String alreadyShared(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count že deljeno',
one: '1 že deljeno',
);
return '$_temp0';
}
@override
String newDrawingsShared(int count, String plural) {
return 'Deljeno $count nov$plural risb$plural';
}
}

View File

@@ -918,5 +918,19 @@
"sampleEchoSupport": "Podpora",
"sampleBaseCommand": "Poveljstvo Baze",
"sampleFieldCoordinator": "Terenski Koordinator",
"sampleMedicalTeam": "Medicinska Ekipa"
"sampleMedicalTeam": "Medicinska Ekipa",
"mapDrawing": "Risba zemljevida",
"navigateToDrawing": "Navigiraj do risbe",
"copyCoordinates": "Kopiraj koordinate",
"hideFromMap": "Skrij z zemljevida",
"lineDrawing": "Linijska risba",
"rectangleDrawing": "Pravokotna risba",
"coordinatesCopiedToClipboard": "Koordinate kopirane v odložišče",
"drawingShared": "Risba zemljevida",
"drawingHidden": "Risba skrita z zemljevida",
"alreadyShared": "{count, plural, =1{1 že deljeno} other{{count} že deljeno}}",
"newDrawingsShared": "Deljeno {count} nov{plural} risb{plural}",
"drawingTools": "Orodja za risanje"
}