From 4f301bd0b5de2b0236f6a712e8f0ecc8c4f3b6d6 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Wed, 2 Nov 2022 10:22:41 +0800 Subject: [PATCH] feat: add flutter tray and hide logic of main window --- .../lib/desktop/pages/desktop_home_page.dart | 20 ++++++++++++++----- .../lib/desktop/widgets/tabbar_widget.dart | 15 +++++++------- flutter/lib/main.dart | 2 -- flutter/lib/utils/tray_manager.dart | 15 +++++++++++--- src/lang/cn.rs | 1 + 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index 152463c68..e569e2511 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -13,6 +13,7 @@ import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart'; import 'package:flutter_hbb/models/platform_model.dart'; import 'package:flutter_hbb/models/server_model.dart'; import 'package:flutter_hbb/utils/multi_window_manager.dart'; +import 'package:flutter_hbb/utils/tray_manager.dart'; import 'package:get/get.dart'; import 'package:provider/provider.dart'; import 'package:tray_manager/tray_manager.dart'; @@ -395,14 +396,21 @@ class _DesktopHomePageState extends State ); } + @override + void onTrayIconMouseDown() { + windowManager.show(); + windowManager.focus(); + } + @override void onTrayMenuItemClick(MenuItem menuItem) { - debugPrint('click ${menuItem.key}'); switch (menuItem.key) { - case "quit": - exit(0); - case "show": - // windowManager.show(); + case kTrayItemQuitKey: + windowManager.close(); + break; + case kTrayItemShowKey: + windowManager.show(); + windowManager.focus(); break; default: break; @@ -416,6 +424,7 @@ class _DesktopHomePageState extends State updateUrl = await bind.mainGetSoftwareUpdateUrl(); if (updateUrl.isNotEmpty) setState(() {}); }); + initTray(); trayManager.addListener(this); windowManager.addListener(this); rustDeskWinManager.setMethodHandler((call, fromWindowId) async { @@ -456,6 +465,7 @@ class _DesktopHomePageState extends State @override void dispose() { + destoryTray(); trayManager.removeListener(this); windowManager.removeListener(this); _uniLinksSubscription?.cancel(); diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index 6643183f5..1f849e453 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -509,14 +509,15 @@ class WindowActionPanelState extends State onTap: () async { final res = await widget.onClose?.call() ?? true; if (res) { - if (widget.isMainWindow) { - windowManager.close(); - } else { - // only hide for multi window, not close - Future.delayed(Duration.zero, () { + // hide for all window + // note: the main window can be restored by tray icon + Future.delayed(Duration.zero, () { + if (widget.isMainWindow) { + windowManager.hide(); + } else { WindowController.fromWindowId(windowId!).hide(); - }); - } + } + }); } }, isClose: true, diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index df314396f..52eacf5f5 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -101,8 +101,6 @@ void runMainApp(bool startService) async { await bind.mainCheckConnectStatus(); if (startService) { // await windowManager.ensureInitialized(); - // disable tray - // initTray(); gFFI.serverModel.startService(); } runApp(App()); diff --git a/flutter/lib/utils/tray_manager.dart b/flutter/lib/utils/tray_manager.dart index f0422f554..5c665c1bd 100644 --- a/flutter/lib/utils/tray_manager.dart +++ b/flutter/lib/utils/tray_manager.dart @@ -4,11 +4,14 @@ import 'package:tray_manager/tray_manager.dart'; import '../common.dart'; +const kTrayItemShowKey = "show"; +const kTrayItemQuitKey = "quit"; + Future initTray({List? extra_item}) async { List items = [ - MenuItem(key: "show", label: translate("show rustdesk")), + MenuItem(key: kTrayItemShowKey, label: translate("Show RustDesk")), MenuItem.separator(), - MenuItem(key: "quit", label: translate("quit rustdesk")), + MenuItem(key: kTrayItemQuitKey, label: translate("Quit")), ]; if (extra_item != null) { items.insertAll(0, extra_item); @@ -17,7 +20,13 @@ Future initTray({List? extra_item}) async { trayManager .setIcon(Platform.isWindows ? "assets/logo.ico" : "assets/logo.png"), trayManager.setContextMenu(Menu(items: items)), - trayManager.setToolTip("rustdesk"), trayManager.setTitle("rustdesk") ]); + if (Platform.isMacOS || Platform.isWindows) { + await trayManager.setToolTip("rustdesk"); + } +} + +Future destoryTray() async { + return trayManager.destroy(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index ca69ef4e4..29516432d 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -385,5 +385,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Wayland requires higher version of linux distro. Please try X11 desktop or change your OS.", "Wayland 需要更高版本的 linux 发行版。 请尝试 X11 桌面或更改您的操作系统。"), ("JumpLink", "查看"), ("Please Select the screen to be shared(Operate on the peer side).", "请选择要分享的画面(对端操作)。"), + ("Show RustDesk", "显示rustdesk"), ].iter().cloned().collect(); }