use crate::app_state::AppState; use tauri::menu::{MenuBuilder, MenuItemBuilder}; use tauri::tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}; use tauri::{App, Manager}; pub fn setup_tray(app: &App) -> tauri::Result<()> { let settings_i = MenuItemBuilder::with_id("settings", "设置").build(app)?; let toggle_i = MenuItemBuilder::with_id("toggle", "显示/隐藏").build(app)?; let passthrough_i = MenuItemBuilder::with_id("passthrough", "鼠标穿透").build(app)?; let quit_i = MenuItemBuilder::with_id("quit", "退出").build(app)?; let menu = MenuBuilder::new(app) .items(&[&settings_i, &toggle_i, &passthrough_i, &quit_i]) .build()?; let _tray = TrayIconBuilder::new() .icon(app.default_window_icon().expect("bundle icon").clone()) .menu(&menu) .show_menu_on_left_click(false) .on_menu_event(|app, event| match event.id().as_ref() { "settings" => show_settings(app), "toggle" => toggle_main(app), "passthrough" => toggle_passthrough(app), "quit" => app.exit(0), _ => {} }) .on_tray_icon_event(|tray, event| { if let TrayIconEvent::Click { button: MouseButton::Left, button_state: MouseButtonState::Up, .. } = event { toggle_main(tray.app_handle()); } }) .build(app)?; Ok(()) } pub fn show_settings(app: &tauri::AppHandle) { if let Some(win) = app.get_webview_window("settings") { let _ = win.show(); let _ = win.set_focus(); } } pub fn toggle_main(app: &tauri::AppHandle) { if let Some(win) = app.get_webview_window("main") { match win.is_visible() { Ok(true) => { let _ = win.hide(); } _ => { let _ = win.show(); } } } } pub fn toggle_passthrough(app: &tauri::AppHandle) { if let Some(state) = app.try_state::() { let mut passthrough = state.passthrough.lock().unwrap(); *passthrough = !*passthrough; if let Some(win) = app.get_webview_window("main") { let _ = win.set_ignore_cursor_events(*passthrough); } } }