viewer: fixed view and minimap refresh after rotation

This commit is contained in:
Thibault Deckers 2021-01-31 14:57:35 +09:00
parent f2de483df8
commit 87bb1327df
2 changed files with 36 additions and 27 deletions

View file

@ -35,29 +35,32 @@ class Minimap extends StatelessWidget {
valueListenable: multiPageController.pageNotifier, valueListenable: multiPageController.pageNotifier,
builder: (context, page, child) { builder: (context, page, child) {
final pageEntry = mainEntry.getPageEntry(multiPageInfo?.getByIndex(page)); final pageEntry = mainEntry.getPageEntry(multiPageInfo?.getByIndex(page));
return _buildForEntrySize(pageEntry.displaySize); return _buildForEntrySize(pageEntry);
}, },
); );
}) })
: _buildForEntrySize(mainEntry.displaySize), : _buildForEntrySize(mainEntry),
); );
} }
Widget _buildForEntrySize(Size entrySize) { Widget _buildForEntrySize(AvesEntry entry) {
return ValueListenableBuilder<ViewState>( return ValueListenableBuilder<ViewState>(
valueListenable: viewStateNotifier, valueListenable: viewStateNotifier,
builder: (context, viewState, child) { builder: (context, viewState, child) {
final viewportSize = viewState.viewportSize; final viewportSize = viewState.viewportSize;
if (viewportSize == null) return SizedBox.shrink(); if (viewportSize == null) return SizedBox.shrink();
return CustomPaint( return AnimatedBuilder(
animation: entry.imageChangeNotifier,
builder: (context, child) => CustomPaint(
painter: MinimapPainter( painter: MinimapPainter(
viewportSize: viewportSize, viewportSize: viewportSize,
entrySize: entrySize, entrySize: entry.displaySize,
viewCenterOffset: viewState.position, viewCenterOffset: viewState.position,
viewScale: viewState.scale, viewScale: viewState.scale,
minimapBorderColor: Colors.white30, minimapBorderColor: Colors.white30,
), ),
size: size, size: size,
),
); );
}); });
} }

View file

@ -111,7 +111,7 @@ class _EntryPageViewState extends State<EntryPageView> {
} }
void _unregisterWidget() { void _unregisterWidget() {
_magnifierController.dispose(); _magnifierController?.dispose();
_subscriptions _subscriptions
..forEach((sub) => sub.cancel()) ..forEach((sub) => sub.cancel())
..clear(); ..clear();
@ -119,6 +119,9 @@ class _EntryPageViewState extends State<EntryPageView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final child = AnimatedBuilder(
animation: entry.imageChangeNotifier,
builder: (context, child) {
Widget child; Widget child;
if (entry.isVideo) { if (entry.isVideo) {
if (!entry.displaySize.isEmpty) { if (!entry.displaySize.isEmpty) {
@ -133,6 +136,9 @@ class _EntryPageViewState extends State<EntryPageView> {
entry: entry, entry: entry,
onTap: () => onTap?.call(null), onTap: () => onTap?.call(null),
); );
return child;
},
);
return widget.heroTag != null return widget.heroTag != null
? Hero( ? Hero(
@ -201,8 +207,8 @@ class _EntryPageViewState extends State<EntryPageView> {
@required Widget child, @required Widget child,
}) { }) {
return Magnifier( return Magnifier(
// key includes size and orientation to refresh when the image is rotated // key includes modified date to refresh when the image is modified by metadata (e.g. rotated)
key: ValueKey('${entry.pageId}_${entry.rotationDegrees}_${entry.isFlipped}_${entry.width}_${entry.height}_${entry.path}'), key: ValueKey('${entry.pageId}_${entry.dateModifiedSecs}'),
controller: _magnifierController, controller: _magnifierController,
childSize: entry.displaySize, childSize: entry.displaySize,
minScale: minScale, minScale: minScale,