Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add custom palette to built in theme #1432

Merged
merged 11 commits into from
Nov 3, 2022
23 changes: 15 additions & 8 deletions examples/scrollable/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,15 @@ struct ScrollableDemo {
variants: Vec<Variant>,
}

#[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),
Expand Down Expand Up @@ -45,7 +51,10 @@ impl Application for ScrollableDemo {
fn update(&mut self, message: Message) -> Command<Message> {
match message {
Message::ThemeChanged(theme) => {
self.theme = theme;
self.theme = match theme {
ThemeType::Light => Theme::Light,
ThemeType::Dark => Theme::Dark,
};

Command::none()
}
Expand Down Expand Up @@ -78,17 +87,15 @@ impl Application for ScrollableDemo {
}

fn view(&self) -> Element<Message> {
let ScrollableDemo {
theme, variants, ..
} = self;
let ScrollableDemo { 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,
))
},
Expand Down Expand Up @@ -198,7 +205,7 @@ impl Application for ScrollableDemo {
}

fn theme(&self) -> Theme {
self.theme
self.theme.clone()
}
}

Expand Down
57 changes: 42 additions & 15 deletions examples/styling/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
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};
use iced::{Alignment, Color, Element, Length, Sandbox, Settings};

pub fn main() -> iced::Result {
Styling::run(Settings::default())
Expand All @@ -18,9 +19,16 @@ struct Styling {
toggler_value: bool,
}

#[derive(Debug, PartialEq, Eq, Clone, Copy)]
enum ThemeType {
Light,
Dark,
Custom,
}

#[derive(Debug, Clone)]
enum Message {
ThemeChanged(Theme),
ThemeChanged(ThemeType),
InputChanged(String),
ButtonPressed,
SliderChanged(f32),
Expand All @@ -41,7 +49,19 @@ 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 => 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,
Expand All @@ -51,17 +71,24 @@ impl Sandbox for Styling {
}

fn view(&self) -> Element<Message> {
let choose_theme = [Theme::Light, Theme::Dark].iter().fold(
column![text("Choose a theme:")].spacing(10),
|column, theme| {
column.push(radio(
format!("{:?}", theme),
*theme,
Some(self.theme),
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...",
Expand Down Expand Up @@ -132,6 +159,6 @@ impl Sandbox for Styling {
}

fn theme(&self) -> Theme {
self.theme
self.theme.clone()
}
}
29 changes: 26 additions & 3 deletions style/src/theme.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
pub mod palette;

use self::palette::Extended;
pub use self::palette::Palette;

use crate::application;
Expand All @@ -20,24 +21,31 @@ use crate::toggler;

use iced_core::{Background, Color};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[derive(Debug, Clone, PartialEq)]
pub enum Theme {
Light,
Dark,
Custom(Box<Custom>),
}

impl Theme {
pub fn palette(self) -> Palette {
pub fn custom(palette: Palette) -> Self {
Self::Custom(Box::new(Custom::new(palette)))
}

pub fn palette(&self) -> Palette {
match self {
Self::Light => Palette::LIGHT,
Self::Dark => Palette::DARK,
Self::Custom(custom) => custom.palette,
}
}

pub fn extended_palette(&self) -> &palette::Extended {
match self {
Self::Light => &palette::EXTENDED_LIGHT,
Self::Dark => &palette::EXTENDED_DARK,
Self::Custom(custom) => &custom.extended,
}
}
}
Expand All @@ -48,6 +56,21 @@ impl Default for Theme {
}
}

#[derive(Debug, Clone, Copy, 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)]
pub enum Application {
Default,
Expand All @@ -71,7 +94,7 @@ impl application::StyleSheet for Theme {
background_color: palette.background.base.color,
text_color: palette.background.base.text,
},
Application::Custom(f) => f(*self),
Application::Custom(f) => f(self.clone()),
}
}
}
Expand Down
8 changes: 7 additions & 1 deletion style/src/theme/palette.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ impl Palette {
};
}

#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Extended {
pub background: Background,
pub primary: Primary,
Expand Down Expand Up @@ -95,7 +96,7 @@ impl Extended {
}
}

#[derive(Debug, Clone, Copy)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Pair {
pub color: Color,
pub text: Color,
Expand All @@ -110,6 +111,7 @@ impl Pair {
}
}

#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Background {
pub base: Pair,
pub weak: Pair,
Expand All @@ -129,6 +131,7 @@ impl Background {
}
}

#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Primary {
pub base: Pair,
pub weak: Pair,
Expand All @@ -148,6 +151,7 @@ impl Primary {
}
}

#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Secondary {
pub base: Pair,
pub weak: Pair,
Expand All @@ -168,6 +172,7 @@ impl Secondary {
}
}

#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Success {
pub base: Pair,
pub weak: Pair,
Expand All @@ -187,6 +192,7 @@ impl Success {
}
}

#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Danger {
pub base: Pair,
pub weak: Pair,
Expand Down