From 4b7c629ac97ae9995f5da7dada0a34bea33e79a2 Mon Sep 17 00:00:00 2001 From: liuyuxin Date: Sun, 19 Nov 2023 14:20:11 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=AF=20=E5=85=B6=E4=BB=96=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/global.dart | 74 ++---------------------- lib/pages/home_page.dart | 30 +++++++--- lib/pages/setting_page/about_page.dart | 6 +- lib/utils/tray_help.dart | 80 ++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 79 deletions(-) create mode 100644 lib/utils/tray_help.dart diff --git a/lib/global.dart b/lib/global.dart index 15d6dbc..667e942 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -8,80 +8,19 @@ import "package:lex/modules/ocr_item.dart"; import "package:lex/modules/translation_item.dart"; import "package:lex/utils/dir_utils.dart"; import "package:lex/utils/font_utils.dart"; +import "package:lex/utils/tray_help.dart"; import "package:local_notifier/local_notifier.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:shared_preferences/shared_preferences.dart"; -import "package:tray_manager/tray_manager.dart"; import "package:window_manager/window_manager.dart"; /// 应用版本号 -String version = "1.0.0-beta.1"; +const String version = "1.0.0-beta.1"; /// 持久化存储 late SharedPreferences prefs; late Isar isar; -/// 系统托盘菜单 -Menu menu = Menu( - items: [ - MenuItem( - key: "show_translate", - label: "输入翻译", - ), - // MenuItem( - // key: "ocr", - // label: "文字识别", - // ), - MenuItem.separator(), - MenuItem.submenu( - key: "autoCopy", - label: "自动复制", - submenu: Menu( - items: [ - MenuItem( - key: "closeAutoCopy", - label: "关闭", - onClick: (_) async { - await prefs.setString("autoCopy", "close"); - }, - ), - MenuItem.separator(), - MenuItem( - key: "autoCopySource", - label: "原文", - onClick: (_) async { - await prefs.setString("autoCopy", "source"); - }, - ), - MenuItem( - key: "autoCopyResult", - label: "译文", - onClick: (_) async { - await prefs.setString("autoCopy", "result"); - }, - ), - MenuItem( - key: "autoCopyBoth", - label: "原文+译文", - onClick: (_) async { - await prefs.setString("autoCopy", "both"); - }, - ), - ], - ), - ), - MenuItem( - key: "show_settings", - label: "应用设置", - ), - MenuItem.separator(), - MenuItem( - key: "exit_app", - label: "退出应用", - ), - ], -); - /// 全局初始化 Future init() async { WidgetsFlutterBinding.ensureInitialized(); @@ -108,7 +47,7 @@ Future init() async { minimumSize: const Size(280, 300), center: true, backgroundColor: Colors.transparent, - title: "质感翻译", + title: "Lex", titleBarStyle: TitleBarStyle.hidden, windowButtonVisibility: false, ); @@ -120,6 +59,7 @@ Future init() async { await windowManager.show(); await windowManager.focus(); } + await windowManager.setPreventClose(true); }); // 开机自启动 @@ -130,11 +70,7 @@ Future init() async { ); // 注册系统托盘 - await trayManager.destroy(); - await trayManager.setIcon( - Platform.isWindows ? "assets/logo.ico" : "assets/logo.png", - ); - await trayManager.setContextMenu(menu); + await initTray(); // 初始化系统通知 await localNotifier.setup( diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 8257556..70dd6f5 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -4,6 +4,7 @@ import "package:lex/global.dart"; import "package:lex/pages/setting_page/settings_page.dart"; import "package:lex/pages/translation_page.dart"; import "package:lex/providers/window_provider.dart"; +import "package:lex/utils/tray_help.dart"; import "package:provider/provider.dart"; import "package:screen_retriever/screen_retriever.dart"; import "package:screen_text_extractor/screen_text_extractor.dart"; @@ -77,12 +78,12 @@ class _HomePageState extends State with WindowListener, TrayListener { // ? "取消置顶" // : "置顶", ), - Expanded( + const Expanded( child: DragToMoveArea( child: Text( "v$version", textAlign: TextAlign.center, - style: const TextStyle(color: Colors.transparent), + style: TextStyle(color: Colors.transparent), ), ), ), @@ -96,8 +97,8 @@ class _HomePageState extends State with WindowListener, TrayListener { // tooltip: "最小化", ), IconButton( - onPressed: () { - windowManager.hide(); + onPressed: () async { + windowManager.close(); }, icon: const Icon(Icons.close_outlined), padding: const EdgeInsets.all(0), @@ -117,6 +118,18 @@ class _HomePageState extends State with WindowListener, TrayListener { ); } + /// 窗口关闭事件 + @override + void onWindowClose() async { + await _saveTranslateWindow(); + await hideToTray(); + } + + @override + void onWindowFocus() { + setState(() {}); + } + /// 系统托盘点击事件 @override void onTrayIconMouseDown() { @@ -135,6 +148,7 @@ class _HomePageState extends State with WindowListener, TrayListener { switch (menuItem.key) { // 显示翻译页面 case "show_translate": + await windowManager.setSkipTaskbar(false); await _setTranslateWindow( () => setState(() { _selectedPage = TranslationPage( @@ -149,6 +163,7 @@ class _HomePageState extends State with WindowListener, TrayListener { // break; // 显示设置页面 case "show_settings": + await windowManager.setSkipTaskbar(false); await _saveTranslateWindow(); setState(() { _selectedPage = const SettingsPage(); @@ -157,6 +172,7 @@ class _HomePageState extends State with WindowListener, TrayListener { break; // 退出应用 case "exit_app": + await windowManager.setPreventClose(false); windowManager.close(); break; } @@ -331,11 +347,11 @@ class _HomePageState extends State with WindowListener, TrayListener { // Future _setOcrWindow(Function() setPage) async { // setPage(); // await Future.delayed(const Duration(milliseconds: 100)); - // await windowManager.setSize(const Size(800, 400)); + // await lexwindowManager.setSize(const Size(800, 400)); // await Future.delayed(const Duration(milliseconds: 100)); - // await windowManager.center(animate: true); + // await lexwindowManager.center(animate: true); // await Future.delayed(const Duration(milliseconds: 100)); - // await windowManager.show(); + // await lexwindowManager.show(); // if (!mounted) return; // await context.read().changeAlwaysOnTop(true); // } diff --git a/lib/pages/setting_page/about_page.dart b/lib/pages/setting_page/about_page.dart index fcbe495..aaefab9 100644 --- a/lib/pages/setting_page/about_page.dart +++ b/lib/pages/setting_page/about_page.dart @@ -22,9 +22,9 @@ class AboutPage extends StatelessWidget { height: 64, ), const SizedBox(width: 12), - Column( + const Column( children: [ - const Text( + Text( "Lex", textAlign: TextAlign.center, style: TextStyle(fontSize: 28), @@ -32,7 +32,7 @@ class AboutPage extends StatelessWidget { Text( version, textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20), + style: TextStyle(fontSize: 20), ), ], ), diff --git a/lib/utils/tray_help.dart b/lib/utils/tray_help.dart new file mode 100644 index 0000000..f2d0260 --- /dev/null +++ b/lib/utils/tray_help.dart @@ -0,0 +1,80 @@ +import 'dart:io'; + +import 'package:lex/global.dart'; +import 'package:tray_manager/tray_manager.dart'; +import 'package:window_manager/window_manager.dart'; + +/// 初始化系统托盘 +Future initTray() async { + Menu menu = Menu( + items: [ + MenuItem( + key: "show_translate", + label: "输入翻译", + ), + // MenuItem( + // key: "ocr", + // label: "文字识别", + // ), + MenuItem.separator(), + MenuItem.submenu( + key: "autoCopy", + label: "自动复制", + submenu: Menu( + items: [ + MenuItem( + key: "closeAutoCopy", + label: "关闭", + onClick: (_) async { + await prefs.setString("autoCopy", "close"); + }, + ), + MenuItem.separator(), + MenuItem( + key: "autoCopySource", + label: "原文", + onClick: (_) async { + await prefs.setString("autoCopy", "source"); + }, + ), + MenuItem( + key: "autoCopyResult", + label: "译文", + onClick: (_) async { + await prefs.setString("autoCopy", "result"); + }, + ), + MenuItem( + key: "autoCopyBoth", + label: "原文+译文", + onClick: (_) async { + await prefs.setString("autoCopy", "both"); + }, + ), + ], + ), + ), + MenuItem( + key: "show_settings", + label: "应用设置", + ), + MenuItem.separator(), + MenuItem( + key: "exit_app", + label: "退出应用", + ), + ], + ); + + await trayManager.destroy(); + await trayManager.setIcon( + Platform.isWindows ? "assets/logo.ico" : "assets/logo.png", + ); + await trayManager.setContextMenu(menu); +} + +/// 隐藏窗口到系统托盘 +Future hideToTray() async { + await windowManager.hide(); + await windowManager.setSkipTaskbar(true); +}