Improve fullscreen

This commit is contained in:
2025-03-03 19:28:20 +08:00
parent 9fe49217dc
commit 4af15b9139
2 changed files with 98 additions and 69 deletions

View File

@@ -6,13 +6,27 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:venera/foundation/app.dart';
import 'package:venera/foundation/comic_source/comic_source.dart';
import 'package:venera/foundation/global_state.dart';
import 'package:window_manager/window_manager.dart';
const _kTitleBarHeight = 36.0;
void toggleWindowFrame() {
GlobalState.find<_WindowFrameState>().toggleWindowFrame();
class WindowFrameController extends InheritedWidget {
/// Whether the window frame is hidden.
final bool isWindowFrameHidden;
/// Sets the visibility of the window frame.
final void Function(bool) setWindowFrame;
const WindowFrameController._create({
required this.isWindowFrameHidden,
required this.setWindowFrame,
required super.child,
});
@override
bool updateShouldNotify(covariant InheritedWidget oldWidget) {
return false;
}
}
class WindowFrame extends StatefulWidget {
@@ -22,30 +36,39 @@ class WindowFrame extends StatefulWidget {
@override
State<WindowFrame> createState() => _WindowFrameState();
static WindowFrameController of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<WindowFrameController>()!;
}
}
class _WindowFrameState extends AutomaticGlobalState<WindowFrame> {
bool isHideWindowFrame = false;
class _WindowFrameState extends State<WindowFrame> {
bool isWindowFrameHidden = false;
bool useDarkTheme = false;
void toggleWindowFrame() {
isHideWindowFrame = !isHideWindowFrame;
void setWindowFrame(bool show) {
setState(() {
isWindowFrameHidden = !show;
});
}
@override
Widget build(BuildContext context) {
if (App.isMobile) return widget.child;
if (isHideWindowFrame) return widget.child;
var body = Stack(
Widget body = Stack(
children: [
Positioned.fill(
child: MediaQuery(
data: MediaQuery.of(context).copyWith(
padding: const EdgeInsets.only(top: _kTitleBarHeight)),
padding: isWindowFrameHidden
? null
: const EdgeInsets.only(top: _kTitleBarHeight),
),
child: widget.child,
),
),
if (!isWindowFrameHidden)
Positioned(
top: 0,
left: 0,
@@ -103,14 +126,15 @@ class _WindowFrameState extends AutomaticGlobalState<WindowFrame> {
);
if (App.isLinux) {
return VirtualWindowFrame(child: body);
} else {
return body;
}
body = VirtualWindowFrame(child: body);
}
@override
Object? get key => 'WindowFrame';
return WindowFrameController._create(
isWindowFrameHidden: isWindowFrameHidden,
setWindowFrame: setWindowFrame,
child: body,
);
}
}
class WindowButtons extends StatefulWidget {

View File

@@ -222,6 +222,9 @@ class _ReaderState extends State<Reader>
}
void onKeyEvent(KeyEvent event) {
if (event.logicalKey == LogicalKeyboardKey.f12 && event is KeyUpEvent) {
fullscreen();
}
_imageViewController?.handleKeyEvent(event);
}
@@ -496,10 +499,12 @@ abstract mixin class _ReaderLocation {
mixin class _ReaderWindow {
bool isFullscreen = false;
void fullscreen() {
windowManager.setFullScreen(!isFullscreen);
void fullscreen() async {
await windowManager.hide();
await windowManager.setFullScreen(!isFullscreen);
await windowManager.show();
isFullscreen = !isFullscreen;
toggleWindowFrame();
WindowFrame.of(App.rootContext).setWindowFrame(!isFullscreen);
}
}