change two-page turn to happen after half of pdf page

This commit is contained in:
2025-10-22 19:15:35 +02:00
parent 4585b95db1
commit a42896f612

View File

@@ -1,3 +1,5 @@
import 'dart:math';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.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/sheet.dart';
import 'package:sheetless/storage_helper.dart'; import 'package:sheetless/storage_helper.dart';
import 'package:flutter_fullscreen/flutter_fullscreen.dart'; import 'package:flutter_fullscreen/flutter_fullscreen.dart';
import 'package:sheetless/utility.dart';
class SheetViewerPage extends StatefulWidget { class SheetViewerPage extends StatefulWidget {
final Sheet sheet; final Sheet sheet;
@@ -224,19 +227,25 @@ class TouchablePages extends StatelessWidget {
final touchAreaWidth = mediaQuery.size.width; final touchAreaWidth = mediaQuery.size.width;
final (leftPageSize, rightPageSize) = pages.calcPageSizesScaled(
mediaQuery.size,
);
if (details.localPosition.dy < 2 * pixelsPerCm && if (details.localPosition.dy < 2 * pixelsPerCm &&
details.localPosition.dx >= touchAreaWidth - 2 * pixelsPerCm && details.localPosition.dx >= touchAreaWidth - 2 * pixelsPerCm &&
pages.config.fullscreen) { pages.config.fullscreen) {
onExitSheetViewer(); onExitSheetViewer();
} else if (details.localPosition.dy < 2 * pixelsPerCm) { } else if (details.localPosition.dy < 2 * pixelsPerCm) {
onToggleFullscreen(); onToggleFullscreen();
} else if (details.localPosition.dx < touchAreaWidth / 4 && } else if (pages.config.twoPageMode &&
pages.config.twoPageMode) { details.localPosition.dx <
touchAreaWidth / 2 - leftPageSize.width / 2) {
onTurnPage(-2); onTurnPage(-2);
} else if (details.localPosition.dx < touchAreaWidth / 2) { } else if (details.localPosition.dx < touchAreaWidth / 2) {
onTurnPage(-1); onTurnPage(-1);
} else if (details.localPosition.dx > touchAreaWidth * 3 / 4 && } else if (pages.config.twoPageMode &&
pages.config.twoPageMode) { details.localPosition.dx >
touchAreaWidth / 2 + rightPageSize!.width / 2) {
onTurnPage(2); onTurnPage(2);
} else { } else {
onTurnPage(1); onTurnPage(1);
@@ -258,7 +267,7 @@ class PaintablePages extends StatelessWidget {
child: LayoutBuilder( child: LayoutBuilder(
builder: (context, constraints) { builder: (context, constraints) {
final maxSize = Size(constraints.maxWidth, constraints.maxHeight); final maxSize = Size(constraints.maxWidth, constraints.maxHeight);
final pageSizeScaled = pages.calcCurrentPageSizeScaled(maxSize); final (pageSizeScaled, _) = pages.calcPageSizesScaled(maxSize);
return DrawingBoard( return DrawingBoard(
background: SizedBox( background: SizedBox(
width: pageSizeScaled.width, width: pageSizeScaled.width,
@@ -328,7 +337,7 @@ class Pages extends StatelessWidget {
child: Stack( child: Stack(
children: [ children: [
PdfPageView( PdfPageView(
key: ValueKey(currentPageNumber), key: ValueKey(currentPageNumber + 1),
document: document, document: document,
pageNumber: currentPageNumber + 1, pageNumber: currentPageNumber + 1,
maximumDpi: 300, maximumDpi: 300,
@@ -350,12 +359,37 @@ class Pages extends StatelessWidget {
); );
} }
Size calcCurrentPageSizeScaled(Size parentSize) { (Size, Size?) calcPageSizesScaled(Size parentSize) {
return _calcScaledPageSize(parentSize, _getCurrentPageSizeUnscaled()); 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() { Size _getPageSizeUnscaled(int pageNumber) {
return document.pages.elementAt(currentPageNumber).size; return document.pages.elementAt(pageNumber).size;
} }
Size _calcScaledPageSize(Size parentSize, Size pageSize) { Size _calcScaledPageSize(Size parentSize, Size pageSize) {