diff options
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/todos.rs | 63 | 
1 files changed, 55 insertions, 8 deletions
| diff --git a/examples/todos.rs b/examples/todos.rs index 6a5d5e85..6189c8db 100644 --- a/examples/todos.rs +++ b/examples/todos.rs @@ -1,22 +1,45 @@  use iced::{ -    text::HorizontalAlignment, text_input, Align, Application, Color, Column, -    Element, Justify, Length, Text, TextInput, +    scrollable, text::HorizontalAlignment, text_input, Align, Application, +    Checkbox, Color, Column, Element, Length, Scrollable, Text, TextInput,  };  pub fn main() {      Todos::default().run()  } -#[derive(Default)] +#[derive(Debug, Default)]  struct Todos { +    scroll: scrollable::State,      input: text_input::State,      input_value: String, +    tasks: Vec<Task>, +} + +#[derive(Debug)] +struct Task { +    description: String, +    completed: bool, +} + +impl Task { +    fn new(description: String) -> Self { +        Task { +            description, +            completed: false, +        } +    } + +    fn view(&mut self) -> Element<bool> { +        Checkbox::new(self.completed, &self.description, |checked| checked) +            .into() +    }  }  #[derive(Debug, Clone)]  pub enum Message {      InputChanged(String),      CreateTask, +    TaskChanged(usize, bool),  }  impl Application for Todos { @@ -27,8 +50,20 @@ impl Application for Todos {              Message::InputChanged(value) => {                  self.input_value = value;              } -            Message::CreateTask => {} +            Message::CreateTask => { +                if !self.input_value.is_empty() { +                    self.tasks.push(Task::new(self.input_value.clone())); +                    self.input_value = String::new(); +                } +            } +            Message::TaskChanged(i, completed) => { +                if let Some(task) = self.tasks.get_mut(i) { +                    task.completed = completed; +                } +            }          } + +        dbg!(self);      }      fn view(&mut self) -> Element<Message> { @@ -47,15 +82,27 @@ impl Application for Todos {          .size(30)          .on_submit(Message::CreateTask); -        Column::new() +        let tasks = self.tasks.iter_mut().enumerate().fold( +            Column::new().spacing(20), +            |column, (i, task)| { +                column.push( +                    task.view() +                        .map(move |state| Message::TaskChanged(i, state)), +                ) +            }, +        ); + +        let content = Column::new()              .max_width(Length::Units(800)) -            .height(Length::Fill)              .align_self(Align::Center) -            .justify_content(Justify::Center)              .spacing(20) -            .padding(20)              .push(title)              .push(input) +            .push(tasks); + +        Scrollable::new(&mut self.scroll) +            .padding(40) +            .push(content)              .into()      }  } | 
