136 lines
3 KiB
Markdown
136 lines
3 KiB
Markdown
*** in lib/model/source/album.dart
|
||
Future<void> initFoldersCache() async {
|
||
foldersCache = await loadFoldersFromDb();
|
||
}
|
||
|
||
Cosa fa davvero
|
||
Chiama loadFoldersFromDb()
|
||
|
||
Carica tutte le righe della tabella folders
|
||
|
||
Le mette nella variabile globale del mixin:
|
||
|
||
dart
|
||
late Map<String, FolderRow> foldersCache;
|
||
Da quel momento in poi tutta la logica album usa solo foldersCache
|
||
Questa mappa è la fonte unica di verità per gli album.
|
||
|
||
initFoldersCache() viene chiamata in CollectionSource
|
||
|
||
|
||
lib/model/source/collection_source.dart
|
||
|
||
dove abbiamo inserito:
|
||
|
||
dart
|
||
await source.initFoldersCache();
|
||
|
||
|
||
entry.dart gestisce singole foto/video
|
||
album.dart gestisce album e cartelle
|
||
collection_source.dart gestisce la pipeline completa (scan, load, refresh)
|
||
|
||
____________________________
|
||
|
||
*** in lib/model/source/collection_source.dart
|
||
|
||
1) Avvio app → CollectionSource.init()
|
||
Il tuo CollectionSource è il cuore della pipeline.
|
||
|
||
|
||
Durante l’inizializzazione, la sequenza è:
|
||
|
||
- loadDates()
|
||
chiama localMediaDb.loadDates()
|
||
ottiene una mappa:
|
||
entryId → catalogDateMillis
|
||
la salva in _savedDates
|
||
Questa mappa viene poi usata quando arrivano nuove entry.
|
||
|
||
- initFoldersCache()
|
||
Future<void> initFoldersCache() async {
|
||
foldersCache = await loadFoldersFromDb();
|
||
}
|
||
|
||
- loadEntries() (locali)
|
||
|
||
- appendRemoteEntries() (remoti)
|
||
|
||
- updateDerivedFilters()
|
||
|
||
- updateDirectories() in album e costruisce la lista album
|
||
È il metodo che decide quali album mostrare:
|
||
UI aggiornata
|
||
- ricarica il DB
|
||
- raggruppa per Local / Remote / User / Device
|
||
- ordina i gruppi
|
||
- ricostruisce _directories
|
||
- notifica la UI
|
||
|
||
|
||
_______________________
|
||
|
||
|
||
- loadEntries() / addEntries() — gestione media
|
||
Quando Aves trova nuove entry: addEntries(entries)
|
||
in questo viene valutato se esiste già nel db se non esiste inserisce
|
||
alla fine di addEntries viene chiamato
|
||
addDirectories(albums: entries.map((e) => e.directory))
|
||
|
||
- cleanEmptyAlbums()
|
||
Quando un album non ha più entry visibili:
|
||
elimina la riga dal DB
|
||
rimuove da foldersCache
|
||
aggiorna _directories
|
||
|
||
- updateDerivedFilters()
|
||
Ogni volta che cambiano entry:
|
||
invalida summary
|
||
aggiorna album
|
||
aggiorna location
|
||
aggiorna tag
|
||
|
||
updateDirectories();
|
||
updateLocations();
|
||
updateTags();
|
||
|
||
- appendRemoteEntries():
|
||
legge dal DB tutte le entry con origin = RemoteOrigin.value
|
||
filtra quelle cestinate
|
||
le passa a addEntries()
|
||
addEntries() fa tutto il lavoro sporco:
|
||
dedupe per URI
|
||
dedupe per ID
|
||
aggiorna _rawEntries
|
||
aggiorna _entryById
|
||
invalida filtri
|
||
aggiorna album
|
||
|
||
notifica la UI
|
||
APP START
|
||
↓
|
||
CollectionSource.init()
|
||
↓
|
||
loadDates()
|
||
↓
|
||
initFoldersCache() ← carica tabella folders
|
||
↓
|
||
loadEntries() ← carica entry locali
|
||
↓
|
||
appendRemoteEntries()
|
||
↓
|
||
updateDerivedFilters()
|
||
↓
|
||
updateDirectories() ← costruisce lista album da DB
|
||
↓
|
||
UI mostra album
|
||
↓
|
||
--- runtime ---
|
||
↓
|
||
addEntries() ← nuove foto/video
|
||
↓
|
||
addDirectories() ← (creazione album se debugCreateFoldersEnabled)
|
||
↓
|
||
updateDirectories()
|
||
↓
|
||
UI aggiornata
|