diff options
author | 2021-07-13 21:31:34 +0200 | |
---|---|---|
committer | 2021-07-13 21:31:34 +0200 | |
commit | 2e7eac7d2167b492149e064927e764eca67f98fe (patch) | |
tree | b14a00f6ef41b09c74f9413c592f5cd3c7af9c9b /winit/src/conversion.rs | |
parent | 5df2a92f28be1d53d32d5b42a6645459b7d78efe (diff) | |
download | iced-2e7eac7d2167b492149e064927e764eca67f98fe.tar.gz iced-2e7eac7d2167b492149e064927e764eca67f98fe.tar.bz2 iced-2e7eac7d2167b492149e064927e764eca67f98fe.zip |
Implement `conversion::menu_message`
Diffstat (limited to '')
-rw-r--r-- | winit/src/conversion.rs | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 687a037e..dc7f90ad 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -220,16 +220,54 @@ pub fn menu<Message>(menu: &Menu<Message>) -> winit::window::Menu { /// Given a [`Menu`] and an identifier of a [`menu::Entry`], it returns the /// `Message` that should be produced when that entry is activated. -pub fn menu_message<Message>( - _menu: &Menu<Message>, - id: isize, -) -> Option<Message> +pub fn menu_message<Message>(menu: &Menu<Message>, id: isize) -> Option<Message> where Message: Clone, { - println!("Menu entry activated: {}", id); + use std::convert::TryFrom; - None + fn find_message<Message>( + target: usize, + starting_id: usize, + menu: &Menu<Message>, + ) -> Result<Message, usize> + where + Message: Clone, + { + let mut id = starting_id; + + for entry in menu.iter() { + match entry { + menu::Entry::Item { on_activation, .. } => { + if id == target { + return Ok(on_activation.clone()); + } + + id += 1; + } + menu::Entry::Dropdown { submenu, .. } => { + match find_message(target, id, submenu) { + Ok(message) => { + return Ok(message); + } + Err(n_children) => { + id += n_children; + } + } + } + menu::Entry::Separator => {} + } + } + + Err(id - starting_id) + } + + // TODO: Does `winit` really need to provide an `isize`? + if let Ok(id) = usize::try_from(id) { + find_message(id, 0, menu).ok() + } else { + None + } } /// Converts a `MouseCursor` from [`iced_native`] to a [`winit`] cursor icon. |