Render selected task with bounds checking
This commit is contained in:
parent
07299d481d
commit
6472bbb1bc
14
src/input.rs
14
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),
|
||||
_ => {}
|
||||
|
14
src/ui.rs
14
src/ui.rs
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user