From 6472bbb1bc46fff29fb0ffeae1f7de98b2f9f7ac Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Sun, 4 Dec 2022 04:29:36 +0400 Subject: [PATCH] Render selected task with bounds checking --- src/input.rs | 14 +++++++++++--- src/ui.rs | 14 +++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/input.rs b/src/input.rs index 7bb55f9..05f19c5 100644 --- a/src/input.rs +++ b/src/input.rs @@ -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), _ => {} diff --git a/src/ui.rs b/src/ui.rs index 6891b2c..4b61246 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -17,8 +17,16 @@ fn draw_tasks(f: &mut Frame, area: &Rect, state: &AppState) { .split(*area); for (i, (status, tasks)) in state.current_project.tasks_per_column.iter().enumerate() { - let items: Vec = tasks.iter().map(|t| { - ListItem::new(vec![Spans::from(Span::raw(&t.title))]) + let items: Vec = 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(f: &mut Frame, 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);