102 lines
3.1 KiB
Dart
102 lines
3.1 KiB
Dart
import 'package:flutter/material.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> {
|
|
int page = 1;
|
|
int numPages = 1;
|
|
|
|
@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;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
print("Building with page: $page");
|
|
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;
|
|
|
|
// Check where the user tapped
|
|
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(
|
|
child: Text('$page / $numPages'),
|
|
alignment: Alignment.bottomCenter,
|
|
padding: EdgeInsets.only(bottom: 5),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
} 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());
|
|
}
|
|
}),
|
|
);
|
|
}
|
|
}
|