add fullscreen mode

This commit is contained in:
2025-10-14 20:30:28 +02:00
parent cb8aaaee44
commit af0b6c720d
9 changed files with 140 additions and 56 deletions

View File

@@ -6,6 +6,7 @@ import 'package:hive/hive.dart';
import 'package:logging/logging.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pdfrx/pdfrx.dart';
import 'package:flutter_fullscreen/flutter_fullscreen.dart';
import 'login_page.dart';
@@ -25,6 +26,10 @@ Future<void> main() async {
Hive.init(dir.path); // Needed only if not web
}
// setup for flutter_fullscreen
WidgetsFlutterBinding.ensureInitialized();
await FullScreen.ensureInitialized();
runApp(const MyApp());
}

View File

@@ -8,6 +8,7 @@ import 'package:sheetless/api.dart';
import 'package:sheetless/bt_pedal_shortcuts.dart';
import 'package:sheetless/sheet.dart';
import 'package:sheetless/storage_helper.dart';
import 'package:flutter_fullscreen/flutter_fullscreen.dart';
class SheetViewerPage extends StatefulWidget {
final Sheet sheet;
@@ -25,7 +26,8 @@ class SheetViewerPage extends StatefulWidget {
State<SheetViewerPage> createState() => _SheetViewerPageState();
}
class _SheetViewerPageState extends State<SheetViewerPage> {
class _SheetViewerPageState extends State<SheetViewerPage>
with FullScreenListener {
final log = Logger("SheetViewerPage");
final StorageHelper storageHelper = StorageHelper();
@@ -37,12 +39,14 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
@override
void initState() {
FullScreen.addListener(this);
super.initState();
documentLoaded = loadPdf();
}
@override
void dispose() {
FullScreen.removeListener(this);
document?.dispose(); // Make sure document gets garbage collected
super.dispose();
}
@@ -66,25 +70,16 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
return true;
}
void toggleFullscreen() {
widget.config.fullscreen = !widget.config.fullscreen;
storageHelper.writeConfig(widget.config);
@override
void onFullScreenChanged(bool enabled, SystemUiMode? systemUiMode) {
setState(() {
widget.config.fullscreen = enabled;
storageHelper.writeConfig(widget.config);
});
}
if (widget.config.fullscreen) {
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,
);
}
void toggleFullscreen() {
FullScreen.setFullScreen(!widget.config.fullscreen);
}
void turnPage(int numTurns) {
@@ -100,38 +95,42 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
onTurnPageForward: () => turnPage(1),
onTurnPageBackward: () => turnPage(-1),
child: Scaffold(
appBar: AppBar(
title: Text(widget.sheet.name),
actions: [
IconButton(
onPressed: () {
setState(() {
if (widget.config.twoPageMode) {
// TODO: notification that paint mode only in single page mode
} else {
paintMode = !paintMode;
}
});
},
icon: Icon(Icons.brush),
),
IconButton(
onPressed: () {
setState(() {
widget.config.twoPageMode = !widget.config.twoPageMode;
storageHelper.writeConfig(widget.config);
if (widget.config.twoPageMode) {
paintMode = false;
// TODO: notification that paint mode was deactivated since only possible in single page mode
}
});
},
icon: Icon(
widget.config.twoPageMode ? Icons.filter_1 : Icons.filter_2,
appBar: widget.config.fullscreen
? null
: AppBar(
title: Text(widget.sheet.name),
actions: [
IconButton(
onPressed: () {
setState(() {
if (widget.config.twoPageMode) {
// TODO: notification that paint mode only in single page mode
} else {
paintMode = !paintMode;
}
});
},
icon: Icon(Icons.brush),
),
IconButton(
onPressed: () {
setState(() {
widget.config.twoPageMode = !widget.config.twoPageMode;
storageHelper.writeConfig(widget.config);
if (widget.config.twoPageMode) {
paintMode = false;
// TODO: notification that paint mode was deactivated since only possible in single page mode
}
});
},
icon: Icon(
widget.config.twoPageMode
? Icons.filter_1
: Icons.filter_2,
),
),
],
),
),
],
),
body: FutureBuilder(
future: documentLoaded,
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
@@ -155,12 +154,13 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
// 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) {
if (details.localPosition.dy < 100) {
// TODO
setState(() {
toggleFullscreen();
});
} else if (details.localPosition.dx <
screenWidth / 2) {
// Left half of the screen
turnPage(-1);
} else {