import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:logging/logging.dart'; import 'package:pdfrx/pdfrx.dart'; import 'package:sheetless/api.dart'; import 'package:sheetless/sheet.dart'; class SheetViewerPage extends StatefulWidget { final Sheet sheet; final ApiClient apiClient; const SheetViewerPage( {super.key, required this.sheet, required this.apiClient}); @override State createState() => _SheetViewerPageState(); } class _SheetViewerPageState extends State { final log = Logger("SheetViewerPage"); int page = 1; int numPages = 1; bool isFullscreen = false; PdfDocument? document; @override void initState() { super.initState(); } @override void dispose() { document?.dispose(); // Make sure document gets garbage collected super.dispose(); } Future loadPdf() async { var file = await widget.apiClient.getPdfFileCached(widget.sheet.uuid); if (file == null) { throw Exception("Failed fetching pdf file"); } var document = await PdfDocument.openFile(file.path); return document; } void toggleFullscreen() { isFullscreen = !isFullscreen; if (isFullscreen) { log.info("enter fullscreen"); // enter fullscreen SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky, overlays: []); } else { // exit fullscreen log.info("exit fullscreen"); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge, overlays: SystemUiOverlay.values); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.sheet.name), ), body: FutureBuilder( future: loadPdf(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { document = snapshot.data; if (document != null) { numPages = document!.pages.length; } return 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: Stack( children: [ PdfPageView( key: ValueKey(page), document: document, pageNumber: page, alignment: Alignment.center, ), Container( alignment: Alignment.bottomCenter, padding: EdgeInsets.only(bottom: 5), child: Text('$page / $numPages'), ), ], ), ); } else if (snapshot.hasError) { return Center( child: Text( style: Theme.of(context) .textTheme .displaySmall! .copyWith(color: Colors.red), textAlign: TextAlign.center, snapshot.error.toString())); } else { return const Center(child: CircularProgressIndicator()); } }), ); } }