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();