feat: enhance PDF thumbnail navigation and selection logic

This commit is contained in:
insleker 2025-09-18 18:08:33 +08:00
parent 41eea5f00c
commit 0f7d840e48
2 changed files with 52 additions and 10 deletions

View File

@ -171,6 +171,36 @@ void main() {
final pagesSidebar = find.byType(PagesSidebar);
expect(pagesSidebar, findsOneWidget);
// Helper to read the background color of a thumbnail tile by page label
Color? tileBgForPage(int page) {
final pageLabel = find.descendant(
of: pagesSidebar,
matching: find.text('$page'),
);
if (pageLabel.evaluate().isEmpty) return null; // not visible yet
final decoratedAncestors = find.ancestor(
of: pageLabel,
matching: find.byType(DecoratedBox),
);
final decoratedBoxes =
decoratedAncestors
.evaluate()
.map((e) => e.widget)
.whereType<DecoratedBox>()
.toList();
for (final d in decoratedBoxes) {
final dec = d.decoration;
if (dec is BoxDecoration && dec.color != null) {
return dec.color;
}
}
return null;
}
final theme = Theme.of(tester.element(pagesSidebar));
// Initially, page 1 should be highlighted
expect(tileBgForPage(1), theme.colorScheme.primaryContainer);
// Scroll to make page 3 thumbnail visible
await tester.drag(pagesSidebar, const Offset(0, -300));
await tester.pumpAndSettle();
@ -181,6 +211,8 @@ void main() {
await tester.pumpAndSettle();
expect(container.read(pdfViewModelProvider).currentPage, 3);
// After navigation completes, page 3 should be highlighted
expect(tileBgForPage(3), theme.colorScheme.primaryContainer);
});
testWidgets('PDF View: thumbnails scroll and select', (tester) async {

View File

@ -18,6 +18,8 @@ class ThumbnailsView extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final theme = Theme.of(context);
// Access view model to detect mock viewer mode
final viewModel = ref.read(pdfViewModelProvider);
return Container(
color: theme.colorScheme.surface,
@ -34,16 +36,24 @@ class ThumbnailsView extends ConsumerWidget {
final isSelected = currentPage == pageNumber;
return InkWell(
onTap: () {
// Update both controller and provider page
controller.goToPage(
pageNumber: pageNumber,
anchor: PdfPageAnchor.top,
);
try {
ref
.read(pdfViewModelProvider.notifier)
.jumpToPage(pageNumber);
} catch (_) {}
// For real viewer: navigate first and wait for onPageChanged
// to update provider when the page is actually reached.
// For mock/unready: update provider immediately to drive scroll.
final isRealViewer = !viewModel.useMockViewer;
if (isRealViewer && controller.isReady) {
controller.goToPage(
pageNumber: pageNumber,
anchor: PdfPageAnchor.top,
);
// Do not set provider here; let onPageChanged handle it
} else {
// In tests or when controller isn't ready, drive state directly
try {
ref
.read(pdfViewModelProvider.notifier)
.jumpToPage(pageNumber);
} catch (_) {}
}
},
child: DecoratedBox(
decoration: BoxDecoration(