diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ac202594..3f31e9b46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ All notable changes to this project will be documented in this file. - Collection: support for Sony predictive capture as burst +### Fixed + +- Viewer: multi-page context update when removing burst entries + ## [v1.8.5] - 2023-04-18 ### Added diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index 9f98fe485..fa6f3d39f 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -697,7 +697,20 @@ class _EntryViewerStackState extends State with EntryViewContr if (hasCollection) { final collectionEntries = collection!.sortedEntries; - removedEntries.forEach(collectionEntries.remove); + removedEntries.forEach((removedEntry) { + // remove from collection + if (collectionEntries.remove(removedEntry)) return; + + // remove from burst + final mainEntry = collectionEntries.firstWhereOrNull((entry) => entry.burstEntries?.contains(removedEntry) == true); + if (mainEntry != null) { + final multiPageController = context.read().getController(mainEntry); + if (multiPageController != null) { + mainEntry.burstEntries!.remove(removedEntry); + multiPageController.reset(); + } + } + }); if (collectionEntries.isNotEmpty) { _onCollectionChanged(); return; diff --git a/lib/widgets/viewer/multipage/controller.dart b/lib/widgets/viewer/multipage/controller.dart index a2332915f..a83a8b7c3 100644 --- a/lib/widgets/viewer/multipage/controller.dart +++ b/lib/widgets/viewer/multipage/controller.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:math'; import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/multipage.dart'; @@ -23,14 +24,21 @@ class MultiPageController { set page(int? page) => pageNotifier.value = page; MultiPageController(this.entry) { - entry.getMultiPageInfo().then((value) { - if (value == null || _disposed) return; - pageNotifier.value = value.defaultPage?.index ?? 0; - _info = value; - _infoStreamController.add(_info); - }); + reset(); } + void reset() => entry.getMultiPageInfo().then((info) { + if (info == null || _disposed) return; + final currentPage = pageNotifier.value; + if (currentPage == null) { + pageNotifier.value = info.defaultPage?.index ?? 0; + } else { + pageNotifier.value = min(currentPage, info.pageCount - 1); + } + _info = info; + _infoStreamController.add(_info); + }); + void dispose() { _disposed = true; pageNotifier.dispose();