From e2166ecad020662d246b364637efc4e6ee3bc1db Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Wed, 7 Sep 2022 11:56:11 -0400 Subject: wip: Custom palette for built in theme --- examples/styling/Cargo.toml | 1 + examples/styling/src/main.rs | 24 +++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) (limited to 'examples') diff --git a/examples/styling/Cargo.toml b/examples/styling/Cargo.toml index f771708c..344cd0d6 100644 --- a/examples/styling/Cargo.toml +++ b/examples/styling/Cargo.toml @@ -7,3 +7,4 @@ publish = false [dependencies] iced = { path = "../.." } +once_cell = "1.14.0" \ No newline at end of file diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index cda53e87..36ab0c0c 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -1,14 +1,28 @@ +use iced::theme::Palette; +use iced::theme::palette::Extended; use iced::widget::{ button, checkbox, column, container, horizontal_rule, progress_bar, radio, row, scrollable, slider, text, text_input, toggler, vertical_rule, vertical_space, }; -use iced::{Alignment, Element, Length, Sandbox, Settings, Theme}; +use iced::{Alignment, Element, Length, Sandbox, Settings, Theme, Color}; +use once_cell::sync::OnceCell; pub fn main() -> iced::Result { + let palette = Palette { + background: Color::from_rgb(1.0, 0.9, 1.0), + text: Color::BLACK, + primary: Color::from_rgb(0.5, 0.5, 0.0), + success: Color::from_rgb(0.0, 1.0, 0.0), + danger: Color::from_rgb(1.0, 0.0, 0.0), + }; + let extended = Extended::generate(palette); + CUSTOM_THEME.set(Theme::Custom { palette, extended }).unwrap(); Styling::run(Settings::default()) } +static CUSTOM_THEME: OnceCell = OnceCell::new(); + #[derive(Default)] struct Styling { theme: Theme, @@ -51,11 +65,15 @@ impl Sandbox for Styling { } fn view(&self) -> Element { - let choose_theme = [Theme::Light, Theme::Dark].iter().fold( + let choose_theme = [Theme::Light, Theme::Dark, *CUSTOM_THEME.get().unwrap()].iter().fold( column![text("Choose a theme:")].spacing(10), |column, theme| { column.push(radio( - format!("{:?}", theme), + match theme { + Theme::Light => "Light", + Theme::Dark => "Dark", + Theme::Custom { .. } => "Custom", + }, *theme, Some(self.theme), Message::ThemeChanged, -- cgit From bc26dff2ca1d3bcc431d489c5958df5e864f1863 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Wed, 7 Sep 2022 12:04:56 -0400 Subject: refactor: undo changes to radio --- examples/styling/src/main.rs | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'examples') diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index 36ab0c0c..69827130 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -23,6 +23,13 @@ pub fn main() -> iced::Result { static CUSTOM_THEME: OnceCell = OnceCell::new(); +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +enum ThemeType { + Light, + Dark, + Custom, +} + #[derive(Default)] struct Styling { theme: Theme, @@ -34,7 +41,7 @@ struct Styling { #[derive(Debug, Clone)] enum Message { - ThemeChanged(Theme), + ThemeChanged(ThemeType), InputChanged(String), ButtonPressed, SliderChanged(f32), @@ -55,7 +62,11 @@ impl Sandbox for Styling { fn update(&mut self, message: Message) { match message { - Message::ThemeChanged(theme) => self.theme = theme, + Message::ThemeChanged(theme) => self.theme = match theme { + ThemeType::Light => Theme::Light, + ThemeType::Dark => Theme::Dark, + ThemeType::Custom => *CUSTOM_THEME.get().unwrap(), + }, Message::InputChanged(value) => self.input_value = value, Message::ButtonPressed => {} Message::SliderChanged(value) => self.slider_value = value, @@ -65,17 +76,17 @@ impl Sandbox for Styling { } fn view(&self) -> Element { - let choose_theme = [Theme::Light, Theme::Dark, *CUSTOM_THEME.get().unwrap()].iter().fold( + let choose_theme = [ThemeType::Light, ThemeType::Dark, ThemeType::Custom].iter().fold( column![text("Choose a theme:")].spacing(10), |column, theme| { column.push(radio( - match theme { - Theme::Light => "Light", - Theme::Dark => "Dark", - Theme::Custom { .. } => "Custom", - }, + format!("{:?}", theme), *theme, - Some(self.theme), + Some(match self.theme { + Theme::Light => ThemeType::Light, + Theme::Dark => ThemeType::Dark, + Theme::Custom { .. } => ThemeType::Custom, + }), Message::ThemeChanged, )) }, -- cgit From 269d6f9a3f47861ff6fe67d65baf226192a3c22f Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 8 Sep 2022 17:36:59 -0400 Subject: fix: scrollable example --- examples/scrollable/src/main.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'examples') diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index b7b3dedc..f0cd60f4 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -14,9 +14,15 @@ struct ScrollableDemo { variants: Vec, } +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +enum ThemeType { + Light, + Dark, +} + #[derive(Debug, Clone)] enum Message { - ThemeChanged(Theme), + ThemeChanged(ThemeType), ScrollToTop(usize), ScrollToBottom(usize), Scrolled(usize, f32), @@ -45,7 +51,10 @@ impl Application for ScrollableDemo { fn update(&mut self, message: Message) -> Command { match message { Message::ThemeChanged(theme) => { - self.theme = theme; + self.theme = match theme { + ThemeType::Light => Theme::Light, + ThemeType::Dark => Theme::Dark, + }; Command::none() } @@ -79,16 +88,16 @@ impl Application for ScrollableDemo { fn view(&self) -> Element { let ScrollableDemo { - theme, variants, .. + variants, .. } = self; - let choose_theme = [Theme::Light, Theme::Dark].iter().fold( + let choose_theme = [ThemeType::Light, ThemeType::Dark].iter().fold( column!["Choose a theme:"].spacing(10), |column, option| { column.push(radio( format!("{:?}", option), *option, - Some(*theme), + Some(*option), Message::ThemeChanged, )) }, -- cgit From d5a933b047a955158a31a35266bbc9b25307b0fc Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 8 Sep 2022 17:39:59 -0400 Subject: refactor: remove once_cell from styling example --- examples/styling/Cargo.toml | 1 - examples/styling/src/main.rs | 28 +++++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) (limited to 'examples') diff --git a/examples/styling/Cargo.toml b/examples/styling/Cargo.toml index 344cd0d6..f771708c 100644 --- a/examples/styling/Cargo.toml +++ b/examples/styling/Cargo.toml @@ -7,4 +7,3 @@ publish = false [dependencies] iced = { path = "../.." } -once_cell = "1.14.0" \ No newline at end of file diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index 69827130..625a2b9a 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -6,22 +6,12 @@ use iced::widget::{ vertical_space, }; use iced::{Alignment, Element, Length, Sandbox, Settings, Theme, Color}; -use once_cell::sync::OnceCell; pub fn main() -> iced::Result { - let palette = Palette { - background: Color::from_rgb(1.0, 0.9, 1.0), - text: Color::BLACK, - primary: Color::from_rgb(0.5, 0.5, 0.0), - success: Color::from_rgb(0.0, 1.0, 0.0), - danger: Color::from_rgb(1.0, 0.0, 0.0), - }; - let extended = Extended::generate(palette); - CUSTOM_THEME.set(Theme::Custom { palette, extended }).unwrap(); + Styling::run(Settings::default()) } -static CUSTOM_THEME: OnceCell = OnceCell::new(); #[derive(Debug, PartialEq, Eq, Clone, Copy)] enum ThemeType { @@ -32,6 +22,7 @@ enum ThemeType { #[derive(Default)] struct Styling { + custom_theme: Theme, theme: Theme, input_value: String, slider_value: f32, @@ -53,7 +44,18 @@ impl Sandbox for Styling { type Message = Message; fn new() -> Self { - Styling::default() + let palette = Palette { + background: Color::from_rgb(1.0, 0.9, 1.0), + text: Color::BLACK, + primary: Color::from_rgb(0.5, 0.5, 0.0), + success: Color::from_rgb(0.0, 1.0, 0.0), + danger: Color::from_rgb(1.0, 0.0, 0.0), + }; + let extended = Extended::generate(palette); + Styling { + custom_theme: Theme::Custom { palette, extended }, + ..Default::default() + } } fn title(&self) -> String { @@ -65,7 +67,7 @@ impl Sandbox for Styling { Message::ThemeChanged(theme) => self.theme = match theme { ThemeType::Light => Theme::Light, ThemeType::Dark => Theme::Dark, - ThemeType::Custom => *CUSTOM_THEME.get().unwrap(), + ThemeType::Custom => self.custom_theme, }, Message::InputChanged(value) => self.input_value = value, Message::ButtonPressed => {} -- cgit From 4f3215f48e72ed36cb77efcb746db1f6adabf84f Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Sat, 10 Sep 2022 22:15:25 -0400 Subject: fix: clippy lint https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant --- examples/scrollable/src/main.rs | 2 +- examples/styling/src/main.rs | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) (limited to 'examples') diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index f0cd60f4..d5cf19cc 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -207,7 +207,7 @@ impl Application for ScrollableDemo { } fn theme(&self) -> Theme { - self.theme + self.theme.clone() } } diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index 625a2b9a..784ea581 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -53,7 +53,10 @@ impl Sandbox for Styling { }; let extended = Extended::generate(palette); Styling { - custom_theme: Theme::Custom { palette, extended }, + custom_theme: Theme::Custom { + palette: Box::new(palette), + extended: Box::new(extended) + }, ..Default::default() } } @@ -67,7 +70,7 @@ impl Sandbox for Styling { Message::ThemeChanged(theme) => self.theme = match theme { ThemeType::Light => Theme::Light, ThemeType::Dark => Theme::Dark, - ThemeType::Custom => self.custom_theme, + ThemeType::Custom => self.custom_theme.clone(), }, Message::InputChanged(value) => self.input_value = value, Message::ButtonPressed => {} @@ -163,6 +166,6 @@ impl Sandbox for Styling { } fn theme(&self) -> Theme { - self.theme + self.theme.clone() } } -- cgit From 09a531cd4427ff5dc972621094f33de0f94a0919 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Sat, 10 Sep 2022 23:18:57 -0400 Subject: fix: arc example --- examples/arc/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples') diff --git a/examples/arc/src/main.rs b/examples/arc/src/main.rs index 0c619dc9..69712240 100644 --- a/examples/arc/src/main.rs +++ b/examples/arc/src/main.rs @@ -80,7 +80,7 @@ impl canvas::Program for Arc { _cursor: Cursor, ) -> Vec { let geometry = self.cache.draw(bounds.size(), |frame| { - let palette = theme.palette(); + let palette = theme.clone().palette(); let center = frame.center(); let radius = frame.width().min(frame.height()) / 5.0; -- cgit From 9966c6f8834220e62fd66766d2e11d8a36e334e2 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 03:21:26 +0100 Subject: Make `Theme::Custom` fields opaque --- examples/styling/src/main.rs | 89 ++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 48 deletions(-) (limited to 'examples') diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index 784ea581..e16860ad 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -1,28 +1,17 @@ -use iced::theme::Palette; -use iced::theme::palette::Extended; +use iced::theme::{self, Theme}; use iced::widget::{ button, checkbox, column, container, horizontal_rule, progress_bar, radio, row, scrollable, slider, text, text_input, toggler, vertical_rule, vertical_space, }; -use iced::{Alignment, Element, Length, Sandbox, Settings, Theme, Color}; +use iced::{Alignment, Color, Element, Length, Sandbox, Settings}; pub fn main() -> iced::Result { - Styling::run(Settings::default()) } - -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -enum ThemeType { - Light, - Dark, - Custom, -} - #[derive(Default)] struct Styling { - custom_theme: Theme, theme: Theme, input_value: String, slider_value: f32, @@ -30,6 +19,13 @@ struct Styling { toggler_value: bool, } +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +enum ThemeType { + Light, + Dark, + Custom, +} + #[derive(Debug, Clone)] enum Message { ThemeChanged(ThemeType), @@ -44,21 +40,7 @@ impl Sandbox for Styling { type Message = Message; fn new() -> Self { - let palette = Palette { - background: Color::from_rgb(1.0, 0.9, 1.0), - text: Color::BLACK, - primary: Color::from_rgb(0.5, 0.5, 0.0), - success: Color::from_rgb(0.0, 1.0, 0.0), - danger: Color::from_rgb(1.0, 0.0, 0.0), - }; - let extended = Extended::generate(palette); - Styling { - custom_theme: Theme::Custom { - palette: Box::new(palette), - extended: Box::new(extended) - }, - ..Default::default() - } + Styling::default() } fn title(&self) -> String { @@ -67,11 +49,19 @@ impl Sandbox for Styling { fn update(&mut self, message: Message) { match message { - Message::ThemeChanged(theme) => self.theme = match theme { - ThemeType::Light => Theme::Light, - ThemeType::Dark => Theme::Dark, - ThemeType::Custom => self.custom_theme.clone(), - }, + Message::ThemeChanged(theme) => { + self.theme = match theme { + ThemeType::Light => Theme::Light, + ThemeType::Dark => Theme::Dark, + ThemeType::Custom => Theme::custom(theme::Palette { + background: Color::from_rgb(1.0, 0.9, 1.0), + text: Color::BLACK, + primary: Color::from_rgb(0.5, 0.5, 0.0), + success: Color::from_rgb(0.0, 1.0, 0.0), + danger: Color::from_rgb(1.0, 0.0, 0.0), + }), + } + } Message::InputChanged(value) => self.input_value = value, Message::ButtonPressed => {} Message::SliderChanged(value) => self.slider_value = value, @@ -81,21 +71,24 @@ impl Sandbox for Styling { } fn view(&self) -> Element { - let choose_theme = [ThemeType::Light, ThemeType::Dark, ThemeType::Custom].iter().fold( - column![text("Choose a theme:")].spacing(10), - |column, theme| { - column.push(radio( - format!("{:?}", theme), - *theme, - Some(match self.theme { - Theme::Light => ThemeType::Light, - Theme::Dark => ThemeType::Dark, - Theme::Custom { .. } => ThemeType::Custom, - }), - Message::ThemeChanged, - )) - }, - ); + let choose_theme = + [ThemeType::Light, ThemeType::Dark, ThemeType::Custom] + .iter() + .fold( + column![text("Choose a theme:")].spacing(10), + |column, theme| { + column.push(radio( + format!("{:?}", theme), + *theme, + Some(match self.theme { + Theme::Light => ThemeType::Light, + Theme::Dark => ThemeType::Dark, + Theme::Custom { .. } => ThemeType::Custom, + }), + Message::ThemeChanged, + )) + }, + ); let text_input = text_input( "Type something...", -- cgit From 708be32e3da9700afb61ab2f8a6da45b0e2df8ef Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 03:22:55 +0100 Subject: Derive `Copy` for `Theme` --- examples/arc/src/main.rs | 2 +- examples/styling/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/arc/src/main.rs b/examples/arc/src/main.rs index 69712240..0c619dc9 100644 --- a/examples/arc/src/main.rs +++ b/examples/arc/src/main.rs @@ -80,7 +80,7 @@ impl canvas::Program for Arc { _cursor: Cursor, ) -> Vec { let geometry = self.cache.draw(bounds.size(), |frame| { - let palette = theme.clone().palette(); + let palette = theme.palette(); let center = frame.center(); let radius = frame.width().min(frame.height()) / 5.0; diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index e16860ad..6bcfa5f1 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -159,6 +159,6 @@ impl Sandbox for Styling { } fn theme(&self) -> Theme { - self.theme.clone() + self.theme } } -- cgit From 3517dece26e33a627cee8957e4ac3d60be3cfb76 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 03:25:27 +0100 Subject: Run `cargo fmt` --- examples/scrollable/src/main.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'examples') diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index d5cf19cc..6eba34e2 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -87,9 +87,7 @@ impl Application for ScrollableDemo { } fn view(&self) -> Element { - let ScrollableDemo { - variants, .. - } = self; + let ScrollableDemo { variants, .. } = self; let choose_theme = [ThemeType::Light, ThemeType::Dark].iter().fold( column!["Choose a theme:"].spacing(10), -- cgit From f04336dd5cf5e15bbcf48cd54b7e97c569c07a92 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 03:26:10 +0100 Subject: Remove unnecessary `clone` in `scrollable` example --- examples/scrollable/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples') diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index 6eba34e2..7e1716cf 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -205,7 +205,7 @@ impl Application for ScrollableDemo { } fn theme(&self) -> Theme { - self.theme.clone() + self.theme } } -- cgit From df7877767567cc0c7f48d2d6da4680a55f0f7b6d Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 03:27:55 +0100 Subject: Box `Custom` in `Theme` --- examples/scrollable/src/main.rs | 2 +- examples/styling/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index 7e1716cf..6eba34e2 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -205,7 +205,7 @@ impl Application for ScrollableDemo { } fn theme(&self) -> Theme { - self.theme + self.theme.clone() } } diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index 6bcfa5f1..e16860ad 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -159,6 +159,6 @@ impl Sandbox for Styling { } fn theme(&self) -> Theme { - self.theme + self.theme.clone() } } -- cgit