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,
builder: (context, page, child) {
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>(
valueListenable: viewStateNotifier,
builder: (context, viewState, child) {
final viewportSize = viewState.viewportSize;
if (viewportSize == null) return SizedBox.shrink();
return CustomPaint(
painter: MinimapPainter(
viewportSize: viewportSize,
entrySize: entrySize,
viewCenterOffset: viewState.position,
viewScale: viewState.scale,
minimapBorderColor: Colors.white30,
return AnimatedBuilder(
animation: entry.imageChangeNotifier,
builder: (context, child) => CustomPaint(
painter: MinimapPainter(
viewportSize: viewportSize,
entrySize: entry.displaySize,
viewCenterOffset: viewState.position,
viewScale: viewState.scale,
minimapBorderColor: Colors.white30,
),
size: size,
),
size: size,
);
});
}

View file

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