diff --git a/lib/screens/shared/default_title_bar.dart b/lib/screens/shared/default_title_bar.dart index d44b344..6d5ecd9 100644 --- a/lib/screens/shared/default_title_bar.dart +++ b/lib/screens/shared/default_title_bar.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -51,139 +52,141 @@ class _DefaultTitleBarState extends ConsumerState with WindowLi color: hovering ? Colors.black.withValues(alpha: 0.15) : Colors.transparent, ), height: widget.height, - child: switch (AdaptiveLayout.of(context).platform) { - TargetPlatform.android || TargetPlatform.iOS => SizedBox(height: MediaQuery.paddingOf(context).top), - TargetPlatform.windows || TargetPlatform.linux => Row( - children: [ - Expanded( - child: Container( - color: Colors.black.withValues(alpha: 0), - child: DragToMoveArea( - child: Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.max, + child: kIsWeb + ? const SizedBox.shrink() + : switch (AdaptiveLayout.of(context).platform) { + TargetPlatform.android || TargetPlatform.iOS => SizedBox(height: MediaQuery.paddingOf(context).top), + TargetPlatform.windows || TargetPlatform.linux => Row( + children: [ + Expanded( + child: Container( + color: Colors.black.withValues(alpha: 0), + child: DragToMoveArea( + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.max, + children: [ + Container( + padding: const EdgeInsets.only(left: 16), + child: DefaultTextStyle( + style: TextStyle( + color: iconColor, + fontSize: 14, + ), + child: Text(widget.label ?? ""), + ), + ), + ], + ), + ), + ), + ), + Row( children: [ - Container( - padding: const EdgeInsets.only(left: 16), - child: DefaultTextStyle( - style: TextStyle( - color: iconColor, - fontSize: 14, + FutureBuilder>(future: Future.microtask(() async { + final isMinimized = await windowManager.isMinimized(); + final isFullScreen = await windowManager.isFullScreen(); + return [isMinimized, isFullScreen]; + }), builder: (context, snapshot) { + final isMinimized = snapshot.data?.firstOrNull ?? false; + final fullScreen = snapshot.data?.lastOrNull ?? false; + return IconButton( + style: IconButton.styleFrom( + hoverColor: brightness == Brightness.light + ? Colors.black.withValues(alpha: 0.1) + : Colors.white.withValues(alpha: 0.2), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2))), + onPressed: () async { + if (fullScreen) { + await windowManager.setFullScreen(false); + } + if (isMinimized) { + windowManager.restore(); + } else { + windowManager.minimize(); + } + }, + icon: Transform.translate( + offset: const Offset(0, -2), + child: Icon( + Icons.minimize_rounded, + color: iconColor, + size: 20, + shadows: shadows, + ), + ), + ); + }), + FutureBuilder>( + future: Future.microtask(() async { + final isMaximized = await windowManager.isMaximized(); + final isFullScreen = await windowManager.isFullScreen(); + return [isMaximized, isFullScreen]; + }), + builder: (BuildContext context, AsyncSnapshot> snapshot) { + final maximized = snapshot.data?.firstOrNull ?? false; + final fullScreen = snapshot.data?.lastOrNull ?? false; + return IconButton( + style: IconButton.styleFrom( + hoverColor: brightness == Brightness.light + ? Colors.black.withValues(alpha: 0.1) + : Colors.white.withValues(alpha: 0.2), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)), + ), + onPressed: () async { + if (fullScreen && maximized) { + await windowManager.setFullScreen(false); + await windowManager.unmaximize(); + return; + } + + if (fullScreen) { + await windowManager.setFullScreen(false); + } else if (!maximized) { + await windowManager.maximize(); + } else { + await windowManager.unmaximize(); + } + }, + icon: Transform.translate( + offset: const Offset(0, 0), + child: Icon( + maximized ? Icons.maximize_rounded : Icons.crop_square_rounded, + color: iconColor, + size: 19, + shadows: shadows, + ), + ), + ); + }, + ), + IconButton( + style: IconButton.styleFrom( + hoverColor: Colors.red, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(2), + ), + ), + onPressed: () async { + windowManager.close(); + }, + icon: Transform.translate( + offset: const Offset(0, -2), + child: Icon( + Icons.close_rounded, + color: iconColor, + size: 23, + shadows: shadows, ), - child: Text(widget.label ?? ""), ), ), ], ), - ), + ], ), - ), - Row( - children: [ - FutureBuilder>(future: Future.microtask(() async { - final isMinimized = await windowManager.isMinimized(); - final isFullScreen = await windowManager.isFullScreen(); - return [isMinimized, isFullScreen]; - }), builder: (context, snapshot) { - final isMinimized = snapshot.data?.firstOrNull ?? false; - final fullScreen = snapshot.data?.lastOrNull ?? false; - return IconButton( - style: IconButton.styleFrom( - hoverColor: brightness == Brightness.light - ? Colors.black.withValues(alpha: 0.1) - : Colors.white.withValues(alpha: 0.2), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2))), - onPressed: () async { - if (fullScreen) { - await windowManager.setFullScreen(false); - } - if (isMinimized) { - windowManager.restore(); - } else { - windowManager.minimize(); - } - }, - icon: Transform.translate( - offset: const Offset(0, -2), - child: Icon( - Icons.minimize_rounded, - color: iconColor, - size: 20, - shadows: shadows, - ), - ), - ); - }), - FutureBuilder>( - future: Future.microtask(() async { - final isMaximized = await windowManager.isMaximized(); - final isFullScreen = await windowManager.isFullScreen(); - return [isMaximized, isFullScreen]; - }), - builder: (BuildContext context, AsyncSnapshot> snapshot) { - final maximized = snapshot.data?.firstOrNull ?? false; - final fullScreen = snapshot.data?.lastOrNull ?? false; - return IconButton( - style: IconButton.styleFrom( - hoverColor: brightness == Brightness.light - ? Colors.black.withValues(alpha: 0.1) - : Colors.white.withValues(alpha: 0.2), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)), - ), - onPressed: () async { - if (fullScreen && maximized) { - await windowManager.setFullScreen(false); - await windowManager.unmaximize(); - return; - } - - if (fullScreen) { - await windowManager.setFullScreen(false); - } else if (!maximized) { - await windowManager.maximize(); - } else { - await windowManager.unmaximize(); - } - }, - icon: Transform.translate( - offset: const Offset(0, 0), - child: Icon( - maximized ? Icons.maximize_rounded : Icons.crop_square_rounded, - color: iconColor, - size: 19, - shadows: shadows, - ), - ), - ); - }, - ), - IconButton( - style: IconButton.styleFrom( - hoverColor: Colors.red, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(2), - ), - ), - onPressed: () async { - windowManager.close(); - }, - icon: Transform.translate( - offset: const Offset(0, -2), - child: Icon( - Icons.close_rounded, - color: iconColor, - size: 23, - shadows: shadows, - ), - ), - ), - ], - ), - ], - ), - TargetPlatform.macOS => const SizedBox.shrink(), - _ => Text(widget.label ?? "Fladder"), - }, + TargetPlatform.macOS => const SizedBox.shrink(), + _ => Text(widget.label ?? "Fladder"), + }, ), ); } diff --git a/lib/screens/video_player/video_player_controls.dart b/lib/screens/video_player/video_player_controls.dart index 1b23d2e..1883bc1 100644 --- a/lib/screens/video_player/video_player_controls.dart +++ b/lib/screens/video_player/video_player_controls.dart @@ -31,7 +31,8 @@ import 'package:fladder/util/input_handler.dart'; import 'package:fladder/util/list_padding.dart'; import 'package:fladder/util/localization_helper.dart'; import 'package:fladder/util/string_extensions.dart'; -import 'package:fladder/widgets/shared/full_screen_button.dart'; +import 'package:fladder/widgets/shared/full_screen_button.dart' + if (dart.library.html) 'package:fladder/widgets/shared/full_screen_button_web.dart'; class DesktopControls extends ConsumerStatefulWidget { const DesktopControls({super.key});