From be4fc3566d9bf5f778a29ffd2d4316ba1d3b0725 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Tue, 6 Jun 2023 11:17:13 +0700 Subject: [PATCH] Buttons to create or cancel the task entry --- src/app.rs | 10 ++++---- src/input.rs | 26 ++++++++++++++------ src/ui.rs | 68 ++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 78 insertions(+), 26 deletions(-) diff --git a/src/app.rs b/src/app.rs index bdc1435..4435889 100644 --- a/src/app.rs +++ b/src/app.rs @@ -60,7 +60,8 @@ impl Default for Project { pub enum NewTaskFocus { Title, Description, - Buttons + CreateBtn, + CancelBtn } pub struct NewTask<'a> { @@ -148,9 +149,10 @@ impl Project { Self::load_from_json(&json) } - // pub fn add_task(&mut self, status: Column, task: Task) { - // self.tasks_per_column.entry(status).or_default().push(task); - // } + pub fn add_task(&mut self, title: String, description: String) { + let task = Task { title, description }; + self.columns[self.selected_column_idx].tasks.push(task); + } pub fn save(&self) { let json = serde_json::to_string_pretty(&self).unwrap(); diff --git a/src/input.rs b/src/input.rs index f67db6f..e475e1c 100644 --- a/src/input.rs +++ b/src/input.rs @@ -17,25 +17,37 @@ pub fn handle_input(state: &mut AppState) -> Result<(), std::io::Error> { NewTaskFocus::Title => { match key.code { KeyCode::Tab => task.focus = NewTaskFocus::Description, - KeyCode::BackTab => task.focus = NewTaskFocus::Buttons, + KeyCode::BackTab => task.focus = NewTaskFocus::CancelBtn, + KeyCode::Enter => (), _ => { task.title.input(key); } } } NewTaskFocus::Description => { match key.code { - KeyCode::Tab => task.focus = NewTaskFocus::Buttons, + KeyCode::Tab => task.focus = NewTaskFocus::CreateBtn, KeyCode::BackTab => task.focus = NewTaskFocus::Title, _ => { task.description.input(key); } } } - - NewTaskFocus::Buttons => { + NewTaskFocus::CreateBtn => { match key.code { - KeyCode::Tab => task.focus = NewTaskFocus::Title, + KeyCode::Tab => task.focus = NewTaskFocus::CancelBtn, KeyCode::BackTab => task.focus = NewTaskFocus::Description, KeyCode::Enter => { - // TODO: Need a function that clears state and adds a new TODO - // into the right column + let title = task.title.clone().into_lines().join("\n"); + let description = task.description.clone().into_lines().clone().join("\n"); + project.add_task(title, description); + + state.new_task_state = None + } + _ => (), + } + } + NewTaskFocus::CancelBtn => { + match key.code { + KeyCode::Tab => task.focus = NewTaskFocus::Title, + KeyCode::BackTab => task.focus = NewTaskFocus::CreateBtn, + KeyCode::Enter => { state.new_task_state = None } _ => (), diff --git a/src/ui.rs b/src/ui.rs index f473842..409ec7c 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -107,23 +107,60 @@ pub fn draw_new_task_popup(f: &mut Frame, state: &mut AppState) { [ Constraint::Length(3), Constraint::Max(100), + Constraint::Length(3), Constraint::Length(2), ] .as_ref(), ) .split(block_inner); + + let buttons = Layout::default() + .direction(Direction::Horizontal) + .constraints( + [ + Constraint::Percentage(80), + Constraint::Min(10), + Constraint::Min(10) + ] + .as_ref(), + ) + .split(layout[2]); + + let create_style; + let create_txt; + let cancel_style; + let cancel_txt; + match task.focus { + NewTaskFocus::CreateBtn => { + create_style = Style::default().fg(Color::Yellow); + cancel_style = Style::default(); + create_txt = "[Create]"; + cancel_txt = " Cancel "; + } + NewTaskFocus::CancelBtn => { + create_style = Style::default(); + cancel_style = Style::default().fg(Color::Yellow); + create_txt = " Create "; + cancel_txt = "[Cancel]"; + } + _ => { + create_style = Style::default(); + cancel_style = Style::default(); + create_txt = " Create "; + cancel_txt = " Cancel "; + } + } + let create_btn = Paragraph::new(create_txt).style(create_style); + let cancel_btn = Paragraph::new(cancel_txt).style(cancel_style); + f.render_widget(create_btn, buttons[1]); + f.render_widget(cancel_btn, buttons[2]); + let b1 = Block::default().title("Title").borders(Borders::ALL); - // let title = Paragraph::new("Hello I am text") - // .style(Style::default().fg(Color::Yellow)) - // .block(b1); let b2 = Block::default().title("Description").borders(Borders::ALL); - // let description = Paragraph::new("Fill this out") - // .style(Style::default().fg(Color::Yellow)) - // .block(b2); let b3 = Block::default().title("Keys").borders(Borders::TOP); - let footer = Paragraph::new("p : Cancel").block(b3); - // f.render_widget(main, area); - // f.render_widget(title, layout[0]); + task.title.set_cursor_line_style(Style::default()); + task.description.set_cursor_line_style(Style::default()); + task.title.set_block(b1); if let NewTaskFocus::Title = task.focus { task.title.set_style(Style::default().fg(Color::Yellow)); @@ -133,7 +170,7 @@ pub fn draw_new_task_popup(f: &mut Frame, state: &mut AppState) { task.title.set_cursor_style(Style::default()); } f.render_widget(task.title.widget(), layout[0]); - // f.render_widget(description, layout[1]); + task.description.set_block(b2); if let NewTaskFocus::Description = task.focus { task.description.set_style(Style::default().fg(Color::Yellow)); @@ -143,7 +180,9 @@ pub fn draw_new_task_popup(f: &mut Frame, state: &mut AppState) { task.description.set_cursor_style(Style::default()); } f.render_widget(task.description.widget(), layout[1]); - f.render_widget(footer, layout[2]); + + let footer = Paragraph::new("Tab/Backtab : Cycle").block(b3); + f.render_widget(footer, layout[3]); } } } @@ -171,10 +210,9 @@ pub fn draw(f: &mut Frame, state: &mut AppState) { let block = Block::default().title("KEYBINDINGS").borders(Borders::TOP); - let foot_txt = - Paragraph::new("q : Quit | ⏪🔽🔼⏩ or hjkl : Navigation | < > or H L : Shift task left/right | = - or J K : Shift task up/down") - .block(block); - f.render_widget(foot_txt, main_layout[3]); + let foot_txt = "q : Quit | ⏪🔽🔼⏩ or hjkl : Navigation | < > or H L : Shift task left/right | = - or J K : Shift task up/down"; + let footer = Paragraph::new(foot_txt).block(block); + f.render_widget(footer, main_layout[3]); if state.new_task_state.is_some() { draw_new_task_popup(f, state);