333 lines
6.4 KiB
Markdown
333 lines
6.4 KiB
Markdown
Sì Fabio, corretto: **quelli fanno parte della feature Activity**, ma sono in cartelle diverse perché non sono tutti widget.
|
|
|
|
La struttura completa oggi va vista divisa per livelli:
|
|
|
|
```text
|
|
1. Parser / utils
|
|
2. Modello dati
|
|
3. DB / bootstrap / scan
|
|
4. UI Activity
|
|
5. Preview / componenti UI
|
|
6. Dialog / formatter
|
|
```
|
|
|
|
***
|
|
|
|
## Struttura Activity attuale completa
|
|
|
|
### Parser e utility file attività
|
|
|
|
```text
|
|
lib/utils/activity_file_parser.dart
|
|
lib/utils/fit_activity_parser.dart
|
|
lib/utils/gpx_activity_parser.dart
|
|
lib/utils/tcx_activity_parser.dart
|
|
```
|
|
|
|
Questi gestiscono:
|
|
|
|
```text
|
|
- riconoscere file GPX / TCX / FIT
|
|
- leggere bytes file
|
|
- estrarre tracce GPS
|
|
- estrarre sport, distanza, quote, durata, metadata
|
|
- produrre ActivityTrack
|
|
```
|
|
|
|
***
|
|
|
|
### Modelli Activity
|
|
|
|
```text
|
|
lib/model/activity/activity_track.dart
|
|
lib/model/activity/activity_entry.dart
|
|
lib/model/activity/activity_preview_point.dart
|
|
```
|
|
|
|
Oggi dovresti avere anche:
|
|
|
|
```text
|
|
lib/model/activity/activity_scan_service.dart
|
|
lib/model/activity/activity_library_bootstrap.dart
|
|
```
|
|
|
|
Quindi la parte model Activity completa è circa:
|
|
|
|
```text
|
|
lib/model/activity/
|
|
├── activity_entry.dart
|
|
├── activity_library_bootstrap.dart
|
|
├── activity_preview_point.dart
|
|
├── activity_scan_service.dart
|
|
└── activity_track.dart
|
|
```
|
|
|
|
Ruoli:
|
|
|
|
```text
|
|
activity_track.dart
|
|
modello in memoria quando apro/parso un file attività
|
|
|
|
activity_entry.dart
|
|
modello persistito nel DB
|
|
|
|
activity_preview_point.dart
|
|
punti semplificati per thumbnail attività
|
|
|
|
activity_scan_service.dart
|
|
scansione cartella SAF, parsing, inserimento/aggiornamento DB
|
|
|
|
activity_library_bootstrap.dart
|
|
inizializzazione/bootstrap libreria attività
|
|
```
|
|
|
|
***
|
|
|
|
### UI Activity principale
|
|
|
|
```text
|
|
lib/widgets/activity/activity_files_page.dart
|
|
lib/widgets/activity/activity_map_page.dart
|
|
lib/widgets/activity/activity_auto_sync_controller.dart
|
|
```
|
|
|
|
Ruoli:
|
|
|
|
```text
|
|
activity_files_page.dart
|
|
pagina principale Activity, ora gestisce lista, sport, album, preferiti
|
|
|
|
activity_map_page.dart
|
|
mappa della singola attività
|
|
|
|
activity_auto_sync_controller.dart
|
|
scheduling scan automatico
|
|
```
|
|
|
|
***
|
|
|
|
### Componenti UI estratti
|
|
|
|
```text
|
|
lib/widgets/activity/activity_list_tile.dart
|
|
lib/widgets/activity/activity_sport_groups_view.dart
|
|
lib/widgets/activity/activity_album_groups_view.dart
|
|
```
|
|
|
|
Ruoli:
|
|
|
|
```text
|
|
activity_list_tile.dart
|
|
righe lista attività DB e attività aperte manualmente
|
|
|
|
activity_sport_groups_view.dart
|
|
griglia/card Sport tipo Album
|
|
|
|
activity_album_groups_view.dart
|
|
griglia/card Album attività
|
|
```
|
|
|
|
***
|
|
|
|
### Preview thumbnail Activity
|
|
|
|
```text
|
|
lib/widgets/activity/preview/activity_entry_preview.dart
|
|
lib/widgets/activity/preview/activity_track_preview.dart
|
|
```
|
|
|
|
Ruoli:
|
|
|
|
```text
|
|
activity_entry_preview.dart
|
|
disegna thumbnail da ActivityPreviewPoint salvati nel DB
|
|
|
|
activity_track_preview.dart
|
|
disegna thumbnail da ActivityTrack aperto manualmente
|
|
```
|
|
|
|
***
|
|
|
|
### Utility UI Activity
|
|
|
|
```text
|
|
lib/widgets/activity/utils/activity_formatters.dart
|
|
```
|
|
|
|
Ruolo:
|
|
|
|
```text
|
|
- format distanza
|
|
- format quota
|
|
- format data
|
|
- format durata
|
|
- delta distanza
|
|
- delta quota
|
|
- calcolo distanza traccia
|
|
- lettura diagnostics
|
|
- path validation Activity root
|
|
```
|
|
|
|
***
|
|
|
|
## Quindi la mappa completa consigliata ora è questa
|
|
|
|
```text
|
|
lib/
|
|
├── utils/
|
|
│ ├── activity_file_parser.dart
|
|
│ ├── fit_activity_parser.dart
|
|
│ ├── gpx_activity_parser.dart
|
|
│ └── tcx_activity_parser.dart
|
|
│
|
|
├── model/
|
|
│ └── activity/
|
|
│ ├── activity_entry.dart
|
|
│ ├── activity_library_bootstrap.dart
|
|
│ ├── activity_preview_point.dart
|
|
│ ├── activity_scan_service.dart
|
|
│ └── activity_track.dart
|
|
│
|
|
└── widgets/
|
|
└── activity/
|
|
├── activity_auto_sync_controller.dart
|
|
├── activity_files_page.dart
|
|
├── activity_list_tile.dart
|
|
├── activity_map_page.dart
|
|
├── activity_sport_groups_view.dart
|
|
├── activity_album_groups_view.dart
|
|
│
|
|
├── preview/
|
|
│ ├── activity_entry_preview.dart
|
|
│ └── activity_track_preview.dart
|
|
│
|
|
└── utils/
|
|
└── activity_formatters.dart
|
|
```
|
|
|
|
***
|
|
|
|
## Prossimi file che conviene creare
|
|
|
|
Per ridurre ancora `activity_files_page.dart`, io creerei questi:
|
|
|
|
```text
|
|
lib/widgets/activity/dialogs/activity_recalculate_dialog.dart
|
|
lib/widgets/activity/dialogs/activity_db_fields_dialog.dart
|
|
```
|
|
|
|
E magari dopo:
|
|
|
|
```text
|
|
lib/widgets/activity/controllers/activity_groups_loader.dart
|
|
```
|
|
|
|
oppure:
|
|
|
|
```text
|
|
lib/model/activity/activity_grouping.dart
|
|
```
|
|
|
|
per togliere da `activity_files_page.dart` la logica di:
|
|
|
|
```text
|
|
_loadSportGroups
|
|
_loadAlbumGroups
|
|
```
|
|
|
|
***
|
|
|
|
## Refactor consigliato prossimo
|
|
|
|
Io farei questo ordine:
|
|
|
|
### Step 4 — Spostare dialog ricalcolo
|
|
|
|
Nuovo file:
|
|
|
|
```text
|
|
lib/widgets/activity/dialogs/activity_recalculate_dialog.dart
|
|
```
|
|
|
|
Dentro spostiamo:
|
|
|
|
```dart
|
|
_showRecalculateDialog
|
|
_CompareLine
|
|
```
|
|
|
|
Trasformandolo in funzione pubblica:
|
|
|
|
```dart
|
|
void showActivityRecalculateDialog({
|
|
required BuildContext context,
|
|
required ActivityTrack activity,
|
|
});
|
|
```
|
|
|
|
***
|
|
|
|
### Step 5 — Spostare dialog dettagli DB
|
|
|
|
Nuovo file:
|
|
|
|
```text
|
|
lib/widgets/activity/dialogs/activity_db_fields_dialog.dart
|
|
```
|
|
|
|
Dentro spostiamo:
|
|
|
|
```dart
|
|
_showActivityDbFieldsDialog
|
|
_activityEntryDbRows
|
|
_DbFieldLine
|
|
```
|
|
|
|
Trasformandolo in funzione pubblica:
|
|
|
|
```dart
|
|
Future<void> showActivityDbFieldsDialog({
|
|
required BuildContext context,
|
|
required ActivityEntry entry,
|
|
});
|
|
```
|
|
|
|
***
|
|
|
|
### Step 6 — Spostare grouping Sport/Album
|
|
|
|
Nuovo file possibile:
|
|
|
|
```text
|
|
lib/model/activity/activity_groups.dart
|
|
```
|
|
|
|
Con:
|
|
|
|
```dart
|
|
ActivitySportGroup buildSportGroups(...)
|
|
ActivityAlbumGroup buildAlbumGroups(...)
|
|
```
|
|
|
|
Oppure lasciamo i model group vicino ai widget per ora.
|
|
|
|
***
|
|
|
|
## In pratica
|
|
|
|
Sì, hai ragione: nella lista Activity vanno considerati anche questi file:
|
|
|
|
```text
|
|
lib/utils/activity_file_parser.dart
|
|
lib/utils/fit_activity_parser.dart
|
|
lib/utils/tcx_activity_parser.dart
|
|
lib/utils/gpx_activity_parser.dart
|
|
lib/model/activity/activity_track.dart
|
|
lib/widgets/activity/activity_map_page.dart
|
|
lib/widgets/activity/activity_files_page.dart
|
|
lib/model/activity/activity_library_bootstrap.dart
|
|
```
|
|
|
|
E adesso anche tutti quelli nuovi che abbiamo creato.
|
|
|
|
Il prossimo miglior passo è spostare i **dialog** fuori da `activity_files_page.dart`, perché sono ancora uno dei blocchi più grossi rimasti.
|