From 70b122fb9146e7fbb4f61eefcf550784f59928ff Mon Sep 17 00:00:00 2001 From: Mg Pig Date: Mon, 1 Dec 2025 01:11:36 +0800 Subject: [PATCH] feat(gui): macOS UX Improvements (#1631) --- easytier-gui/src-tauri/src/lib.rs | 29 +++++++++------------ easytier-gui/src/modules/dock_visibility.ts | 18 ------------- easytier-gui/src/pages/index.vue | 9 ------- 3 files changed, 12 insertions(+), 44 deletions(-) delete mode 100644 easytier-gui/src/modules/dock_visibility.ts diff --git a/easytier-gui/src-tauri/src/lib.rs b/easytier-gui/src-tauri/src/lib.rs index 420596c..924c144 100644 --- a/easytier-gui/src-tauri/src/lib.rs +++ b/easytier-gui/src-tauri/src/lib.rs @@ -392,19 +392,25 @@ async fn is_client_running() -> Result { } #[cfg(not(target_os = "android"))] -fn toggle_window_visibility(app: &tauri::AppHandle) { +fn toggle_window_visibility(app: &tauri::AppHandle) { if let Some(window) = app.get_webview_window("main") { - if window.is_visible().unwrap_or_default() { + let visible = if window.is_visible().unwrap_or_default() { if window.is_minimized().unwrap_or_default() { let _ = window.unminimize(); - let _ = window.set_focus(); + false } else { - let _ = window.hide(); + true } } else { let _ = window.show(); + false + }; + if visible { + let _ = window.hide(); + } else { let _ = window.set_focus(); } + let _ = set_dock_visibility(app.clone(), !visible); } } @@ -892,7 +898,7 @@ pub fn run_gui() -> std::process::ExitCode { .icon(tauri::image::Image::from_bytes(include_bytes!( "../icons/icon.png" ))?) - .icon_as_template(false) + .icon_as_template(true) .build(app)?; Ok(()) @@ -924,6 +930,7 @@ pub fn run_gui() -> std::process::ExitCode { #[cfg(not(target_os = "android"))] tauri::WindowEvent::CloseRequested { api, .. } => { let _ = _win.hide(); + let _ = set_dock_visibility(_win.app_handle().clone(), false); api.prevent_close(); } _ => {} @@ -931,20 +938,8 @@ pub fn run_gui() -> std::process::ExitCode { .build(tauri::generate_context!()) .unwrap(); - #[cfg(not(target_os = "macos"))] app.run(|_app, _event| {}); - #[cfg(target_os = "macos")] - { - use tauri::RunEvent; - app.run(|app, event| match event { - RunEvent::Reopen { .. } => { - toggle_window_visibility(app); - } - _ => {} - }); - } - std::process::ExitCode::SUCCESS } diff --git a/easytier-gui/src/modules/dock_visibility.ts b/easytier-gui/src/modules/dock_visibility.ts deleted file mode 100644 index bcdf4cd..0000000 --- a/easytier-gui/src/modules/dock_visibility.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { invoke } from '@tauri-apps/api/core' - -export async function loadDockVisibilityAsync(visible: boolean): Promise { - try { - await invoke('set_dock_visibility', { visible }) - localStorage.setItem('dock_visibility', JSON.stringify(visible)) - return visible - } - catch (e) { - console.error('Failed to set dock visibility:', e) - return getDockVisibilityStatus() - } -} - -export function getDockVisibilityStatus(): boolean { - const stored = localStorage.getItem('dock_visibility') - return stored !== null ? JSON.parse(stored) : true -} diff --git a/easytier-gui/src/pages/index.vue b/easytier-gui/src/pages/index.vue index 742e11d..6f0a41d 100644 --- a/easytier-gui/src/pages/index.vue +++ b/easytier-gui/src/pages/index.vue @@ -10,7 +10,6 @@ import type { MenuItem } from 'primevue/menuitem' import { useTray } from '~/composables/tray' import { GUIRemoteClient } from '~/modules/api' -import { getDockVisibilityStatus, loadDockVisibilityAsync } from '~/modules/dock_visibility' import { useToast, useConfirm } from 'primevue' import { loadMode, saveMode, type Mode } from '~/composables/mode' import ModeSwitcher from '~/components/ModeSwitcher.vue' @@ -263,14 +262,6 @@ const setting_menu_items: Ref = ref([ command: openModeDialog, visible: () => type() !== 'android', }, - { - label: () => getDockVisibilityStatus() ? t('hide_dock_icon') : t('show_dock_icon'), - icon: 'pi pi-eye-slash', - command: async () => { - await loadDockVisibilityAsync(!getDockVisibilityStatus()) - }, - visible: () => type() === 'macos', - }, { key: 'logging_menu', label: () => t('logging'),