|
|
@@ -0,0 +1,65 @@
|
|
|
+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::<AppState>() {
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|