Add "Theming" section to the tour example

This commit is contained in:
Héctor Ramón Jiménez 2022-05-26 05:31:55 +02:00
parent 5a39dad506
commit 3e8f4cdd13
No known key found for this signature in database
GPG key ID: 140CC052C94F138E

View file

@ -7,7 +7,7 @@ use iced::theme;
use iced::{ use iced::{
Button, Checkbox, Color, Column, Container, ContentFit, Element, Image, Button, Checkbox, Color, Column, Container, ContentFit, Element, Image,
Length, Radio, Row, Sandbox, Scrollable, Settings, Slider, Space, Text, Length, Radio, Row, Sandbox, Scrollable, Settings, Slider, Space, Text,
TextInput, Toggler, TextInput, Theme, Toggler,
}; };
pub fn main() -> iced::Result { pub fn main() -> iced::Result {
@ -21,6 +21,7 @@ pub struct Tour {
scroll: scrollable::State, scroll: scrollable::State,
back_button: button::State, back_button: button::State,
next_button: button::State, next_button: button::State,
theme: Theme,
debug: bool, debug: bool,
} }
@ -33,6 +34,7 @@ impl Sandbox for Tour {
scroll: scrollable::State::new(), scroll: scrollable::State::new(),
back_button: button::State::new(), back_button: button::State::new(),
next_button: button::State::new(), next_button: button::State::new(),
theme: Theme::default(),
debug: false, debug: false,
} }
} }
@ -50,7 +52,8 @@ impl Sandbox for Tour {
self.steps.advance(); self.steps.advance();
} }
Message::StepMessage(step_msg) => { Message::StepMessage(step_msg) => {
self.steps.update(step_msg, &mut self.debug); self.steps
.update(step_msg, &mut self.theme, &mut self.debug);
} }
} }
} }
@ -88,7 +91,7 @@ impl Sandbox for Tour {
.max_width(540) .max_width(540)
.spacing(20) .spacing(20)
.padding(20) .padding(20)
.push(steps.view(self.debug).map(Message::StepMessage)) .push(steps.view(self.theme, self.debug).map(Message::StepMessage))
.push(controls) .push(controls)
.into(); .into();
@ -106,6 +109,10 @@ impl Sandbox for Tour {
.center_y() .center_y()
.into() .into()
} }
fn theme(&self) -> Theme {
self.theme
}
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -125,6 +132,7 @@ impl Steps {
Steps { Steps {
steps: vec![ steps: vec![
Step::Welcome, Step::Welcome,
Step::Theming,
Step::Slider { Step::Slider {
state: slider::State::new(), state: slider::State::new(),
value: 50, value: 50,
@ -138,7 +146,7 @@ impl Steps {
size_slider: slider::State::new(), size_slider: slider::State::new(),
size: 30, size: 30,
color_sliders: [slider::State::new(); 3], color_sliders: [slider::State::new(); 3],
color: Color::BLACK, color: Color::from_rgb(0.5, 0.5, 0.5),
}, },
Step::Radio { selection: None }, Step::Radio { selection: None },
Step::Toggler { Step::Toggler {
@ -162,12 +170,17 @@ impl Steps {
} }
} }
fn update(&mut self, msg: StepMessage, debug: &mut bool) { fn update(
self.steps[self.current].update(msg, debug); &mut self,
msg: StepMessage,
theme: &mut Theme,
debug: &mut bool,
) {
self.steps[self.current].update(msg, theme, debug);
} }
fn view(&mut self, debug: bool) -> Element<StepMessage> { fn view(&mut self, theme: Theme, debug: bool) -> Element<StepMessage> {
self.steps[self.current].view(debug) self.steps[self.current].view(theme, debug)
} }
fn advance(&mut self) { fn advance(&mut self) {
@ -198,6 +211,7 @@ impl Steps {
enum Step { enum Step {
Welcome, Welcome,
Theming,
Slider { Slider {
state: slider::State, state: slider::State,
value: u8, value: u8,
@ -236,6 +250,7 @@ enum Step {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum StepMessage { pub enum StepMessage {
ThemeSelected(Theme),
SliderChanged(u8), SliderChanged(u8),
LayoutChanged(Layout), LayoutChanged(Layout),
SpacingChanged(u16), SpacingChanged(u16),
@ -251,8 +266,16 @@ pub enum StepMessage {
} }
impl<'a> Step { impl<'a> Step {
fn update(&mut self, msg: StepMessage, debug: &mut bool) { fn update(
&mut self,
msg: StepMessage,
theme: &mut Theme,
debug: &mut bool,
) {
match msg { match msg {
StepMessage::ThemeSelected(new_theme) => {
*theme = new_theme;
}
StepMessage::DebugToggled(value) => { StepMessage::DebugToggled(value) => {
if let Step::Debugger = self { if let Step::Debugger = self {
*debug = value; *debug = value;
@ -319,6 +342,7 @@ impl<'a> Step {
fn title(&self) -> &str { fn title(&self) -> &str {
match self { match self {
Step::Welcome => "Welcome", Step::Welcome => "Welcome",
Step::Theming => "Theming",
Step::Radio { .. } => "Radio button", Step::Radio { .. } => "Radio button",
Step::Toggler { .. } => "Toggler", Step::Toggler { .. } => "Toggler",
Step::Slider { .. } => "Slider", Step::Slider { .. } => "Slider",
@ -335,6 +359,7 @@ impl<'a> Step {
fn can_continue(&self) -> bool { fn can_continue(&self) -> bool {
match self { match self {
Step::Welcome => true, Step::Welcome => true,
Step::Theming => true,
Step::Radio { selection } => *selection == Some(Language::Rust), Step::Radio { selection } => *selection == Some(Language::Rust),
Step::Toggler { can_continue } => *can_continue, Step::Toggler { can_continue } => *can_continue,
Step::Slider { .. } => true, Step::Slider { .. } => true,
@ -348,9 +373,10 @@ impl<'a> Step {
} }
} }
fn view(&mut self, debug: bool) -> Element<StepMessage> { fn view(&mut self, theme: Theme, debug: bool) -> Element<StepMessage> {
match self { match self {
Step::Welcome => Self::welcome(), Step::Welcome => Self::welcome(),
Step::Theming => Self::theme(theme),
Step::Radio { selection } => Self::radio(*selection), Step::Radio { selection } => Self::radio(*selection),
Step::Toggler { can_continue } => Self::toggler(*can_continue), Step::Toggler { can_continue } => Self::toggler(*can_continue),
Step::Slider { state, value } => Self::slider(state, *value), Step::Slider { state, value } => Self::slider(state, *value),
@ -415,6 +441,30 @@ impl<'a> Step {
)) ))
} }
fn theme(theme: Theme) -> Column<'a, StepMessage> {
let light_radio = Radio::new(
Theme::Light,
"Light",
Some(theme),
StepMessage::ThemeSelected,
);
let dark_radio = Radio::new(
Theme::Dark,
"Dark",
Some(theme),
StepMessage::ThemeSelected,
);
Self::container("Theming")
.push(Text::new(
"You can easily change the appearance of an application made \
with Iced by selecting a different theme!",
))
.push(light_radio)
.push(dark_radio)
}
fn slider( fn slider(
state: &'a mut slider::State, state: &'a mut slider::State,
value: u8, value: u8,