From 63cd0fd8eb1eebae8de7d5141c846fc4ea55d702 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 30 Oct 2019 03:31:07 +0100 Subject: Draft `TextInput` widget structure Also started a `todos` example to showcase it! --- examples/todos.rs | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 examples/todos.rs (limited to 'examples/todos.rs') diff --git a/examples/todos.rs b/examples/todos.rs new file mode 100644 index 00000000..6a5d5e85 --- /dev/null +++ b/examples/todos.rs @@ -0,0 +1,69 @@ +use iced::{ + text::HorizontalAlignment, text_input, Align, Application, Color, Column, + Element, Justify, Length, Text, TextInput, +}; + +pub fn main() { + Todos::default().run() +} + +#[derive(Default)] +struct Todos { + input: text_input::State, + input_value: String, +} + +#[derive(Debug, Clone)] +pub enum Message { + InputChanged(String), + CreateTask, +} + +impl Application for Todos { + type Message = Message; + + fn update(&mut self, message: Message) { + match message { + Message::InputChanged(value) => { + self.input_value = value; + } + Message::CreateTask => {} + } + } + + fn view(&mut self) -> Element { + let title = Text::new("todos") + .size(100) + .color(GRAY) + .horizontal_alignment(HorizontalAlignment::Center); + + let input = TextInput::new( + &mut self.input, + "What needs to be done?", + &self.input_value, + Message::InputChanged, + ) + .padding(15) + .size(30) + .on_submit(Message::CreateTask); + + 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) + .into() + } +} + +// Colors +const GRAY: Color = Color { + r: 0.5, + g: 0.5, + b: 0.5, + a: 1.0, +}; -- cgit From 1505d8f9413c3b0371b9735c3e2a465c1ec0ae92 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Wed, 30 Oct 2019 05:00:59 +0100 Subject: Implement task addition in `todos` example --- examples/todos.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 8 deletions(-) (limited to 'examples/todos.rs') 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, +} + +#[derive(Debug)] +struct Task { + description: String, + completed: bool, +} + +impl Task { + fn new(description: String) -> Self { + Task { + description, + completed: false, + } + } + + fn view(&mut self) -> Element { + 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 { @@ -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() } } -- cgit From 51a0e99097f9ecb63eeb7f2ea7c38089977eb4d0 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 31 Oct 2019 03:50:40 +0100 Subject: Implement cursor movement in `TextInput` --- examples/todos.rs | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'examples/todos.rs') diff --git a/examples/todos.rs b/examples/todos.rs index 6189c8db..9581262a 100644 --- a/examples/todos.rs +++ b/examples/todos.rs @@ -15,26 +15,6 @@ struct Todos { tasks: Vec, } -#[derive(Debug)] -struct Task { - description: String, - completed: bool, -} - -impl Task { - fn new(description: String) -> Self { - Task { - description, - completed: false, - } - } - - fn view(&mut self) -> Element { - Checkbox::new(self.completed, &self.description, |checked| checked) - .into() - } -} - #[derive(Debug, Clone)] pub enum Message { InputChanged(String), @@ -107,6 +87,26 @@ impl Application for Todos { } } +#[derive(Debug)] +struct Task { + description: String, + completed: bool, +} + +impl Task { + fn new(description: String) -> Self { + Task { + description, + completed: false, + } + } + + fn view(&mut self) -> Element { + Checkbox::new(self.completed, &self.description, |checked| checked) + .into() + } +} + // Colors const GRAY: Color = Color { r: 0.5, -- cgit