Add a presets Menu to the game_of_life example

This commit is contained in:
Héctor Ramón Jiménez 2021-07-19 21:18:54 +07:00
parent c8ac77e4e9
commit b97954a1ee
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
3 changed files with 23 additions and 2 deletions

View file

@ -41,7 +41,7 @@ impl<Message> Menu<Message> {
/// ///
/// This is useful to compose menus and split them into different /// This is useful to compose menus and split them into different
/// abstraction levels. /// 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 // TODO: Use a boxed trait to avoid reallocation of entries
Menu { Menu {
entries: self entries: self
@ -100,7 +100,7 @@ impl<Message> Entry<Message> {
Self::Dropdown { title, submenu } 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 { match self {
Self::Item { Self::Item {
title, title,

View file

@ -6,6 +6,7 @@ mod style;
use grid::Grid; use grid::Grid;
use iced::button::{self, Button}; use iced::button::{self, Button};
use iced::executor; use iced::executor;
use iced::menu::{self, Menu};
use iced::pick_list::{self, PickList}; use iced::pick_list::{self, PickList};
use iced::slider::{self, Slider}; use iced::slider::{self, Slider};
use iced::time; 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> { fn view(&mut self) -> Element<Message> {
let version = self.version; let version = self.version;
let selected_speed = self.next_speed.unwrap_or(self.speed); let selected_speed = self.next_speed.unwrap_or(self.speed);

View file

@ -1,3 +1,5 @@
use iced::menu::{self, Menu};
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Preset { pub enum Preset {
Custom, Custom,
@ -26,6 +28,17 @@ pub static ALL: &[Preset] = &[
]; ];
impl 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)> { pub fn life(self) -> Vec<(isize, isize)> {
#[rustfmt::skip] #[rustfmt::skip]
let cells = match self { let cells = match self {