diff --git a/.changes/system_tray_title.md b/.changes/system_tray_title.md new file mode 100644 index 000000000..68e9f4a84 --- /dev/null +++ b/.changes/system_tray_title.md @@ -0,0 +1,5 @@ +--- +"tao": "minor" +--- + +* `SystemTray` has new `set_title(title: &str)` method to set title, only works on macos. \ No newline at end of file diff --git a/examples/system_tray.rs b/examples/system_tray.rs index e114f30ae..df558e5d4 100644 --- a/examples/system_tray.rs +++ b/examples/system_tray.rs @@ -45,6 +45,15 @@ fn main() { // inject submenu into tray_menu tray_menu.add_submenu("Sub menu", true, submenu); + // tray macos text submenus + let mut text_submenu = Menu::new(); + let only_text_element = text_submenu.add_item(MenuItemAttributes::new("Only text")); + let only_icon_element = text_submenu.add_item(MenuItemAttributes::new("Only icon")); + let icon_and_text_element = text_submenu.add_item(MenuItemAttributes::new("Icon and text")); + + #[cfg(target_os = "macos")] + tray_menu.add_submenu("Icon/Text options", true, text_submenu); + // add quit button let quit_element = tray_menu.add_item(MenuItemAttributes::new("Quit")); @@ -156,8 +165,21 @@ fn main() { origin: MenuType::ContextMenu, .. } => { + if menu_id == only_icon_element.clone().id() { + #[cfg(target_os = "macos")] + system_tray.set_title(""); + system_tray.set_icon(icon.clone()); + } else if menu_id == only_text_element.clone().id() { + #[cfg(target_os = "macos")] + system_tray.set_title("Tao Menu Title"); + system_tray.set_icon(vec![]); + } else if menu_id == icon_and_text_element.clone().id() { + #[cfg(target_os = "macos")] + system_tray.set_title("Tao Menu Title"); + system_tray.set_icon(icon.clone()); + } // Click on Open new window or focus item - if menu_id == open_new_window_element.clone().id() + else if menu_id == open_new_window_element.clone().id() || menu_id == focus_all_window.clone().id() { create_window_or_focus(); diff --git a/src/platform_impl/macos/system_tray.rs b/src/platform_impl/macos/system_tray.rs index ebb6e6816..20c047dbf 100644 --- a/src/platform_impl/macos/system_tray.rs +++ b/src/platform_impl/macos/system_tray.rs @@ -16,11 +16,11 @@ use crate::{ }; use cocoa::{ appkit::{ - NSButton, NSEventMask, NSEventModifierFlags, NSEventType, NSImage, NSSquareStatusItemLength, - NSStatusBar, NSStatusItem, NSWindow, + NSButton, NSEventMask, NSEventModifierFlags, NSEventType, NSImage, NSStatusBar, NSStatusItem, + NSVariableStatusItemLength, NSWindow, }, base::{id, nil, NO, YES}, - foundation::{NSAutoreleasePool, NSData, NSPoint, NSSize}, + foundation::{NSAutoreleasePool, NSData, NSPoint, NSSize, NSString}, }; use objc::{ declare::ClassDecl, @@ -38,7 +38,7 @@ impl SystemTrayBuilder { pub fn new(icon: Vec, tray_menu: Option) -> Self { unsafe { let ns_status_bar = NSStatusBar::systemStatusBar(nil) - .statusItemWithLength_(NSSquareStatusItemLength) + .statusItemWithLength_(NSVariableStatusItemLength) .autorelease(); Self { @@ -120,6 +120,15 @@ impl SystemTray { } } + pub fn set_title(&mut self, title: &str) { + unsafe { + NSButton::setTitle_( + self.ns_status_bar.button(), + NSString::alloc(nil).init_str(title), + ); + } + } + fn create_button_with_icon(&self) { const ICON_WIDTH: f64 = 18.0; const ICON_HEIGHT: f64 = 18.0; @@ -140,6 +149,7 @@ impl SystemTray { button.setImage_(nsimage); let _: () = msg_send![nsimage, setSize: new_size]; + let _: () = msg_send![button, setImagePosition: 2]; // https://developer.apple.com/documentation/appkit/nscellimageposition/nsimageleft let is_template = match self.icon_is_template { true => YES, false => NO, diff --git a/src/system_tray.rs b/src/system_tray.rs index 95cc21d58..1ad6f1ace 100644 --- a/src/system_tray.rs +++ b/src/system_tray.rs @@ -105,6 +105,16 @@ impl SystemTray { self.0.set_icon(icon) } + /// Set new tray menu title. + /// + /// ## Platform-specific + /// + /// Only works on **macOS** + #[cfg(target_os = "macos")] + pub fn set_title(&mut self, title: &str) { + self.0.set_title(title) + } + /// Set new tray menu. pub fn set_menu(&mut self, tray_menu: &ContextMenu) { self.0.set_menu(&tray_menu.0.menu_platform)