From c7b19c5e4902c7a99cd4ac658b4e4006d73cf4d7 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 19 May 2022 17:48:41 +0900 Subject: [PATCH] #253 init: add entries without notifying before metadata loading --- lib/model/source/album.dart | 24 ++++++++++++++++-------- lib/model/source/collection_source.dart | 24 +++++++++++++----------- lib/model/source/location.dart | 10 ++++++++-- lib/model/source/media_store_source.dart | 4 +++- lib/model/source/tag.dart | 10 ++++++++-- 5 files changed, 48 insertions(+), 24 deletions(-) diff --git a/lib/model/source/album.dart b/lib/model/source/album.dart index 3808fe9d9..1fd58d204 100644 --- a/lib/model/source/album.dart +++ b/lib/model/source/album.dart @@ -26,9 +26,11 @@ mixin AlbumMixin on SourceBase { return compareAsciiUpperCase(va, vb); } - void _onAlbumChanged() { + void _onAlbumChanged({bool notify = true}) { invalidateAlbumDisplayNames(); - eventBus.fire(AlbumsChangedEvent()); + if (notify) { + eventBus.fire(AlbumsChangedEvent()); + } } Map getAlbumEntries() { @@ -55,14 +57,14 @@ mixin AlbumMixin on SourceBase { void updateDirectories() { final visibleDirectories = visibleEntries.map((entry) => entry.directory).toSet(); - addDirectories(visibleDirectories); + addDirectories(albums: visibleDirectories); cleanEmptyAlbums(); } - void addDirectories(Set albums) { + void addDirectories({required Set albums, bool notify = true}) { if (!_directories.containsAll(albums)) { _directories.addAll(albums); - _onAlbumChanged(); + _onAlbumChanged(notify: notify); } } @@ -92,7 +94,11 @@ mixin AlbumMixin on SourceBase { final Map _filterEntryCountMap = {}; final Map _filterRecentEntryMap = {}; - void invalidateAlbumFilterSummary({Set? entries, Set? directories}) { + void invalidateAlbumFilterSummary({ + Set? entries, + Set? directories, + bool notify = true, + }) { if (_filterEntryCountMap.isEmpty && _filterRecentEntryMap.isEmpty) return; if (entries == null && directories == null) { @@ -108,7 +114,9 @@ mixin AlbumMixin on SourceBase { _filterRecentEntryMap.remove(directory); }); } - eventBus.fire(AlbumSummaryInvalidatedEvent(directories)); + if (notify) { + eventBus.fire(AlbumSummaryInvalidatedEvent(directories)); + } } int albumEntryCount(AlbumFilter filter) { @@ -123,7 +131,7 @@ mixin AlbumMixin on SourceBase { void createAlbum(String directory) { _newAlbums.add(directory); - addDirectories({directory}); + addDirectories(albums: {directory}); } void renameNewAlbum(String source, String destination) { diff --git a/lib/model/source/collection_source.dart b/lib/model/source/collection_source.dart index f39c31d7a..2ce5a6f79 100644 --- a/lib/model/source/collection_source.dart +++ b/lib/model/source/collection_source.dart @@ -114,11 +114,11 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM return entries.where(TrashFilter.instance.test); } - void _invalidate([Set? entries]) { + void _invalidate({Set? entries, bool notify = true}) { invalidateEntries(); - invalidateAlbumFilterSummary(entries: entries); - invalidateCountryFilterSummary(entries: entries); - invalidateTagFilterSummary(entries: entries); + invalidateAlbumFilterSummary(entries: entries, notify: notify); + invalidateCountryFilterSummary(entries: entries, notify: notify); + invalidateTagFilterSummary(entries: entries, notify: notify); } @override @@ -129,7 +129,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM } void updateDerivedFilters([Set? entries]) { - _invalidate(entries); + _invalidate(entries: entries); // it is possible for entries hidden by a filter type, to have an impact on other types // e.g. given a sole entry for country C and tag T, hiding T should make C disappear too updateDirectories(); @@ -137,7 +137,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM updateTags(); } - void addEntries(Set entries) { + void addEntries(Set entries, {bool notify = true}) { if (entries.isEmpty) return; final newIdMapEntries = Map.fromEntries(entries.map((entry) => MapEntry(entry.id, entry))); @@ -152,10 +152,12 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM _entryById.addAll(newIdMapEntries); _rawEntries.addAll(entries); - _invalidate(entries); + _invalidate(entries: entries, notify: notify); - addDirectories(_applyHiddenFilters(entries).map((entry) => entry.directory).toSet()); - eventBus.fire(EntryAddedEvent(entries)); + addDirectories(albums: _applyHiddenFilters(entries).map((entry) => entry.directory).toSet(), notify: notify); + if (notify) { + eventBus.fire(EntryAddedEvent(entries)); + } } Future removeEntries(Set uris, {required bool includeTrash}) async { @@ -327,7 +329,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM case MoveType.move: case MoveType.export: cleanEmptyAlbums(fromAlbums); - addDirectories(destinationAlbums); + addDirectories(albums: destinationAlbums); break; case MoveType.toBin: case MoveType.fromBin: @@ -335,7 +337,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM break; } invalidateAlbumFilterSummary(directories: fromAlbums); - _invalidate(movedEntries); + _invalidate(entries: movedEntries); eventBus.fire(EntryMovedEvent(moveType, movedEntries)); } diff --git a/lib/model/source/location.dart b/lib/model/source/location.dart index 3f9135b4a..144cb683b 100644 --- a/lib/model/source/location.dart +++ b/lib/model/source/location.dart @@ -183,7 +183,11 @@ mixin LocationMixin on SourceBase { final Map _filterEntryCountMap = {}; final Map _filterRecentEntryMap = {}; - void invalidateCountryFilterSummary({Set? entries, Set? countryCodes}) { + void invalidateCountryFilterSummary({ + Set? entries, + Set? countryCodes, + bool notify = true, + }) { if (_filterEntryCountMap.isEmpty && _filterRecentEntryMap.isEmpty) return; if (entries == null && countryCodes == null) { @@ -199,7 +203,9 @@ mixin LocationMixin on SourceBase { _filterRecentEntryMap.remove(countryCode); }); } - eventBus.fire(CountrySummaryInvalidatedEvent(countryCodes)); + if (notify) { + eventBus.fire(CountrySummaryInvalidatedEvent(countryCodes)); + } } int countryEntryCount(LocationFilter filter) { diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart index 48af4d718..8bd93063f 100644 --- a/lib/model/source/media_store_source.dart +++ b/lib/model/source/media_store_source.dart @@ -96,7 +96,9 @@ class MediaStoreSource extends CollectionSource { // show known entries debugPrint('$runtimeType refresh ${stopwatch.elapsed} add known entries'); - addEntries(knownEntries); + // add entries without notifying, so that the collection is not refreshed + // with items that may be hidden right away because of their metadata + addEntries(knownEntries, notify: false); debugPrint('$runtimeType refresh ${stopwatch.elapsed} load metadata'); if (directory != null) { diff --git a/lib/model/source/tag.dart b/lib/model/source/tag.dart index 24e03fd81..c092600cf 100644 --- a/lib/model/source/tag.dart +++ b/lib/model/source/tag.dart @@ -78,7 +78,11 @@ mixin TagMixin on SourceBase { final Map _filterEntryCountMap = {}; final Map _filterRecentEntryMap = {}; - void invalidateTagFilterSummary({Set? entries, Set? tags}) { + void invalidateTagFilterSummary({ + Set? entries, + Set? tags, + bool notify = true, + }) { if (_filterEntryCountMap.isEmpty && _filterRecentEntryMap.isEmpty) return; if (entries == null && tags == null) { @@ -94,7 +98,9 @@ mixin TagMixin on SourceBase { _filterRecentEntryMap.remove(tag); }); } - eventBus.fire(TagSummaryInvalidatedEvent(tags)); + if (notify) { + eventBus.fire(TagSummaryInvalidatedEvent(tags)); + } } int tagEntryCount(TagFilter filter) {