viewer: fixed view and minimap refresh after rotation
This commit is contained in:
parent
f2de483df8
commit
87bb1327df
2 changed files with 36 additions and 27 deletions
|
@ -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,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue