From 0f7d840e4852ec5353f2438c8221a0d7cfb0c6f9 Mon Sep 17 00:00:00 2001 From: insleker Date: Thu, 18 Sep 2025 18:08:33 +0800 Subject: [PATCH] feat: enhance PDF thumbnail navigation and selection logic --- integration_test/pdf_view_test.dart | 32 +++++++++++++++++++ .../features/pdf/widgets/pages_sidebar.dart | 30 +++++++++++------ 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/integration_test/pdf_view_test.dart b/integration_test/pdf_view_test.dart index 0c32047..c529e4e 100644 --- a/integration_test/pdf_view_test.dart +++ b/integration_test/pdf_view_test.dart @@ -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() + .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 { diff --git a/lib/ui/features/pdf/widgets/pages_sidebar.dart b/lib/ui/features/pdf/widgets/pages_sidebar.dart index 7bb4566..85d9348 100644 --- a/lib/ui/features/pdf/widgets/pages_sidebar.dart +++ b/lib/ui/features/pdf/widgets/pages_sidebar.dart @@ -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(