NewTask state to manage adding a new task
This commit is contained in:
parent
c9a69c7abe
commit
167f506291
28
src/app.rs
28
src/app.rs
@ -55,23 +55,45 @@ impl Default for Project {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum NewTaskFocus {
|
||||||
|
Title,
|
||||||
|
Description,
|
||||||
|
Buttons
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct NewTask {
|
||||||
|
pub title: String,
|
||||||
|
pub description: String,
|
||||||
|
pub focus: NewTaskFocus
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for NewTask {
|
||||||
|
fn default() -> Self {
|
||||||
|
NewTask {
|
||||||
|
title: String::new(),
|
||||||
|
description: String::new(),
|
||||||
|
focus: NewTaskFocus::Title
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct AppState {
|
pub struct AppState {
|
||||||
pub project: Project,
|
pub project: Project,
|
||||||
pub quit: bool,
|
pub quit: bool,
|
||||||
pub columns: Vec<Column>,
|
pub columns: Vec<Column>,
|
||||||
pub popup_text: Option<String>,
|
pub new_task_state: Option<NewTask>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppState {
|
impl AppState {
|
||||||
pub fn new(project: Project) -> Self {
|
pub fn new(project: Project) -> Self {
|
||||||
AppState {
|
AppState {
|
||||||
quit: false,
|
quit: false,
|
||||||
popup_text: None,
|
new_task_state: None,
|
||||||
project,
|
project,
|
||||||
columns: vec![],
|
columns: vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Column {
|
impl Column {
|
||||||
|
10
src/input.rs
10
src/input.rs
@ -1,12 +1,14 @@
|
|||||||
use crossterm::event;
|
use crossterm::event;
|
||||||
use crossterm::event::{Event, KeyCode};
|
use crossterm::event::{Event, KeyCode};
|
||||||
use crate::app::{AppState};
|
use crate::app::{NewTask, AppState};
|
||||||
|
|
||||||
pub fn handle_input(state: &mut AppState) -> Result<(), std::io::Error> {
|
pub fn handle_input(state: &mut AppState) -> Result<(), std::io::Error> {
|
||||||
let project = &mut state.project;
|
let project = &mut state.project;
|
||||||
let column = project.get_selected_column_mut();
|
let column = project.get_selected_column_mut();
|
||||||
if let Event::Key(key) = event::read()? {
|
if let Event::Key(key) = event::read()? {
|
||||||
match key.code {
|
match key.code {
|
||||||
|
// KeyCode::BackTab =>
|
||||||
|
// KeyCode::Tab =>
|
||||||
KeyCode::Char('q') => state.quit = true,
|
KeyCode::Char('q') => state.quit = true,
|
||||||
KeyCode::Char('h') |
|
KeyCode::Char('h') |
|
||||||
KeyCode::Left => { project.select_previous_column(); },
|
KeyCode::Left => { project.select_previous_column(); },
|
||||||
@ -25,9 +27,9 @@ pub fn handle_input(state: &mut AppState) -> Result<(), std::io::Error> {
|
|||||||
KeyCode::Char('-') |
|
KeyCode::Char('-') |
|
||||||
KeyCode::Char('K') => project.move_task_up(),
|
KeyCode::Char('K') => project.move_task_up(),
|
||||||
KeyCode::Char('p') => {
|
KeyCode::Char('p') => {
|
||||||
match state.popup_text {
|
match state.new_task_state {
|
||||||
None => state.popup_text = Some("".to_string()),
|
None => state.new_task_state = Some(NewTask::default()),
|
||||||
Some(_) => state.popup_text = None,
|
Some(_) => state.new_task_state = None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -62,6 +62,7 @@ fn draw_task_info<B: Backend>(f: &mut Frame<B>, area: &Rect, state: &AppState) {
|
|||||||
f.render_widget(p, *area);
|
f.render_widget(p, *area);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn centered_rect_for_popup(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
|
fn centered_rect_for_popup(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
|
||||||
let popup_layout = Layout::default()
|
let popup_layout = Layout::default()
|
||||||
.direction(Direction::Vertical)
|
.direction(Direction::Vertical)
|
||||||
@ -91,15 +92,15 @@ fn centered_rect_for_popup(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
|
|||||||
pub fn draw_new_task_popup<B: Backend>(f: &mut Frame<B>, state: &mut AppState) {
|
pub fn draw_new_task_popup<B: Backend>(f: &mut Frame<B>, state: &mut AppState) {
|
||||||
let area = centered_rect_for_popup(45, 60, f.size());
|
let area = centered_rect_for_popup(45, 60, f.size());
|
||||||
f.render_widget(Clear, area);
|
f.render_widget(Clear, area);
|
||||||
match &state.popup_text {
|
match &state.new_task_state {
|
||||||
None => {}
|
None => {}
|
||||||
Some(s) => {
|
Some(task) => {
|
||||||
let block = Block::default()
|
let block = Block::default()
|
||||||
.title("Add Task")
|
.title("Add Task")
|
||||||
.title_alignment(Alignment::Center)
|
.title_alignment(Alignment::Center)
|
||||||
.borders(Borders::ALL);
|
.borders(Borders::ALL);
|
||||||
let block_inner = block.inner(area);
|
let block_inner = block.inner(area);
|
||||||
let main = Paragraph::new(s.as_ref()).block(block);
|
let main = Paragraph::new(task.description.as_ref()).block(block);
|
||||||
let layout = Layout::default()
|
let layout = Layout::default()
|
||||||
.direction(Direction::Vertical)
|
.direction(Direction::Vertical)
|
||||||
.constraints(
|
.constraints(
|
||||||
@ -157,7 +158,7 @@ pub fn draw<B: Backend>(f: &mut Frame<B>, state: &mut AppState) {
|
|||||||
.block(block);
|
.block(block);
|
||||||
f.render_widget(foot_txt, main_layout[3]);
|
f.render_widget(foot_txt, main_layout[3]);
|
||||||
|
|
||||||
if state.popup_text.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