Show task description for selected column
This commit is contained in:
		
							parent
							
								
									436c9ed3cf
								
							
						
					
					
						commit
						07299d481d
					
				
							
								
								
									
										68
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										68
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -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"
 | 
				
			||||||
 | 
				
			|||||||
@ -11,3 +11,4 @@ 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"
 | 
				
			||||||
							
								
								
									
										24
									
								
								src/types.rs
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								src/types.rs
									
									
									
									
									
								
							@ -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,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										16
									
								
								src/ui.rs
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								src/ui.rs
									
									
									
									
									
								
							@ -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) {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user