diff --git a/lib/main.dart b/lib/main.dart index 738372b..37cd7e4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; +import 'package:window_manager/window_manager.dart'; import 'package:window_size/window_size.dart'; import 'src/app.dart'; @@ -59,6 +60,19 @@ void main() async { // Don't forget to also change the size in linux/my_application.cc:50 setWindowMinSize(const Size(692, 580)); setWindowMaxSize(const Size(692, 580)); + await windowManager.ensureInitialized(); + + const windowOptions = WindowOptions( + size: Size(692, 580), + center: true, + backgroundColor: Colors.transparent, + skipTaskbar: false, + titleBarStyle: TitleBarStyle.hidden, + ); + windowManager.waitUntilReadyToShow(windowOptions, () async { + await windowManager.show(); + await windowManager.focus(); + }); final foundQuickGet = await Process.run('which', ['quickget']); if (foundQuickGet.exitCode == 0) { gOperatingSystems = await loadOperatingSystems(false); diff --git a/lib/src/app.dart b/lib/src/app.dart index d68cd30..3e48957 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -10,6 +10,7 @@ import 'package:quickgui/src/mixins/app_version.dart'; import 'package:quickgui/src/pages/deget_not_found_page.dart'; import 'package:quickgui/src/supported_locales.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:window_manager/window_manager.dart'; import 'globals.dart'; import 'mixins/preferences_mixin.dart'; @@ -23,10 +24,9 @@ class App extends StatefulWidget { State createState() => _AppState(); } -class _AppState extends State with PreferencesMixin { +class _AppState extends State with PreferencesMixin, WindowListener { @override Widget build(BuildContext context) { - platform = TargetPlatform.macOS; return FutureBuilder( future: SharedPreferences.getInstance(), builder: (context, snapshot) { @@ -57,11 +57,12 @@ class _AppState extends State with PreferencesMixin { GlobalWidgetsLocalizations.delegate, ], windowButtonConfig: PlatformWindowButtonConfig( - isMaximized: () => false, - onClose: () {}, - onMinimize: () {}, - onMaximize: () {}, - onRestore: () {}, + isMaximized: () => windowManager.isMaximized(), + onClose: windowManager.close, + onMinimize: windowManager.minimize, + onMaximize: windowManager.maximize, + onRestore: windowManager.restore, + showMaximizeButton: false, ), windowsTheme: fluent.ThemeData( scaffoldBackgroundColor: fluent.Colors.grey[50], diff --git a/lib/src/pages/deget_not_found_page.dart b/lib/src/pages/deget_not_found_page.dart index d9e92f4..940499e 100644 --- a/lib/src/pages/deget_not_found_page.dart +++ b/lib/src/pages/deget_not_found_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:platform_ui/platform_ui.dart'; +import 'package:quickgui/src/widgets/title_bar.dart'; import 'package:url_launcher/url_launcher.dart'; class DebgetNotFoundPage extends StatelessWidget { @@ -9,11 +10,8 @@ class DebgetNotFoundPage extends StatelessWidget { @override Widget build(BuildContext context) { return PlatformScaffold( - appBar: PlatformAppBar( + appBar: TitleBar( title: PlatformText.subheading('Quickgui'), - actions: const [ - PlatformWindowButtons(), - ], automaticallyImplyLeading: false, ), body: Center( diff --git a/lib/src/pages/downloader.dart b/lib/src/pages/downloader.dart index d1f944b..4ba60bb 100644 --- a/lib/src/pages/downloader.dart +++ b/lib/src/pages/downloader.dart @@ -6,6 +6,7 @@ import 'package:desktop_notifications/desktop_notifications.dart'; import 'package:flutter/material.dart'; import 'package:gettext_i18n/gettext_i18n.dart'; import 'package:platform_ui/platform_ui.dart'; +import 'package:quickgui/src/widgets/title_bar.dart'; import '../model/operating_system.dart'; import '../model/option.dart'; @@ -130,8 +131,8 @@ class _DownloaderState extends State { @override Widget build(BuildContext context) { return PlatformScaffold( - appBar: PlatformAppBar( - title: PlatformText( + appBar: TitleBar( + title: PlatformText.subheading( context.t('Downloading {0}', args: [ '${widget.operatingSystem.name} ${widget.version.version}' + (widget.option!.option.isNotEmpty @@ -139,9 +140,6 @@ class _DownloaderState extends State { : '') ]), ), - actions: const [ - PlatformWindowButtons(), - ], automaticallyImplyLeading: false, ), body: Center( diff --git a/lib/src/pages/downloader_page.dart b/lib/src/pages/downloader_page.dart index 62ecf98..e1656e7 100644 --- a/lib/src/pages/downloader_page.dart +++ b/lib/src/pages/downloader_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:gettext_i18n/gettext_i18n.dart'; import 'package:platform_ui/platform_ui.dart'; +import 'package:quickgui/src/widgets/title_bar.dart'; import '../widgets/home_page/downloader_menu.dart'; import '../widgets/home_page/logo.dart'; @@ -11,11 +12,8 @@ class DownloaderPage extends StatelessWidget { @override Widget build(BuildContext context) { return PlatformScaffold( - appBar: PlatformAppBar( - title: PlatformText(context.t('Downloader')), - actions: const [ - PlatformWindowButtons(), - ], + appBar: TitleBar( + title: PlatformText.subheading(context.t('Downloader')), ), body: Column( children: const [ diff --git a/lib/src/pages/main_page.dart b/lib/src/pages/main_page.dart index fdb1004..64b8a49 100644 --- a/lib/src/pages/main_page.dart +++ b/lib/src/pages/main_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:gettext_i18n/gettext_i18n.dart'; import 'package:platform_ui/platform_ui.dart'; +import 'package:quickgui/src/widgets/title_bar.dart'; import 'package:window_size/window_size.dart'; import '../widgets/home_page/logo.dart'; @@ -25,7 +26,7 @@ class _MainPageState extends State { @override Widget build(BuildContext context) { return PlatformScaffold( - appBar: PlatformAppBar( + appBar: TitleBar( automaticallyImplyLeading: false, title: PlatformText.subheading(context.t('Quickgui')), centerTitle: true, @@ -41,7 +42,6 @@ class _MainPageState extends State { ); }, ), - const PlatformWindowButtons(), ], ), body: Column( diff --git a/lib/src/pages/manager.dart b/lib/src/pages/manager.dart index 7fde368..3148cad 100644 --- a/lib/src/pages/manager.dart +++ b/lib/src/pages/manager.dart @@ -9,6 +9,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:gettext_i18n/gettext_i18n.dart'; import 'package:path/path.dart' as path; import 'package:platform_ui/platform_ui.dart'; +import 'package:quickgui/src/widgets/title_bar.dart'; import '../globals.dart'; import '../mixins/preferences_mixin.dart'; @@ -529,11 +530,8 @@ class _ManagerState extends State with PreferencesMixin { @override Widget build(BuildContext context) { return PlatformScaffold( - appBar: PlatformAppBar( - title: PlatformText(context.t('Manager')), - actions: const [ - PlatformWindowButtons(), - ], + appBar: TitleBar( + title: PlatformText.subheading(context.t('Manager')), ), body: _buildVmList(), ); diff --git a/lib/src/pages/operating_system_selection.dart b/lib/src/pages/operating_system_selection.dart index c824690..76e69e8 100644 --- a/lib/src/pages/operating_system_selection.dart +++ b/lib/src/pages/operating_system_selection.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:gettext_i18n/gettext_i18n.dart'; import 'package:platform_ui/platform_ui.dart'; +import 'package:quickgui/src/widgets/title_bar.dart'; import '../model/operating_system.dart'; @@ -29,11 +30,8 @@ class _OperatingSystemSelectionState extends State { .where((os) => os.name.toLowerCase().contains(term.toLowerCase())) .toList(); return PlatformScaffold( - appBar: PlatformAppBar( - title: PlatformText(context.t('Select operating system')), - actions: const [ - PlatformWindowButtons(), - ], + appBar: TitleBar( + title: PlatformText.subheading(context.t('Select operating system')), ), body: SingleChildScrollView( child: Column( diff --git a/lib/src/pages/version_selection.dart b/lib/src/pages/version_selection.dart index 92215f2..cd47f11 100644 --- a/lib/src/pages/version_selection.dart +++ b/lib/src/pages/version_selection.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:gettext_i18n/gettext_i18n.dart'; import 'package:platform_ui/platform_ui.dart'; +import 'package:quickgui/src/widgets/title_bar.dart'; import 'package:tuple/tuple.dart'; import '../model/operating_system.dart'; @@ -36,14 +37,11 @@ class _VersionSelectionState extends State { .toList(); return PlatformScaffold( - appBar: PlatformAppBar( - title: PlatformText( + appBar: TitleBar( + title: PlatformText.subheading( context .t('Select version for {0}', args: [widget.operatingSystem.name]), ), - actions: const [ - PlatformWindowButtons(), - ], ), body: SingleChildScrollView( child: Column( diff --git a/lib/src/widgets/home_page/main_menu.dart b/lib/src/widgets/home_page/main_menu.dart index 648c8d3..44af7c9 100644 --- a/lib/src/widgets/home_page/main_menu.dart +++ b/lib/src/widgets/home_page/main_menu.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; import 'package:gettext_i18n/gettext_i18n.dart'; import 'package:platform_ui/platform_ui.dart'; @@ -19,11 +19,8 @@ class MainMenu extends StatelessWidget { PlatformFilledButton( onPressed: () { Navigator.of(context).push( - PageRouteBuilder( - fullscreenDialog: true, - pageBuilder: (context, animation1, animation2) => - const Manager(), - transitionDuration: Duration.zero, + CupertinoPageRoute( + builder: (context) => const Manager(), ), ); }, @@ -34,11 +31,8 @@ class MainMenu extends StatelessWidget { onPressed: () { //Navigator.of(context).push(MaterialPageRoute(builder: (context) => const DownloaderPage())); Navigator.of(context).push( - PageRouteBuilder( - fullscreenDialog: true, - pageBuilder: (context, animation1, animation2) => - const DownloaderPage(), - transitionDuration: Duration.zero, + CupertinoPageRoute( + builder: (context) => const DownloaderPage(), ), ); }, diff --git a/lib/src/widgets/settings_page.dart b/lib/src/widgets/settings_page.dart index a8f3d91..c2b65c3 100644 --- a/lib/src/widgets/settings_page.dart +++ b/lib/src/widgets/settings_page.dart @@ -3,6 +3,7 @@ import 'package:gettext_i18n/gettext_i18n.dart'; import 'package:platform_ui/platform_ui.dart'; import 'package:provider/provider.dart'; import 'package:quickgui/src/supported_locales.dart'; +import 'package:quickgui/src/widgets/title_bar.dart'; import '../globals.dart'; import '../mixins/app_version.dart'; @@ -41,11 +42,8 @@ class _SettingsPageState extends State with PreferencesMixin { Widget build(BuildContext context) { var _version = AppVersion.packageInfo!.version; return PlatformScaffold( - appBar: PlatformAppBar( - title: PlatformText(context.t('Settings')), - actions: const [ - PlatformWindowButtons(), - ], + appBar: TitleBar( + title: PlatformText.subheading(context.t('Settings')), ), body: Consumer( builder: (context, appSettings, _) { diff --git a/lib/src/widgets/title_bar.dart b/lib/src/widgets/title_bar.dart new file mode 100644 index 0000000..cf3f290 --- /dev/null +++ b/lib/src/widgets/title_bar.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:platform_ui/platform_ui.dart'; +import 'package:window_manager/window_manager.dart'; + +class TitleBar extends PlatformAppBar { + TitleBar({ + List? actions, + super.backgroundColor, + super.centerTitle, + super.leading, + super.leadingWidth, + super.title, + super.titleSpacing, + super.toolbarOpacity, + super.toolbarTextStyle, + super.titleTextStyle, + super.actionsIconTheme, + super.automaticallyImplyLeading, + super.foregroundColor, + super.titleWidth, + super.key, + }) : super( + actions: [ + ...actions ?? [], + const PlatformWindowButtons(), + ], + ); + + @override + Widget build(BuildContext context) { + return DragToMoveArea(child: super.build(context)); + } +} diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 6adbd2c..325d162 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,13 +6,21 @@ #include "generated_plugin_registrant.h" +#include #include +#include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) screen_retriever_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); + screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); + g_autoptr(FlPluginRegistrar) window_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin"); + window_manager_plugin_register_with_registrar(window_manager_registrar); g_autoptr(FlPluginRegistrar) window_size_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "WindowSizePlugin"); window_size_plugin_register_with_registrar(window_size_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index f32b910..f9e7bc0 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,7 +3,9 @@ # list(APPEND FLUTTER_PLUGIN_LIST + screen_retriever url_launcher_linux + window_manager window_size ) diff --git a/linux/my_application.cc b/linux/my_application.cc index 26b703b..0647d83 100644 --- a/linux/my_application.cc +++ b/linux/my_application.cc @@ -48,7 +48,7 @@ static void my_application_activate(GApplication* application) { } gtk_window_set_default_size(window, 692, 580); - gtk_widget_show(GTK_WIDGET(window)); + gtk_widget_realize(GTK_WIDGET(window)); g_autoptr(FlDartProject) project = fl_dart_project_new(); fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); diff --git a/pubspec.yaml b/pubspec.yaml index 73b72db..62ab4e4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.2.8-1 environment: - sdk: ">=2.14.4 <3.0.0" + sdk: ">=2.17.0 <3.0.0" dependencies: flutter: @@ -30,11 +30,14 @@ dependencies: flutter_svg: ^1.1.6 gettext_i18n: ^1.0.2 url_launcher: ^6.1.6 - platform_ui: ^0.1.0 + platform_ui: + git: + url: https://github.com/KRTirtho/platform_ui.git fluent_ui: ^4.1.2 macos_ui: ^1.7.5 libadwaita: ^1.2.5 adwaita: ^0.5.2 + window_manager: ^0.2.8 dev_dependencies: flutter_test: