diff --git a/examples/menu.rs b/examples/menu.rs index 2a0487b..1dedbd7 100644 --- a/examples/menu.rs +++ b/examples/menu.rs @@ -90,9 +90,11 @@ fn main() { let mut menu = Menu::new("TestMenu").unwrap(); - menu.add_item(&MenuItem::new("Item 1", 1).shortcut(Key::S, 0)); - menu.add_item(&MenuItem::new("Item 2", 2)); - menu.add_item(&MenuItem::new("Item 3", 3)); + menu.add_menu_item(&MenuItem::new("Item 1", 1).shortcut(Key::S, 0)); + menu.add_menu_item(&MenuItem::new("Item 2", 2)); + menu.add_menu_item(&MenuItem::new("Item 3", 3)); + + menu.add_item("Some item", 2).shortcut(Key::Y, 0).build(); let _ = window.add_menu(&menu); diff --git a/src/lib.rs b/src/lib.rs index 00f9d34..554f62e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -530,8 +530,18 @@ impl Menu { } #[inline] - pub fn add_item(&mut self, item: &MenuItem) -> MenuItemHandle { - self.0.add_item(item) + pub fn add_menu_item(&mut self, item: &MenuItem) -> MenuItemHandle { + self.0.add_menu_item(item) + } + + #[inline] + pub fn add_item(&mut self, name: &str, id: usize) -> MenuItem { + MenuItem { + id: id, + label: name.to_owned(), + menu: Some(self), + ..MenuItem::default() + } } #[inline] @@ -540,22 +550,47 @@ impl Menu { } } -pub struct MenuItem { +pub struct MenuItem<'a> { pub id: usize, pub label: String, pub enabled: bool, pub key: Key, pub modifier: u32, + pub menu: Option<&'a mut Menu>, } -impl MenuItem { +impl<'a> Default for MenuItem<'a> { + fn default() -> Self { + MenuItem { + id: MENU_ID_SEPARATOR, + label: "".to_owned(), + enabled: true, + key: Key::Unknown, + modifier: 0, + menu: None, + } + } +} + +impl<'a> Clone for MenuItem<'a> { + fn clone(&self) -> Self { + MenuItem { + id: self.id, + label: self.label.clone(), + enabled: self.enabled, + key: self.key, + modifier: self.modifier, + menu: None, + } + } +} + +impl<'a> MenuItem<'a> { pub fn new(name: &str, id: usize) -> MenuItem { MenuItem { id: id, label: name.to_owned(), - enabled: true, - key: Key::Unknown, - modifier: 0, + ..MenuItem::default() } } #[inline] @@ -580,6 +615,15 @@ impl MenuItem { .. self } } + #[inline] + pub fn build(&mut self) -> MenuItemHandle { + let t = self.clone(); + if let Some(ref mut menu) = self.menu { + menu.0.add_menu_item(&t) + } else { + MenuItemHandle(0) + } + } } // Impl for WindowOptions diff --git a/src/os/macos/mod.rs b/src/os/macos/mod.rs index 133209e..c987cbc 100644 --- a/src/os/macos/mod.rs +++ b/src/os/macos/mod.rs @@ -616,7 +616,7 @@ impl Menu { } } - pub fn add_item(&mut self, item: &MenuItem) -> MenuItemHandle { + pub fn add_menu_item(&mut self, item: &MenuItem) -> MenuItemHandle { unsafe { let item_name = CString::new(item.label.as_str()).unwrap(); let conv_key = Self::map_key_to_menu_key(item.key);