summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2021-07-19 21:18:54 +0700
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2021-07-19 21:18:54 +0700
commitb97954a1ee3ec7bc85d1d41b397e994752ff1831 (patch)
tree0adfbc12d44161fad183269b5d724042f5fe09af
parentc8ac77e4e99414746adedf38cf69ac8dcd1601a4 (diff)
downloadiced-b97954a1ee3ec7bc85d1d41b397e994752ff1831.tar.gz
iced-b97954a1ee3ec7bc85d1d41b397e994752ff1831.tar.bz2
iced-b97954a1ee3ec7bc85d1d41b397e994752ff1831.zip
Add a presets `Menu` to the `game_of_life` example
-rw-r--r--core/src/menu.rs4
-rw-r--r--examples/game_of_life/src/main.rs8
-rw-r--r--examples/game_of_life/src/preset.rs13
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 {