tray.rs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright 2019-2024 Tauri Programme within The Commons Conservancy
  2. // SPDX-License-Identifier: Apache-2.0
  3. // SPDX-License-Identifier: MIT
  4. use std::sync::atomic::{AtomicBool, Ordering};
  5. use tauri::{
  6. include_image,
  7. menu::{Menu, MenuItem},
  8. tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent},
  9. Manager, Runtime, WebviewUrl,
  10. };
  11. pub fn create_tray<R: Runtime>(app: &tauri::AppHandle<R>) -> tauri::Result<()> {
  12. let toggle_i = MenuItem::with_id(app, "toggle", "Toggle", true, None::<&str>)?;
  13. let new_window_i = MenuItem::with_id(app, "new-window", "New window", true, None::<&str>)?;
  14. let icon_i_1 = MenuItem::with_id(app, "icon-1", "Icon 1", true, None::<&str>)?;
  15. let icon_i_2 = MenuItem::with_id(app, "icon-2", "Icon 2", true, None::<&str>)?;
  16. #[cfg(target_os = "macos")]
  17. let set_title_i = MenuItem::with_id(app, "set-title", "Set Title", true, None::<&str>)?;
  18. let switch_i = MenuItem::with_id(app, "switch-menu", "Switch Menu", true, None::<&str>)?;
  19. let quit_i = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?;
  20. let remove_tray_i =
  21. MenuItem::with_id(app, "remove-tray", "Remove Tray icon", true, None::<&str>)?;
  22. let menu1 = Menu::with_items(
  23. app,
  24. &[
  25. &toggle_i,
  26. &new_window_i,
  27. &icon_i_1,
  28. &icon_i_2,
  29. #[cfg(target_os = "macos")]
  30. &set_title_i,
  31. &switch_i,
  32. &quit_i,
  33. &remove_tray_i,
  34. ],
  35. )?;
  36. let menu2 = Menu::with_items(
  37. app,
  38. &[&toggle_i, &new_window_i, &switch_i, &quit_i, &remove_tray_i],
  39. )?;
  40. let is_menu1 = AtomicBool::new(true);
  41. let _ = TrayIconBuilder::with_id("tray-1")
  42. .tooltip("Tauri")
  43. .icon(app.default_window_icon().unwrap().clone())
  44. .menu(&menu1)
  45. .menu_on_left_click(false)
  46. .on_menu_event(move |app, event| match event.id.as_ref() {
  47. "quit" => {
  48. app.exit(0);
  49. }
  50. "remove-tray" => {
  51. app.remove_tray_by_id("tray-1");
  52. }
  53. "toggle" => {
  54. if let Some(window) = app.get_webview_window("main") {
  55. let new_title = if window.is_visible().unwrap_or_default() {
  56. let _ = window.hide();
  57. "Show"
  58. } else {
  59. let _ = window.show();
  60. let _ = window.set_focus();
  61. "Hide"
  62. };
  63. toggle_i.set_text(new_title).unwrap();
  64. }
  65. }
  66. "new-window" => {
  67. let _webview =
  68. tauri::WebviewWindowBuilder::new(app, "new", WebviewUrl::App("index.html".into()))
  69. .title("Tauri")
  70. .build()
  71. .unwrap();
  72. }
  73. #[cfg(target_os = "macos")]
  74. "set-title" => {
  75. if let Some(tray) = app.tray_by_id("tray-1") {
  76. let _ = tray.set_title(Some("Tauri"));
  77. }
  78. }
  79. i @ "icon-1" | i @ "icon-2" => {
  80. if let Some(tray) = app.tray_by_id("tray-1") {
  81. let icon = if i == "icon-1" {
  82. include_image!("../../.icons/icon.ico")
  83. } else {
  84. include_image!("../../.icons/tray_icon_with_transparency.png")
  85. };
  86. let _ = tray.set_icon(Some(icon));
  87. }
  88. }
  89. "switch-menu" => {
  90. let flag = is_menu1.load(Ordering::Relaxed);
  91. let (menu, tooltip) = if flag {
  92. (menu2.clone(), "Menu 2")
  93. } else {
  94. (menu1.clone(), "Tauri")
  95. };
  96. if let Some(tray) = app.tray_by_id("tray-1") {
  97. let _ = tray.set_menu(Some(menu));
  98. let _ = tray.set_tooltip(Some(tooltip));
  99. }
  100. is_menu1.store(!flag, Ordering::Relaxed);
  101. }
  102. _ => {}
  103. })
  104. .on_tray_icon_event(|tray, event| {
  105. if let TrayIconEvent::Click {
  106. button: MouseButton::Left,
  107. button_state: MouseButtonState::Up,
  108. ..
  109. } = event
  110. {
  111. let app = tray.app_handle();
  112. if let Some(window) = app.get_webview_window("main") {
  113. let _ = window.show();
  114. let _ = window.set_focus();
  115. }
  116. }
  117. })
  118. .build(app);
  119. Ok(())
  120. }