Files
sheetless/lib/sheet_viewer_page.dart
2024-12-21 22:09:13 +01:00

128 lines
4.0 KiB
Dart

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<SheetViewerPage> createState() => _SheetViewerPageState();
}
class _SheetViewerPageState extends State<SheetViewerPage> {
final log = Logger("SheetViewerPage");
int page = 1;
int numPages = 1;
bool isFullscreen = false;
@override
void initState() {
super.initState();
}
Future<PdfDocument> 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<PdfDocument> snapshot) {
if (snapshot.hasData) {
var 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());
}
}),
);
}
}