Render selected task with bounds checking

This commit is contained in:
Joseph Ferano 2022-12-04 04:29:36 +04:00
parent 07299d481d
commit 6472bbb1bc
2 changed files with 22 additions and 6 deletions

View File

@ -1,7 +1,8 @@
use std::cmp::min;
use crossterm::event;
use crossterm::event::{Event, KeyCode};
use crate::types::AppState;
use int_enum::IntEnum;
use crate::types::{AppState, TaskStatus};
pub fn handle_input(state: &mut AppState) -> Result<(), std::io::Error> {
if let Event::Key(key) = event::read()? {
@ -10,9 +11,16 @@ pub fn handle_input(state: &mut AppState) -> Result<(), std::io::Error> {
KeyCode::Char('h') |
KeyCode::Left => state.selected_column = state.selected_column.saturating_sub(1),
KeyCode::Char('j') |
KeyCode::Down => state.selected_task[state.selected_column] += 1,
KeyCode::Down => {
let column: TaskStatus = TaskStatus::from_int(state.selected_column).unwrap();
let tasks = state.current_project.tasks_per_column.get(&column).unwrap();
if tasks.len() > 0 {
let mins = min(state.selected_task[state.selected_column] + 1, tasks.len() - 1);
state.selected_task[state.selected_column] = mins;
}
}
KeyCode::Char('k') |
KeyCode::Up => state.selected_task[state.selected_column] -= 1,
KeyCode::Up => state.selected_task[state.selected_column] = state.selected_task[state.selected_column].saturating_sub(1),
KeyCode::Char('l') |
KeyCode::Right => state.selected_column = min(state.selected_column + 1, 4),
_ => {}

View File

@ -17,8 +17,16 @@ fn draw_tasks<B: Backend>(f: &mut Frame<B>, area: &Rect, state: &AppState) {
.split(*area);
for (i, (status, tasks)) in state.current_project.tasks_per_column.iter().enumerate() {
let items: Vec<ListItem> = tasks.iter().map(|t| {
ListItem::new(vec![Spans::from(Span::raw(&t.title))])
let items: Vec<ListItem> = tasks.iter().enumerate().map(|(j, task)| {
let mut style = Style::default();
if i == state.selected_column && j == state.selected_task[state.selected_column] {
style = style.fg(Color::White).add_modifier(Modifier::BOLD);
} else {
style = style.fg(Color::White);
}
let mut s = Span::raw(task.title.as_str());
s.style = style;
ListItem::new(vec![Spans::from(s)])
}).collect();
let mut style = Style::default();
if i == state.selected_column { style = style.fg(Color::Green); };
@ -43,7 +51,7 @@ fn draw_task_info<B: Backend>(f: &mut Frame<B>, area: &Rect, state: &AppState) {
let tasks = state.current_project.tasks_per_column.get(&column).unwrap();
if tasks.len() > 0 {
let task: &Task = &tasks[state.selected_task[state.selected_column]];
let p = Paragraph::new(&*task.description).block(block);
let p = Paragraph::new(task.description.as_str()).block(block);
f.render_widget(p, *area);
} else {
let p = Paragraph::new("No tasks for this column").block(block);