diff options
-rw-r--r-- | core/src/menu.rs | 4 | ||||
-rw-r--r-- | examples/game_of_life/src/main.rs | 8 | ||||
-rw-r--r-- | examples/game_of_life/src/preset.rs | 13 |
3 files changed, 23 insertions, 2 deletions
diff --git a/core/src/menu.rs b/core/src/menu.rs index 3ad7b7a2..8a679085 100644 --- a/core/src/menu.rs +++ b/core/src/menu.rs @@ -41,7 +41,7 @@ impl<Message> Menu<Message> { /// /// This is useful to compose menus and split them into different /// abstraction levels. - pub fn map<B>(self, f: &impl Fn(Message) -> B) -> Menu<B> { + pub fn map<B>(self, f: impl Fn(Message) -> B + Copy) -> Menu<B> { // TODO: Use a boxed trait to avoid reallocation of entries Menu { entries: self @@ -100,7 +100,7 @@ impl<Message> Entry<Message> { Self::Dropdown { title, submenu } } - fn map<B>(self, f: &impl Fn(Message) -> B) -> Entry<B> { + fn map<B>(self, f: impl Fn(Message) -> B + Copy) -> Entry<B> { match self { Self::Item { title, diff --git a/examples/game_of_life/src/main.rs b/examples/game_of_life/src/main.rs index 64599163..877aa2d2 100644 --- a/examples/game_of_life/src/main.rs +++ b/examples/game_of_life/src/main.rs @@ -6,6 +6,7 @@ mod style; use grid::Grid; use iced::button::{self, Button}; use iced::executor; +use iced::menu::{self, Menu}; use iced::pick_list::{self, PickList}; use iced::slider::{self, Slider}; use iced::time; @@ -128,6 +129,13 @@ impl Application for GameOfLife { } } + fn menu(&self) -> Menu<Message> { + Menu::with_entries(vec![menu::Entry::dropdown( + "Presets", + Preset::menu().map(Message::PresetPicked), + )]) + } + fn view(&mut self) -> Element<Message> { let version = self.version; let selected_speed = self.next_speed.unwrap_or(self.speed); diff --git a/examples/game_of_life/src/preset.rs b/examples/game_of_life/src/preset.rs index 05157b6a..1c199a72 100644 --- a/examples/game_of_life/src/preset.rs +++ b/examples/game_of_life/src/preset.rs @@ -1,3 +1,5 @@ +use iced::menu::{self, Menu}; + #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Preset { Custom, @@ -26,6 +28,17 @@ pub static ALL: &[Preset] = &[ ]; impl Preset { + pub fn menu() -> Menu<Self> { + Menu::with_entries( + ALL.iter() + .copied() + .map(|preset| { + menu::Entry::item(preset.to_string(), None, preset) + }) + .collect(), + ) + } + pub fn life(self) -> Vec<(isize, isize)> { #[rustfmt::skip] let cells = match self { |