Show task description for selected column

This commit is contained in:
Joseph Ferano 2022-12-04 03:44:42 +04:00
parent 436c9ed3cf
commit 07299d481d
4 changed files with 96 additions and 15 deletions

68
Cargo.lock generated
View File

@ -68,6 +68,27 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "int-enum"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cff87d3cc4b79b4559e3c75068d64247284aceb6a038bd4bb38387f3f164476d"
dependencies = [
"int-enum-impl",
]
[[package]]
name = "int-enum-impl"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df1f2f068675add1a3fc77f5f5ab2e29290c841ee34d151abc007bce902e5d34"
dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.4" version = "1.0.4"
@ -80,6 +101,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"crossterm", "crossterm",
"indexmap", "indexmap",
"int-enum",
"serde", "serde",
"serde_json", "serde_json",
"tui", "tui",
@ -122,6 +144,12 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "once_cell"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.1" version = "0.12.1"
@ -145,6 +173,17 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "proc-macro-crate"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9"
dependencies = [
"once_cell",
"thiserror",
"toml",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.47" version = "1.0.47"
@ -262,6 +301,35 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "thiserror"
version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "toml"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "tui" name = "tui"
version = "0.19.0" version = "0.19.0"

View File

@ -10,4 +10,5 @@ tui = "0.19.0"
crossterm = "0.25" crossterm = "0.25"
serde = { version = "1.0.148" , features = [ "derive" ] } serde = { version = "1.0.148" , features = [ "derive" ] }
serde_json = "1.0.89" serde_json = "1.0.89"
indexmap = { version = "1.9.2" , features = [ "serde" ] } indexmap = { version = "1.9.2" , features = [ "serde" ] }
int-enum = "0.5.0"

View File

@ -1,13 +1,15 @@
use indexmap::IndexMap; use indexmap::IndexMap;
use int_enum::IntEnum;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash)] #[repr(usize)]
#[derive(Deserialize, Serialize, Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, IntEnum)]
pub enum TaskStatus { pub enum TaskStatus {
Done, Done = 0,
Todo, Todo = 1,
InProgress, InProgress = 2,
Testing, Testing = 3,
Backlog, Backlog = 4,
} }
#[derive(Deserialize, Serialize, Debug)] #[derive(Deserialize, Serialize, Debug)]
@ -28,14 +30,14 @@ impl Default for Task {
#[derive(Deserialize, Serialize, Debug)] #[derive(Deserialize, Serialize, Debug)]
pub struct Project { pub struct Project {
pub name: String, pub name: String,
pub tasks: IndexMap<TaskStatus, Vec<Task>>, pub tasks_per_column: IndexMap<TaskStatus, Vec<Task>>,
} }
impl Project { impl Project {
fn new(name: &str) -> Self { fn new(name: &str) -> Self {
Project { Project {
name: name.to_owned(), name: name.to_owned(),
tasks: IndexMap::from( tasks_per_column: IndexMap::from(
[(TaskStatus::Done, vec![]), [(TaskStatus::Done, vec![]),
(TaskStatus::Todo, vec![]), (TaskStatus::Todo, vec![]),
(TaskStatus::InProgress, vec![]), (TaskStatus::InProgress, vec![]),
@ -46,7 +48,7 @@ impl Project {
} }
fn add_task(&mut self, status: TaskStatus, task: Task) { fn add_task(&mut self, status: TaskStatus, task: Task) {
self.tasks.entry(status).or_default().push(task); self.tasks_per_column.entry(status).or_default().push(task);
} }
} }
@ -54,7 +56,7 @@ impl Default for Project {
fn default() -> Self { fn default() -> Self {
Project { Project {
name: String::new(), name: String::new(),
tasks: IndexMap::new(), tasks_per_column: IndexMap::new(),
} }
} }
} }
@ -78,7 +80,7 @@ impl Project {
pub struct AppState { pub struct AppState {
pub selected_column: usize, pub selected_column: usize,
pub selected_task: [u8; 5], pub selected_task: [usize; 5],
pub current_project: Project, pub current_project: Project,
pub quit: bool, pub quit: bool,
} }

View File

@ -5,17 +5,18 @@ use tui::style::{Color, Modifier, Style};
use tui::text::{Span, Spans}; use tui::text::{Span, Spans};
use tui::widgets::*; use tui::widgets::*;
use crate::types::*; use crate::types::*;
use int_enum::IntEnum;
fn draw_tasks<B: Backend>(f: &mut Frame<B>, area: &Rect, state: &AppState) { fn draw_tasks<B: Backend>(f: &mut Frame<B>, area: &Rect, state: &AppState) {
let columns = Layout::default() let columns = Layout::default()
.direction(Direction::Horizontal) .direction(Direction::Horizontal)
.constraints( .constraints(
vec![Constraint::Percentage(20); vec![Constraint::Percentage(20);
state.current_project.tasks.len()].as_ref() state.current_project.tasks_per_column.len()].as_ref()
) )
.split(*area); .split(*area);
for (i, (status, tasks)) in state.current_project.tasks.iter().enumerate() { for (i, (status, tasks)) in state.current_project.tasks_per_column.iter().enumerate() {
let items: Vec<ListItem> = tasks.iter().map(|t| { let items: Vec<ListItem> = tasks.iter().map(|t| {
ListItem::new(vec![Spans::from(Span::raw(&t.title))]) ListItem::new(vec![Spans::from(Span::raw(&t.title))])
}).collect(); }).collect();
@ -38,7 +39,16 @@ fn draw_task_info<B: Backend>(f: &mut Frame<B>, area: &Rect, state: &AppState) {
let block = Block::default() let block = Block::default()
.title("TASK INFO") .title("TASK INFO")
.borders(Borders::ALL); .borders(Borders::ALL);
f.render_widget(block, *area); 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 task: &Task = &tasks[state.selected_task[state.selected_column]];
let p = Paragraph::new(&*task.description).block(block);
f.render_widget(p, *area);
} else {
let p = Paragraph::new("No tasks for this column").block(block);
f.render_widget(p, *area);
}
} }
pub fn draw<B: Backend>(f: &mut Frame<B>, state: &mut AppState) { pub fn draw<B: Backend>(f: &mut Frame<B>, state: &mut AppState) {