Buttons to create or cancel the task entry
This commit is contained in:
parent
61feafaf7e
commit
be4fc3566d
10
src/app.rs
10
src/app.rs
@ -60,7 +60,8 @@ impl Default for Project {
|
|||||||
pub enum NewTaskFocus {
|
pub enum NewTaskFocus {
|
||||||
Title,
|
Title,
|
||||||
Description,
|
Description,
|
||||||
Buttons
|
CreateBtn,
|
||||||
|
CancelBtn
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct NewTask<'a> {
|
pub struct NewTask<'a> {
|
||||||
@ -148,9 +149,10 @@ impl Project {
|
|||||||
Self::load_from_json(&json)
|
Self::load_from_json(&json)
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn add_task(&mut self, status: Column, task: Task) {
|
pub fn add_task(&mut self, title: String, description: String) {
|
||||||
// self.tasks_per_column.entry(status).or_default().push(task);
|
let task = Task { title, description };
|
||||||
// }
|
self.columns[self.selected_column_idx].tasks.push(task);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn save(&self) {
|
pub fn save(&self) {
|
||||||
let json = serde_json::to_string_pretty(&self).unwrap();
|
let json = serde_json::to_string_pretty(&self).unwrap();
|
||||||
|
26
src/input.rs
26
src/input.rs
@ -17,25 +17,37 @@ pub fn handle_input(state: &mut AppState) -> Result<(), std::io::Error> {
|
|||||||
NewTaskFocus::Title => {
|
NewTaskFocus::Title => {
|
||||||
match key.code {
|
match key.code {
|
||||||
KeyCode::Tab => task.focus = NewTaskFocus::Description,
|
KeyCode::Tab => task.focus = NewTaskFocus::Description,
|
||||||
KeyCode::BackTab => task.focus = NewTaskFocus::Buttons,
|
KeyCode::BackTab => task.focus = NewTaskFocus::CancelBtn,
|
||||||
|
KeyCode::Enter => (),
|
||||||
_ => { task.title.input(key); }
|
_ => { task.title.input(key); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NewTaskFocus::Description => {
|
NewTaskFocus::Description => {
|
||||||
match key.code {
|
match key.code {
|
||||||
KeyCode::Tab => task.focus = NewTaskFocus::Buttons,
|
KeyCode::Tab => task.focus = NewTaskFocus::CreateBtn,
|
||||||
KeyCode::BackTab => task.focus = NewTaskFocus::Title,
|
KeyCode::BackTab => task.focus = NewTaskFocus::Title,
|
||||||
_ => { task.description.input(key); }
|
_ => { task.description.input(key); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
NewTaskFocus::CreateBtn => {
|
||||||
NewTaskFocus::Buttons => {
|
|
||||||
match key.code {
|
match key.code {
|
||||||
KeyCode::Tab => task.focus = NewTaskFocus::Title,
|
KeyCode::Tab => task.focus = NewTaskFocus::CancelBtn,
|
||||||
KeyCode::BackTab => task.focus = NewTaskFocus::Description,
|
KeyCode::BackTab => task.focus = NewTaskFocus::Description,
|
||||||
KeyCode::Enter => {
|
KeyCode::Enter => {
|
||||||
// TODO: Need a function that clears state and adds a new TODO
|
let title = task.title.clone().into_lines().join("\n");
|
||||||
// into the right column
|
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
|
state.new_task_state = None
|
||||||
}
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
|
68
src/ui.rs
68
src/ui.rs
@ -107,23 +107,60 @@ pub fn draw_new_task_popup<B: Backend>(f: &mut Frame<B>, state: &mut AppState) {
|
|||||||
[
|
[
|
||||||
Constraint::Length(3),
|
Constraint::Length(3),
|
||||||
Constraint::Max(100),
|
Constraint::Max(100),
|
||||||
|
Constraint::Length(3),
|
||||||
Constraint::Length(2),
|
Constraint::Length(2),
|
||||||
]
|
]
|
||||||
.as_ref(),
|
.as_ref(),
|
||||||
)
|
)
|
||||||
.split(block_inner);
|
.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 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 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 b3 = Block::default().title("Keys").borders(Borders::TOP);
|
||||||
let footer = Paragraph::new("p : Cancel").block(b3);
|
task.title.set_cursor_line_style(Style::default());
|
||||||
// f.render_widget(main, area);
|
task.description.set_cursor_line_style(Style::default());
|
||||||
// f.render_widget(title, layout[0]);
|
|
||||||
task.title.set_block(b1);
|
task.title.set_block(b1);
|
||||||
if let NewTaskFocus::Title = task.focus {
|
if let NewTaskFocus::Title = task.focus {
|
||||||
task.title.set_style(Style::default().fg(Color::Yellow));
|
task.title.set_style(Style::default().fg(Color::Yellow));
|
||||||
@ -133,7 +170,7 @@ pub fn draw_new_task_popup<B: Backend>(f: &mut Frame<B>, state: &mut AppState) {
|
|||||||
task.title.set_cursor_style(Style::default());
|
task.title.set_cursor_style(Style::default());
|
||||||
}
|
}
|
||||||
f.render_widget(task.title.widget(), layout[0]);
|
f.render_widget(task.title.widget(), layout[0]);
|
||||||
// f.render_widget(description, layout[1]);
|
|
||||||
task.description.set_block(b2);
|
task.description.set_block(b2);
|
||||||
if let NewTaskFocus::Description = task.focus {
|
if let NewTaskFocus::Description = task.focus {
|
||||||
task.description.set_style(Style::default().fg(Color::Yellow));
|
task.description.set_style(Style::default().fg(Color::Yellow));
|
||||||
@ -143,7 +180,9 @@ pub fn draw_new_task_popup<B: Backend>(f: &mut Frame<B>, state: &mut AppState) {
|
|||||||
task.description.set_cursor_style(Style::default());
|
task.description.set_cursor_style(Style::default());
|
||||||
}
|
}
|
||||||
f.render_widget(task.description.widget(), layout[1]);
|
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<B: Backend>(f: &mut Frame<B>, state: &mut AppState) {
|
|||||||
|
|
||||||
let block = Block::default().title("KEYBINDINGS").borders(Borders::TOP);
|
let block = Block::default().title("KEYBINDINGS").borders(Borders::TOP);
|
||||||
|
|
||||||
let foot_txt =
|
let foot_txt = "q : Quit | ⏪🔽🔼⏩ or hjkl : Navigation | < > or H L : Shift task left/right | = - or J K : Shift task up/down";
|
||||||
Paragraph::new("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);
|
||||||
.block(block);
|
f.render_widget(footer, main_layout[3]);
|
||||||
f.render_widget(foot_txt, main_layout[3]);
|
|
||||||
|
|
||||||
if state.new_task_state.is_some() {
|
if state.new_task_state.is_some() {
|
||||||
draw_new_task_popup(f, state);
|
draw_new_task_popup(f, state);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user