feature: HTPC mode startup argument (#358)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2025-06-01 15:30:34 +02:00 committed by GitHub
parent a8795cf0c9
commit 69a5e3db7a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 416 additions and 151 deletions

View file

@ -9,6 +9,7 @@ import 'package:fladder/util/adaptive_layout/adaptive_layout_model.dart';
import 'package:fladder/util/debug_banner.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/util/poster_defaults.dart';
import 'package:fladder/util/resolution_checker.dart';
enum InputDevice {
touch,
@ -209,7 +210,11 @@ class _AdaptiveLayoutBuilderState extends ConsumerState<AdaptiveLayoutBuilder> {
controller: controller,
posterDefaults: posterDefaults,
),
child: widget.adaptiveLayout == null ? DebugBanner(child: widget.child(context)) : widget.child(context),
child: Builder(
builder: (context) => ResolutionChecker(
child: widget.adaptiveLayout == null ? DebugBanner(child: widget.child(context)) : widget.child(context),
),
),
),
);
}

View file

@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_manager/window_manager.dart';
import 'package:fladder/models/book_model.dart';
import 'package:fladder/models/item_base_model.dart';
@ -26,6 +25,7 @@ import 'package:fladder/util/adaptive_layout/adaptive_layout.dart';
import 'package:fladder/util/list_extensions.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/util/refresh_state.dart';
import 'package:fladder/widgets/full_screen_helpers/full_screen_wrapper.dart';
Future<void> _showLoadingIndicator(BuildContext context) async {
return showDialog(
@ -103,10 +103,7 @@ Future<void> _playVideo(
),
);
if (AdaptiveLayout.of(context).isDesktop) {
final fullScreen = await windowManager.isFullScreen();
if (fullScreen) {
await windowManager.setFullScreen(false);
}
fullScreenHelper.closeFullScreen(ref);
}
if (context.mounted) {
context.refreshData();

View file

@ -0,0 +1,63 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:screen_retriever/screen_retriever.dart';
import 'package:window_manager/window_manager.dart';
import 'package:fladder/providers/arguments_provider.dart';
class ResolutionChecker extends ConsumerStatefulWidget {
final Widget child;
const ResolutionChecker({required this.child, super.key});
@override
ConsumerState<ResolutionChecker> createState() => _ResolutionCheckerState();
}
class _ResolutionCheckerState extends ConsumerState<ResolutionChecker> {
Size? lastResolution;
Timer? _timer;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((value) async {
if (ref.read(argumentsStateProvider).htpcMode) {
lastResolution = (await screenRetriever.getPrimaryDisplay()).size;
_timer = Timer.periodic(const Duration(seconds: 2), (timer) => checkResolution());
}
});
}
Future<void> checkResolution() async {
if (!mounted) return;
final newResolution = (await screenRetriever.getPrimaryDisplay()).size;
if (lastResolution != newResolution) {
lastResolution = newResolution;
shouldSetResolution();
}
}
Future<void> shouldSetResolution() async {
if (lastResolution != null) {
final isFullScreen = await windowManager.isFullScreen();
if (isFullScreen) {
await windowManager.setFullScreen(false);
}
await windowManager.setFullScreen(true);
}
}
@override
void dispose() {
_timer?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}