128 lines
4.0 KiB
Dart
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());
|
|
}
|
|
}),
|
|
);
|
|
}
|
|
}
|