From a42896f61242f0588623c461bfd9a9a34171ec37 Mon Sep 17 00:00:00 2001 From: Julian Mutter Date: Wed, 22 Oct 2025 19:15:35 +0200 Subject: [PATCH] change two-page turn to happen after half of pdf page --- lib/sheet_viewer_page.dart | 54 +++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/lib/sheet_viewer_page.dart b/lib/sheet_viewer_page.dart index 7f09ffa..9c59c0b 100644 --- a/lib/sheet_viewer_page.dart +++ b/lib/sheet_viewer_page.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -9,6 +11,7 @@ import 'package:sheetless/bt_pedal_shortcuts.dart'; import 'package:sheetless/sheet.dart'; import 'package:sheetless/storage_helper.dart'; import 'package:flutter_fullscreen/flutter_fullscreen.dart'; +import 'package:sheetless/utility.dart'; class SheetViewerPage extends StatefulWidget { final Sheet sheet; @@ -224,19 +227,25 @@ class TouchablePages extends StatelessWidget { final touchAreaWidth = mediaQuery.size.width; + final (leftPageSize, rightPageSize) = pages.calcPageSizesScaled( + mediaQuery.size, + ); + if (details.localPosition.dy < 2 * pixelsPerCm && details.localPosition.dx >= touchAreaWidth - 2 * pixelsPerCm && pages.config.fullscreen) { onExitSheetViewer(); } else if (details.localPosition.dy < 2 * pixelsPerCm) { onToggleFullscreen(); - } else if (details.localPosition.dx < touchAreaWidth / 4 && - pages.config.twoPageMode) { + } else if (pages.config.twoPageMode && + details.localPosition.dx < + touchAreaWidth / 2 - leftPageSize.width / 2) { onTurnPage(-2); } else if (details.localPosition.dx < touchAreaWidth / 2) { onTurnPage(-1); - } else if (details.localPosition.dx > touchAreaWidth * 3 / 4 && - pages.config.twoPageMode) { + } else if (pages.config.twoPageMode && + details.localPosition.dx > + touchAreaWidth / 2 + rightPageSize!.width / 2) { onTurnPage(2); } else { onTurnPage(1); @@ -258,7 +267,7 @@ class PaintablePages extends StatelessWidget { child: LayoutBuilder( builder: (context, constraints) { final maxSize = Size(constraints.maxWidth, constraints.maxHeight); - final pageSizeScaled = pages.calcCurrentPageSizeScaled(maxSize); + final (pageSizeScaled, _) = pages.calcPageSizesScaled(maxSize); return DrawingBoard( background: SizedBox( width: pageSizeScaled.width, @@ -328,7 +337,7 @@ class Pages extends StatelessWidget { child: Stack( children: [ PdfPageView( - key: ValueKey(currentPageNumber), + key: ValueKey(currentPageNumber + 1), document: document, pageNumber: currentPageNumber + 1, maximumDpi: 300, @@ -350,12 +359,37 @@ class Pages extends StatelessWidget { ); } - Size calcCurrentPageSizeScaled(Size parentSize) { - return _calcScaledPageSize(parentSize, _getCurrentPageSizeUnscaled()); + (Size, Size?) calcPageSizesScaled(Size parentSize) { + if (config.twoPageMode) { + Size leftPageSizeUnscaled = _getPageSizeUnscaled(currentPageNumber); + Size rightPageSizeUnscaled = _getPageSizeUnscaled(currentPageNumber + 1); + Size combinedPageSizesUnscaled = Size( + leftPageSizeUnscaled.width + rightPageSizeUnscaled.width, + max(leftPageSizeUnscaled.height, rightPageSizeUnscaled.height), + ); + Size combinedPageSizesScaled = _calcScaledPageSize( + parentSize, + combinedPageSizesUnscaled, + ); + double scaleFactor = + combinedPageSizesScaled.width / combinedPageSizesUnscaled.width; + return ( + leftPageSizeUnscaled * scaleFactor, + rightPageSizeUnscaled * scaleFactor, + ); + } else { + return ( + _calcScaledPageSize( + parentSize, + _getPageSizeUnscaled(currentPageNumber), + ), + null, + ); + } } - Size _getCurrentPageSizeUnscaled() { - return document.pages.elementAt(currentPageNumber).size; + Size _getPageSizeUnscaled(int pageNumber) { + return document.pages.elementAt(pageNumber).size; } Size _calcScaledPageSize(Size parentSize, Size pageSize) {