diff --git a/lib/sheet_viewer_page.dart b/lib/sheet_viewer_page.dart index 07b9d67..ecd563d 100644 --- a/lib/sheet_viewer_page.dart +++ b/lib/sheet_viewer_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_drawing_board/flutter_drawing_board.dart'; import 'package:logging/logging.dart'; import 'package:pdfrx/pdfrx.dart'; import 'package:sheetless/api.dart'; @@ -27,6 +28,7 @@ class _SheetViewerPageState extends State { late Future documentLoaded; PdfDocument? document; bool twoPageMode = true; + bool paintMode = false; @override void initState() { @@ -82,85 +84,149 @@ class _SheetViewerPageState extends State { return Stack( children: [ - Container( - alignment: Alignment.bottomLeft, - margin: EdgeInsets.all(10), - child: FloatingActionButton( - onPressed: () { - setState(() { - twoPageMode = !twoPageMode; - }); - }, - child: Icon(twoPageMode ? Icons.filter_1 : Icons.filter_2), - ), - ), - GestureDetector( - onTapUp: (TapUpDetails details) { - // Get the size of the screen - final screenWidth = MediaQuery.of(context).size.width; + Stack( + children: [ + Visibility( + visible: !paintMode, + child: GestureDetector( + onTapUp: (TapUpDetails details) { + // Get the size of the screen + final screenWidth = MediaQuery.of(context).size.width; - // print("Touch at y = ${details.localPosition.dy}"); - // print("Touch at x = ${details.localPosition.dx}"); - // print("Screenwidth = ${screenWidth}"); - // Check where the user tapped - // if (details.localPosition.dy < 100) { - // TODO - // setState(() { - // toggleFullscreen(); - // }); - if (details.localPosition.dx < screenWidth / 2) { - // Left half of the screen - setState(() { - page = page > 1 ? page - 1 : 1; - }); - } else { - // Right half of the screen - setState(() { - page = page < numPages ? page + 1 : numPages; - }); - } - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Stack( - children: [ - PdfPageView( - key: ValueKey(page), - document: document, - pageNumber: page, - alignment: Alignment.center, - ), - Positioned.fill( - child: Container( - alignment: Alignment.bottomCenter, - padding: EdgeInsets.only(bottom: 5), - child: Text('$page / $numPages'), - ), - ), - ], - ), - Visibility( - visible: twoPageMode == true, - child: Stack( + // print("Touch at y = ${details.localPosition.dy}"); + // print("Touch at x = ${details.localPosition.dx}"); + // print("Screenwidth = ${screenWidth}"); + // Check where the user tapped + // if (details.localPosition.dy < 100) { + // TODO + // setState(() { + // toggleFullscreen(); + // }); + if (details.localPosition.dx < screenWidth / 2) { + // Left half of the screen + setState(() { + page = page > 1 ? page - 1 : 1; + }); + } else { + // Right half of the screen + setState(() { + page = page < numPages ? page + 1 : numPages; + }); + } + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - PdfPageView( - key: ValueKey(page), - document: document, - pageNumber: page + 1, - // alignment: Alignment.center, + Stack( + children: [ + PdfPageView( + key: ValueKey(page), + document: document, + pageNumber: page, + maximumDpi: 300, + ), + Positioned.fill( + child: Container( + alignment: Alignment.bottomCenter, + padding: EdgeInsets.only(bottom: 5), + child: Text('$page / $numPages'), + ), + ), + ], ), - Positioned.fill( - child: Container( - alignment: Alignment.bottomCenter, - padding: EdgeInsets.only(bottom: 5), - child: Text('${page + 1} / $numPages'), + Visibility( + visible: twoPageMode == true, + child: Stack( + children: [ + PdfPageView( + key: ValueKey(page), + document: document, + pageNumber: page + 1, + maximumDpi: 300, + // alignment: Alignment.center, + ), + Positioned.fill( + child: Container( + alignment: Alignment.bottomCenter, + padding: EdgeInsets.only(bottom: 5), + child: Text('${page + 1} / $numPages'), + ), + ), + ], ), ), ], ), ), + ), + + // Positioned.fill( + Visibility( + visible: paintMode, + child: SizedBox.expand( + child: LayoutBuilder( + builder: (context, constraints) { + return DrawingBoard( + background: SizedBox( + width: calcScaledPageWidth( + constraints.maxHeight, + document!.pages.elementAt(page).size, + ), + height: constraints.maxHeight, + child: PdfPageView( + document: document, + pageNumber: page, + alignment: Alignment.center, + ), + ), + // showDefaultTools: true, + // showDefaultActions: true, + boardConstrained: true, + minScale: 1, + maxScale: 3, + alignment: Alignment.topRight, + boardBoundaryMargin: EdgeInsets.all(0), + ); + }, + ), + ), + ), + ], + ), + Container( + alignment: Alignment.bottomLeft, + margin: EdgeInsets.all(10), + child: Column( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + FloatingActionButton( + onPressed: () { + setState(() { + if (twoPageMode) { + // TODO: notification that paint mode only in single page mode + } else { + paintMode = !paintMode; + } + }); + }, + child: Icon(Icons.brush), + ), + FloatingActionButton( + onPressed: () { + setState(() { + twoPageMode = !twoPageMode; + if (twoPageMode) { + paintMode = false; + // TODO: notification that paint mode was deactivated since only possible in single page mode + } + }); + }, + child: Icon( + twoPageMode ? Icons.filter_1 : Icons.filter_2, + ), + ), ], ), ), @@ -183,4 +249,8 @@ class _SheetViewerPageState extends State { ), ); } + + double calcScaledPageWidth(double parentHeight, Size pageSize) { + return parentHeight * pageSize.width / pageSize.height; + } }