use iced::button; use iced::scrollable; use iced::slider; use iced::text_input; use iced::{ Alignment, Button, Checkbox, Column, Container, Element, Length, ProgressBar, Radio, Row, Rule, Sandbox, Scrollable, Settings, Slider, Space, Text, TextInput, Theme, Toggler, }; pub fn main() -> iced::Result { Styling::run(Settings::default()) } #[derive(Default)] struct Styling { theme: Theme, scroll: scrollable::State, input: text_input::State, input_value: String, button: button::State, slider: slider::State, 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), } impl Sandbox for Styling { type Message = Message; fn new() -> Self { Styling::default() } fn title(&self) -> String { String::from("Styling - Iced") } 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, } } fn view(&mut self) -> Element { let choose_theme = [Theme::Light, Theme::Dark].iter().fold( Column::new().spacing(10).push(Text::new("Choose a theme:")), |column, theme| { column.push(Radio::new( *theme, format!("{:?}", theme), Some(self.theme), Message::ThemeChanged, )) }, ); let text_input = TextInput::new( &mut self.input, "Type something...", &self.input_value, Message::InputChanged, ) .padding(10) .size(20); let button = Button::new(&mut self.button, Text::new("Submit")) .padding(10) .on_press(Message::ButtonPressed); let slider = Slider::new( &mut self.slider, 0.0..=100.0, self.slider_value, Message::SliderChanged, ); let progress_bar = ProgressBar::new(0.0..=100.0, self.slider_value); let scrollable = Scrollable::new(&mut self.scroll) .width(Length::Fill) .height(Length::Units(100)) .push(Text::new("Scroll me!")) .push(Space::with_height(Length::Units(800))) .push(Text::new("You did it!")); let checkbox = Checkbox::new( self.checkbox_value, "Check me!", Message::CheckboxToggled, ); let toggler = Toggler::new( self.toggler_value, String::from("Toggle me!"), Message::TogglerToggled, ) .width(Length::Shrink) .spacing(10); let content = Column::new() .spacing(20) .padding(20) .max_width(600) .push(choose_theme) .push(Rule::horizontal(38)) .push(Row::new().spacing(10).push(text_input).push(button)) .push(slider) .push(progress_bar) .push( Row::new() .spacing(10) .height(Length::Units(100)) .align_items(Alignment::Center) .push(scrollable) .push(Rule::vertical(38)) .push( Column::new() .width(Length::Shrink) .spacing(20) .push(checkbox) .push(toggler), ), ); Container::new(content) .width(Length::Fill) .height(Length::Fill) .center_x() .center_y() .into() } fn theme(&self) -> Theme { self.theme } }