#253 init: add entries without notifying before metadata loading

This commit is contained in:
Thibault Deckers 2022-05-19 17:48:41 +09:00
parent a470bb69d7
commit c7b19c5e49
5 changed files with 48 additions and 24 deletions

View file

@ -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<String, AvesEntry?> 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<String?> albums) {
void addDirectories({required Set<String?> 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<String, int> _filterEntryCountMap = {};
final Map<String, AvesEntry?> _filterRecentEntryMap = {};
void invalidateAlbumFilterSummary({Set<AvesEntry>? entries, Set<String?>? directories}) {
void invalidateAlbumFilterSummary({
Set<AvesEntry>? entries,
Set<String?>? 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) {

View file

@ -114,11 +114,11 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
return entries.where(TrashFilter.instance.test);
}
void _invalidate([Set<AvesEntry>? entries]) {
void _invalidate({Set<AvesEntry>? 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<AvesEntry>? 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<AvesEntry> entries) {
void addEntries(Set<AvesEntry> 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<void> removeEntries(Set<String> 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));
}

View file

@ -183,7 +183,11 @@ mixin LocationMixin on SourceBase {
final Map<String, int> _filterEntryCountMap = {};
final Map<String, AvesEntry?> _filterRecentEntryMap = {};
void invalidateCountryFilterSummary({Set<AvesEntry>? entries, Set<String>? countryCodes}) {
void invalidateCountryFilterSummary({
Set<AvesEntry>? entries,
Set<String>? 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) {

View file

@ -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) {

View file

@ -78,7 +78,11 @@ mixin TagMixin on SourceBase {
final Map<String, int> _filterEntryCountMap = {};
final Map<String, AvesEntry?> _filterRecentEntryMap = {};
void invalidateTagFilterSummary({Set<AvesEntry>? entries, Set<String>? tags}) {
void invalidateTagFilterSummary({
Set<AvesEntry>? entries,
Set<String>? 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) {