summaryrefslogtreecommitdiffstats
path: root/winit/src/conversion.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2021-07-13 21:31:34 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2021-07-13 21:31:34 +0200
commit2e7eac7d2167b492149e064927e764eca67f98fe (patch)
treeb14a00f6ef41b09c74f9413c592f5cd3c7af9c9b /winit/src/conversion.rs
parent5df2a92f28be1d53d32d5b42a6645459b7d78efe (diff)
downloadiced-2e7eac7d2167b492149e064927e764eca67f98fe.tar.gz
iced-2e7eac7d2167b492149e064927e764eca67f98fe.tar.bz2
iced-2e7eac7d2167b492149e064927e764eca67f98fe.zip
Implement `conversion::menu_message`
Diffstat (limited to '')
-rw-r--r--winit/src/conversion.rs50
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.