copy: update DB, favs

This commit is contained in:
Thibault Deckers 2020-05-29 16:04:07 +09:00
parent 0a3b625f44
commit cae7e6570d
5 changed files with 40 additions and 13 deletions

View file

@ -144,6 +144,7 @@ class CollectionSource {
} }
void removeEntries(Iterable<ImageEntry> entries) async { void removeEntries(Iterable<ImageEntry> entries) async {
entries.forEach((entry) => entry.removeFromFavourites());
_rawEntries.removeWhere(entries.contains); _rawEntries.removeWhere(entries.contains);
eventBus.fire(EntryRemovedEvent(entries)); eventBus.fire(EntryRemovedEvent(entries));
} }

View file

@ -17,14 +17,16 @@ class FavouriteRepo {
bool isFavourite(ImageEntry entry) => _rows.any((row) => row.contentId == entry.contentId); bool isFavourite(ImageEntry entry) => _rows.any((row) => row.contentId == entry.contentId);
Future<void> add(ImageEntry entry) async { FavouriteRow _entryToRow(ImageEntry entry) => FavouriteRow(contentId: entry.contentId, path: entry.path);
final newRows = [FavouriteRow(contentId: entry.contentId, path: entry.path)];
Future<void> add(Iterable<ImageEntry> entries) async {
final newRows = entries.map(_entryToRow);
await metadataDb.addFavourites(newRows); await metadataDb.addFavourites(newRows);
_rows.addAll(newRows); _rows.addAll(newRows);
} }
Future<void> remove(ImageEntry entry) async { Future<void> remove(Iterable<ImageEntry> entries) async {
final removedRows = [FavouriteRow(contentId: entry.contentId, path: entry.path)]; final removedRows = entries.map(_entryToRow);
await metadataDb.removeFavourites(removedRows); await metadataDb.removeFavourites(removedRows);
removedRows.forEach(_rows.remove); removedRows.forEach(_rows.remove);
} }

View file

@ -335,10 +335,23 @@ class ImageEntry {
void toggleFavourite() { void toggleFavourite() {
if (isFavourite) { if (isFavourite) {
favourites.remove(this); removeFromFavourites();
} else { } else {
favourites.add(this); addToFavourites();
}
}
void addToFavourites() {
if (!isFavourite) {
favourites.add([this]);
isFavouriteNotifier.value = true;
}
}
void removeFromFavourites() {
if (isFavourite) {
favourites.remove([this]);
isFavouriteNotifier.value = false;
} }
isFavouriteNotifier.value = !isFavouriteNotifier.value;
} }
} }

View file

@ -3,6 +3,7 @@ import 'dart:async';
import 'package:aves/model/collection_lens.dart'; import 'package:aves/model/collection_lens.dart';
import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/album.dart';
import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_entry.dart';
import 'package:aves/model/metadata_db.dart';
import 'package:aves/services/android_app_service.dart'; import 'package:aves/services/android_app_service.dart';
import 'package:aves/services/image_file_service.dart'; import 'package:aves/services/image_file_service.dart';
import 'package:aves/widgets/album/app_bar.dart'; import 'package:aves/widgets/album/app_bar.dart';
@ -98,21 +99,31 @@ class SelectionActionDelegate with PermissionAwareMixin {
} }
if (movedCount > 0) { if (movedCount > 0) {
if (copy) { if (copy) {
collection.source.addAll(movedOps.map((movedOp) { final newEntries = <ImageEntry>[];
final newFavs = <ImageEntry>[];
movedOps.forEach((movedOp) {
final sourceUri = movedOp.uri; final sourceUri = movedOp.uri;
final newFields = movedOp.newFields; final newFields = movedOp.newFields;
final sourceEntry = selection.firstWhere((entry) => entry.uri == sourceUri, orElse: () => null); final sourceEntry = selection.firstWhere((entry) => entry.uri == sourceUri, orElse: () => null);
return sourceEntry?.copyWith( final copy = sourceEntry?.copyWith(
uri: newFields['uri'] as String, uri: newFields['uri'] as String,
path: newFields['path'] as String, path: newFields['path'] as String,
contentId: newFields['contentId'] as int, contentId: newFields['contentId'] as int,
); );
})); newEntries.add(copy);
if (sourceEntry.isFavourite) {
newFavs.add(copy);
}
});
collection.source.addAll(newEntries);
metadataDb.saveMetadata(newEntries.map((entry) => entry.catalogMetadata));
metadataDb.saveAddresses(newEntries.map((entry) => entry.addressDetails));
newFavs.forEach((entry) => entry.addToFavourites());
} else { } else {
// TODO TLAD update old entries path/dir/ID // TODO TLAD update old entries path/dir/ID
}
// TODO TLAD update DB for catalog/address/fav // TODO TLAD update DB for catalog/address/fav
} }
}
collection.clearSelection(); collection.clearSelection();
collection.browse(); collection.browse();
}, },

View file

@ -413,12 +413,12 @@ class _FullscreenVerticalPageViewState extends State<FullscreenVerticalPageView>
void _registerWidget(FullscreenVerticalPageView widget) { void _registerWidget(FullscreenVerticalPageView widget) {
widget.verticalPager.addListener(_onVerticalPageControllerChanged); widget.verticalPager.addListener(_onVerticalPageControllerChanged);
widget.entry.imageChangeNotifier.addListener(_onImageChanged); widget.entry?.imageChangeNotifier?.addListener(_onImageChanged);
} }
void _unregisterWidget(FullscreenVerticalPageView widget) { void _unregisterWidget(FullscreenVerticalPageView widget) {
widget.verticalPager.removeListener(_onVerticalPageControllerChanged); widget.verticalPager.removeListener(_onVerticalPageControllerChanged);
widget.entry.imageChangeNotifier.removeListener(_onImageChanged); widget.entry?.imageChangeNotifier?.removeListener(_onImageChanged);
} }
@override @override