Make Theme::Custom fields opaque

This commit is contained in:
Héctor Ramón Jiménez 2022-11-03 03:21:26 +01:00
parent 09a531cd44
commit 9966c6f883
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
2 changed files with 64 additions and 55 deletions

View file

@ -1,17 +1,23 @@
use iced::theme::Palette; use iced::theme::{self, Theme};
use iced::theme::palette::Extended;
use iced::widget::{ use iced::widget::{
button, checkbox, column, container, horizontal_rule, progress_bar, radio, button, checkbox, column, container, horizontal_rule, progress_bar, radio,
row, scrollable, slider, text, text_input, toggler, vertical_rule, row, scrollable, slider, text, text_input, toggler, vertical_rule,
vertical_space, vertical_space,
}; };
use iced::{Alignment, Element, Length, Sandbox, Settings, Theme, Color}; use iced::{Alignment, Color, Element, Length, Sandbox, Settings};
pub fn main() -> iced::Result { pub fn main() -> iced::Result {
Styling::run(Settings::default()) Styling::run(Settings::default())
} }
#[derive(Default)]
struct Styling {
theme: Theme,
input_value: String,
slider_value: f32,
checkbox_value: bool,
toggler_value: bool,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)] #[derive(Debug, PartialEq, Eq, Clone, Copy)]
enum ThemeType { enum ThemeType {
@ -20,16 +26,6 @@ enum ThemeType {
Custom, Custom,
} }
#[derive(Default)]
struct Styling {
custom_theme: Theme,
theme: Theme,
input_value: String,
slider_value: f32,
checkbox_value: bool,
toggler_value: bool,
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
enum Message { enum Message {
ThemeChanged(ThemeType), ThemeChanged(ThemeType),
@ -44,21 +40,7 @@ impl Sandbox for Styling {
type Message = Message; type Message = Message;
fn new() -> Self { fn new() -> Self {
let palette = Palette { Styling::default()
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()
}
} }
fn title(&self) -> String { fn title(&self) -> String {
@ -67,11 +49,19 @@ impl Sandbox for Styling {
fn update(&mut self, message: Message) { fn update(&mut self, message: Message) {
match message { match message {
Message::ThemeChanged(theme) => self.theme = match theme { Message::ThemeChanged(theme) => {
ThemeType::Light => Theme::Light, self.theme = match theme {
ThemeType::Dark => Theme::Dark, ThemeType::Light => Theme::Light,
ThemeType::Custom => self.custom_theme.clone(), 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::InputChanged(value) => self.input_value = value,
Message::ButtonPressed => {} Message::ButtonPressed => {}
Message::SliderChanged(value) => self.slider_value = value, Message::SliderChanged(value) => self.slider_value = value,
@ -81,21 +71,24 @@ impl Sandbox for Styling {
} }
fn view(&self) -> Element<Message> { fn view(&self) -> Element<Message> {
let choose_theme = [ThemeType::Light, ThemeType::Dark, ThemeType::Custom].iter().fold( let choose_theme =
column![text("Choose a theme:")].spacing(10), [ThemeType::Light, ThemeType::Dark, ThemeType::Custom]
|column, theme| { .iter()
column.push(radio( .fold(
format!("{:?}", theme), column![text("Choose a theme:")].spacing(10),
*theme, |column, theme| {
Some(match self.theme { column.push(radio(
Theme::Light => ThemeType::Light, format!("{:?}", theme),
Theme::Dark => ThemeType::Dark, *theme,
Theme::Custom { .. } => ThemeType::Custom, Some(match self.theme {
}), Theme::Light => ThemeType::Light,
Message::ThemeChanged, Theme::Dark => ThemeType::Dark,
)) Theme::Custom { .. } => ThemeType::Custom,
}, }),
); Message::ThemeChanged,
))
},
);
let text_input = text_input( let text_input = text_input(
"Type something...", "Type something...",

View file

@ -25,18 +25,19 @@ use iced_core::{Background, Color};
pub enum Theme { pub enum Theme {
Light, Light,
Dark, Dark,
Custom { Custom(Custom),
palette: Box<Palette>,
extended: Box<Extended>,
}
} }
impl Theme { impl Theme {
pub fn custom(palette: Palette) -> Self {
Self::Custom(Custom::new(palette))
}
pub fn palette(self) -> Palette { pub fn palette(self) -> Palette {
match self { match self {
Self::Light => Palette::LIGHT, Self::Light => Palette::LIGHT,
Self::Dark => Palette::DARK, Self::Dark => Palette::DARK,
Self::Custom { palette, .. } => *palette Self::Custom(custom) => custom.palette,
} }
} }
@ -44,7 +45,7 @@ impl Theme {
match self { match self {
Self::Light => &palette::EXTENDED_LIGHT, Self::Light => &palette::EXTENDED_LIGHT,
Self::Dark => &palette::EXTENDED_DARK, Self::Dark => &palette::EXTENDED_DARK,
Self::Custom { extended, .. } => extended, Self::Custom(custom) => &custom.extended,
} }
} }
} }
@ -55,6 +56,21 @@ impl Default for Theme {
} }
} }
#[derive(Debug, Clone, PartialEq)]
pub struct Custom {
palette: Palette,
extended: Extended,
}
impl Custom {
pub fn new(palette: Palette) -> Self {
Self {
palette,
extended: Extended::generate(palette),
}
}
}
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
pub enum Application { pub enum Application {
Default, Default,