use iced::keyboard; use iced::widget::{ button, center, checkbox, column, horizontal_rule, pick_list, progress_bar, row, scrollable, slider, text, text_input, toggler, vertical_rule, vertical_space, }; use iced::{Center, Element, Fill, Subscription, Theme}; pub fn main() -> iced::Result { iced::application("Styling - Iced", Styling::update, Styling::view) .subscription(Styling::subscription) .theme(Styling::theme) .run() } #[derive(Default)] struct Styling { theme: Theme, input_value: String, slider_value: f32, checkbox_value: bool, toggler_value: bool, } #[derive(Debug, Clone)] enum Message { ThemeChanged(Theme), InputChanged(String), ButtonPressed, SliderChanged(f32), CheckboxToggled(bool), TogglerToggled(bool), PreviousTheme, NextTheme, } impl Styling { fn update(&mut self, message: Message) { match message { Message::ThemeChanged(theme) => { self.theme = theme; } Message::InputChanged(value) => self.input_value = value, Message::ButtonPressed => {} Message::SliderChanged(value) => self.slider_value = value, Message::CheckboxToggled(value) => self.checkbox_value = value, Message::TogglerToggled(value) => self.toggler_value = value, Message::PreviousTheme | Message::NextTheme => { if let Some(current) = Theme::ALL .iter() .position(|candidate| &self.theme == candidate) { self.theme = if matches!(message, Message::NextTheme) { Theme::ALL[(current + 1) % Theme::ALL.len()].clone() } else if current == 0 { Theme::ALL .last() .expect("Theme::ALL must not be empty") .clone() } else { Theme::ALL[current - 1].clone() }; } } } } fn view(&self) -> Element { let choose_theme = column![ text("Theme:"), pick_list(Theme::ALL, Some(&self.theme), Message::ThemeChanged) .width(Fill), ] .spacing(10); let text_input = text_input("Type something...", &self.input_value) .on_input(Message::InputChanged) .padding(10) .size(20); let styled_button = |label| { button(text(label).width(Fill).center()) .padding(10) .on_press(Message::ButtonPressed) }; let primary = styled_button("Primary"); let success = styled_button("Success").style(button::success); let warning = styled_button("Warning").style(button::warning); let danger = styled_button("Danger").style(button::danger); let slider = slider(0.0..=100.0, self.slider_value, Message::SliderChanged); let progress_bar = progress_bar(0.0..=100.0, self.slider_value); let scrollable = scrollable(column![ "Scroll me!", vertical_space().height(800), "You did it!" ]) .width(Fill) .height(100); let checkbox = checkbox("Check me!", self.checkbox_value) .on_toggle(Message::CheckboxToggled); let toggler = toggler(self.toggler_value) .label("Toggle me!") .on_toggle(Message::TogglerToggled) .spacing(10); let content = column![ choose_theme, horizontal_rule(38), text_input, row![primary, success, warning, danger] .spacing(10) .align_y(Center), slider, progress_bar, row![ scrollable, vertical_rule(38), column![checkbox, toggler].spacing(20) ] .spacing(10) .height(100) .align_y(Center), ] .spacing(20) .padding(20) .max_width(600); center(content).into() } fn subscription(&self) -> Subscription { keyboard::on_key_press(|key, _modifiers| match key { keyboard::Key::Named( keyboard::key::Named::ArrowUp | keyboard::key::Named::ArrowLeft, ) => Some(Message::PreviousTheme), keyboard::Key::Named( keyboard::key::Named::ArrowDown | keyboard::key::Named::ArrowRight, ) => Some(Message::NextTheme), _ => None, }) } fn theme(&self) -> Theme { self.theme.clone() } }