tray.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. use crate::app_state::AppState;
  2. use tauri::menu::{MenuBuilder, MenuItemBuilder};
  3. use tauri::tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent};
  4. use tauri::{App, Manager};
  5. pub fn setup_tray(app: &App) -> tauri::Result<()> {
  6. let settings_i = MenuItemBuilder::with_id("settings", "设置").build(app)?;
  7. let toggle_i = MenuItemBuilder::with_id("toggle", "显示/隐藏").build(app)?;
  8. let passthrough_i = MenuItemBuilder::with_id("passthrough", "鼠标穿透").build(app)?;
  9. let quit_i = MenuItemBuilder::with_id("quit", "退出").build(app)?;
  10. let menu = MenuBuilder::new(app)
  11. .items(&[&settings_i, &toggle_i, &passthrough_i, &quit_i])
  12. .build()?;
  13. let _tray = TrayIconBuilder::new()
  14. .icon(app.default_window_icon().expect("bundle icon").clone())
  15. .menu(&menu)
  16. .show_menu_on_left_click(false)
  17. .on_menu_event(|app, event| match event.id().as_ref() {
  18. "settings" => show_settings(app),
  19. "toggle" => toggle_main(app),
  20. "passthrough" => toggle_passthrough(app),
  21. "quit" => app.exit(0),
  22. _ => {}
  23. })
  24. .on_tray_icon_event(|tray, event| {
  25. if let TrayIconEvent::Click {
  26. button: MouseButton::Left,
  27. button_state: MouseButtonState::Up,
  28. ..
  29. } = event
  30. {
  31. toggle_main(tray.app_handle());
  32. }
  33. })
  34. .build(app)?;
  35. Ok(())
  36. }
  37. pub fn show_settings(app: &tauri::AppHandle) {
  38. if let Some(win) = app.get_webview_window("settings") {
  39. let _ = win.show();
  40. let _ = win.set_focus();
  41. }
  42. }
  43. pub fn toggle_main(app: &tauri::AppHandle) {
  44. if let Some(win) = app.get_webview_window("main") {
  45. match win.is_visible() {
  46. Ok(true) => { let _ = win.hide(); }
  47. _ => { let _ = win.show(); }
  48. }
  49. }
  50. }
  51. pub fn toggle_passthrough(app: &tauri::AppHandle) {
  52. if let Some(state) = app.try_state::<AppState>() {
  53. let mut passthrough = state.passthrough.lock().unwrap();
  54. *passthrough = !*passthrough;
  55. if let Some(win) = app.get_webview_window("main") {
  56. let _ = win.set_ignore_cursor_events(*passthrough);
  57. }
  58. }
  59. }