Add a presets Menu to the game_of_life example
This commit is contained in:
parent
c8ac77e4e9
commit
b97954a1ee
3 changed files with 23 additions and 2 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue