diff --git a/lib/areas/application/widgets/application_titlebar.dart b/lib/areas/application/widgets/application_titlebar.dart index 3b8c59f..555e64f 100644 --- a/lib/areas/application/widgets/application_titlebar.dart +++ b/lib/areas/application/widgets/application_titlebar.dart @@ -13,6 +13,8 @@ import 'application_titlebar_close_button.dart'; import 'application_titlebar_hierarchy_visibility_toggle.dart'; import 'application_titlebar_hot_reload_warning.dart'; import 'application_titlebar_license.dart'; +import 'application_titlebar_maximize_button.dart'; +import 'application_titlebar_minimize_button.dart'; import 'application_titlebar_update_available.dart'; class ApplicationTitlebar extends ConsumerWidget { @@ -24,7 +26,7 @@ class ApplicationTitlebar extends ConsumerWidget { List build() { if (currentMode == ApplicationMode.welcomeScreen || currentMode == ApplicationMode.communicationError) { - return [const Spacer(), const ApplicationTitlebarUpdateAvailable(), const ApplicationTitlebarCloseButton()]; + return [const Spacer(), const ApplicationTitlebarUpdateAvailable(), const ApplicationTitlebarMinimizeButton(), const ApplicationTitlebarMaximizeButton(), const ApplicationTitlebarCloseButton()]; } if (currentMode == ApplicationMode.settings) { @@ -32,6 +34,8 @@ class ApplicationTitlebar extends ConsumerWidget { const SizedBox(width: 12), ...buildApplicationTitle(context), const Spacer(), + const ApplicationTitlebarMinimizeButton(), + const ApplicationTitlebarMaximizeButton(), const ApplicationTitlebarCloseButton() ]; } @@ -49,6 +53,8 @@ class ApplicationTitlebar extends ConsumerWidget { const SizedBox(width: 16), const ApplicationTitlebarFeatures(), const ApplicationTitlebarFeedback(), + const ApplicationTitlebarMinimizeButton(), + const ApplicationTitlebarMaximizeButton(), const ApplicationTitlebarCloseButton() ]; } diff --git a/lib/areas/application/widgets/application_titlebar_maximize_button.dart b/lib/areas/application/widgets/application_titlebar_maximize_button.dart new file mode 100644 index 0000000..d9d17bd --- /dev/null +++ b/lib/areas/application/widgets/application_titlebar_maximize_button.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:material_symbols_icons/symbols.dart'; +import 'package:window_manager/window_manager.dart'; + +class ApplicationTitlebarMaximizeButton extends ConsumerStatefulWidget { + const ApplicationTitlebarMaximizeButton({super.key}); + + @override + ConsumerState createState() => _ApplicationTitlebarMaximizeButtonState(); +} + +class _ApplicationTitlebarMaximizeButtonState extends ConsumerState + with WindowListener { + bool _isMaximized = false; + + @override + void initState() { + super.initState(); + windowManager.addListener(this); + _updateMaximizedState(); + } + + @override + void dispose() { + windowManager.removeListener(this); + super.dispose(); + } + + @override + void onWindowMaximize() { + setState(() { + _isMaximized = true; + }); + } + + @override + void onWindowUnmaximize() { + setState(() { + _isMaximized = false; + }); + } + + Future _updateMaximizedState() async { + final isMaximized = await windowManager.isMaximized(); + setState(() { + _isMaximized = isMaximized; + }); + } + + Future _toggleMaximize() async { + if (_isMaximized) { + await windowManager.unmaximize(); + } else { + await windowManager.maximize(); + } + } + + @override + Widget build(BuildContext context) { + return IconButton( + icon: Icon( + _isMaximized ? Symbols.fullscreen_exit_rounded : Symbols.fullscreen_rounded, + color: Theme.of(context).colorScheme.onSurfaceVariant), + onPressed: _toggleMaximize); + } +} \ No newline at end of file diff --git a/lib/areas/application/widgets/application_titlebar_minimize_button.dart b/lib/areas/application/widgets/application_titlebar_minimize_button.dart new file mode 100644 index 0000000..6e36831 --- /dev/null +++ b/lib/areas/application/widgets/application_titlebar_minimize_button.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:material_symbols_icons/symbols.dart'; +import 'package:window_manager/window_manager.dart'; + +class ApplicationTitlebarMinimizeButton extends ConsumerWidget { + const ApplicationTitlebarMinimizeButton({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return IconButton( + icon: Icon(Symbols.minimize_rounded, color: Theme.of(context).colorScheme.onSurfaceVariant), + onPressed: windowManager.minimize); + } +} \ No newline at end of file