My personal-knowledge-system, with deeply integrated task tracking and long term goal planning capabilities.
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: stylistic improvements to explorer

+88 -43
+1 -1
src/tui/app.rs
··· 39 39 Default, Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, EnumIter, Display, 40 40 )] 41 41 pub enum Region { 42 - #[default] 43 42 Zk, 43 + #[default] 44 44 Todo, 45 45 } 46 46
+52 -8
src/tui/components/todo/explorer.rs
··· 1 1 use ratatui::{ 2 - style::{Color, Modifier, Stylize}, 2 + style::{Color, Modifier, Style, Stylize}, 3 3 text::{Line, Span, Text}, 4 - widgets::{List, ListState}, 4 + widgets::{Block, BorderType, Borders, List, ListState}, 5 5 }; 6 + use tracing::info; 6 7 use tree::NodeId; 7 8 8 9 use crate::types::{TodoNode, TodoNodeKind, TodoTree}; ··· 33 34 }), 34 35 ) 35 36 .style(Color::White) 36 - .highlight_style(Modifier::REVERSED) 37 + .highlight_style(Modifier::ITALIC | Modifier::BOLD) 37 38 .highlight_symbol("> "); 38 39 39 40 let id_list = tree ··· 48 49 state, 49 50 width, 50 51 } 52 + } 53 + 54 + pub fn set_active(&mut self) { 55 + self.render_list = self.render_list.clone().block( 56 + Block::new() 57 + .title("[1]") 58 + .title("Explorer") 59 + .borders(Borders::TOP | Borders::RIGHT) 60 + .border_style(Style::new().fg(Color::Green)) 61 + .border_type(BorderType::Rounded), 62 + ); 63 + } 64 + 65 + #[expect(dead_code)] 66 + pub fn set_inactive(&mut self) { 67 + self.render_list = self.render_list.clone().block( 68 + Block::new() 69 + .title("[1]") 70 + .title("Explorer") 71 + .borders(Borders::TOP | Borders::RIGHT) 72 + .border_style(Style::new().fg(Color::Gray)) 73 + .border_type(BorderType::Rounded), 74 + ); 51 75 } 52 76 } 53 77 ··· 59 83 60 84 impl From<&TodoNode> for ExplorerListItem<'_> { 61 85 fn from(value: &TodoNode) -> Self { 62 - let spacer = Span::from(" ".repeat(value.depth)); 86 + let spacer = Span::from(" ".repeat(value.depth)); 63 87 let name = match value.kind { 64 - TodoNodeKind::Group(ref g) => Span::from(g.name.clone()).bg(g.tag.color), 65 - TodoNodeKind::Task(ref t) => Span::from(t.name.clone()), 88 + TodoNodeKind::Group(ref g) => Span::from(format!(" {}", g.name.clone())) 89 + .bg(g.tag.color) 90 + .fg(Color::Black), 91 + TodoNodeKind::Task(ref t) => { 92 + Span::from(format!(" {}", t.name.clone())).fg(t.group.tag.color) 93 + } 66 94 TodoNodeKind::Root => Span::from("THIS SHOULD NOT BE VISIBLE"), 67 95 }; 68 96 ··· 76 104 77 105 impl<'text> From<ExplorerListItem<'text>> for Text<'text> { 78 106 fn from(value: ExplorerListItem<'text>) -> Self { 79 - let line = Line::from(vec![value.spacer, value.name]); 80 - line.into() 107 + let bg_color = value.name.style.bg; 108 + let spacer_width = value.spacer.content.len(); 109 + let name_width = value.name.content.len(); 110 + let used = spacer_width + name_width; 111 + 112 + let mut spans = vec![value.spacer, value.name]; 113 + 114 + if let Some(color) = bg_color { 115 + let padding = (value.width as usize).saturating_sub(used); 116 + spans.push(Span::styled( 117 + " ".repeat(padding), 118 + Style::default().bg(color), 119 + )); 120 + } 121 + 122 + info!("{spans:#?}"); 123 + 124 + Line::from(spans).into() 81 125 } 82 126 }
+34 -33
src/tui/components/todo/mod.rs
··· 1 1 use async_trait::async_trait; 2 - use color_eyre::eyre::Result; 3 2 use ratatui::{ 4 3 Frame, 5 4 layout::{Constraint, Layout, Rect, Size}, ··· 22 21 signal_tx: Option<UnboundedSender<Signal>>, 23 22 kh: KastenHandle, 24 23 layouts: Layouts, 25 - explorer: Explorer<'text>, 26 - task_list: TaskList<'text>, 24 + explorer: Option<Explorer<'text>>, 25 + task_list: Option<TaskList<'text>>, 27 26 } 28 27 29 28 impl Todo<'_> { 30 - pub async fn new(kh: KastenHandle) -> Result<Self> { 31 - let kt = kh.read().await; 32 - 33 - let mut l_state = ListState::default(); 34 - l_state.select_first(); 35 - let explorer = Explorer::new(&kt.todo_tree, &kt.todo_tree.root_id, l_state, 0); 36 - let task_list = TaskList::new(&kt.todo_tree, &kt.todo_tree.root_id, l_state, 0); 37 - 38 - drop(kt); 39 - 40 - Ok(Self { 29 + pub fn new(kh: KastenHandle) -> Self { 30 + Self { 41 31 kh, 42 32 layouts: Layouts::default(), 43 33 signal_tx: None, 44 - explorer, 45 - task_list, 46 - }) 34 + explorer: None, 35 + task_list: None, 36 + } 47 37 } 48 38 } 49 39 ··· 65 55 let total_width = area.width; 66 56 let tree = &self.kh.read().await.todo_tree; 67 57 68 - let explorer = Explorer::new(tree, &tree.root_id, self.explorer.state, total_width / 2); 69 - let task_list = TaskList::new(tree, &tree.root_id, self.task_list.state, total_width / 2); 70 - self.explorer = explorer; 71 - self.task_list = task_list; 58 + let mut l_state = ListState::default(); 59 + 60 + l_state.select_first(); 61 + 62 + let mut explorer = Explorer::new(tree, &tree.root_id, l_state, total_width / 2); 63 + let task_list = TaskList::new(tree, &tree.root_id, l_state, total_width / 2); 64 + 65 + explorer.set_active(); 66 + 67 + self.explorer = Some(explorer); 68 + self.task_list = Some(task_list); 72 69 73 70 Ok(()) 74 71 } 75 72 76 73 async fn update(&mut self, signal: Signal) -> color_eyre::Result<Option<Signal>> { 74 + let explorer = self 75 + .explorer 76 + .as_mut() 77 + .expect("This should have already been initialized"); 78 + 79 + let _task_list = self 80 + .task_list 81 + .as_mut() 82 + .expect("This should have already been initialized"); 83 + 77 84 match signal { 78 85 Signal::MoveDown => { 79 - self.explorer.state.select_next(); 86 + explorer.state.select_next(); 80 87 // self.update_views_from_zettel_list_selection().await?; 81 88 } 82 89 83 90 Signal::MoveUp => { 84 - self.explorer.state.select_previous(); 91 + explorer.state.select_previous(); 85 92 } 86 93 _ => {} 87 94 } ··· 94 101 (rects[0], rects[1]) 95 102 }; 96 103 97 - frame.render_stateful_widget( 98 - &self.explorer.render_list, 99 - explorer_rect, 100 - &mut self.explorer.state, 101 - ); 104 + let explorer = self.explorer.as_mut().unwrap(); 105 + let task_list = self.task_list.as_mut().unwrap(); 102 106 103 - frame.render_stateful_widget( 104 - &self.task_list.render_list, 105 - task_list_rect, 106 - &mut self.task_list.state, 107 - ); 107 + frame.render_stateful_widget(&explorer.render_list, explorer_rect, &mut explorer.state); 108 + frame.render_stateful_widget(&task_list.render_list, task_list_rect, &mut task_list.state); 108 109 Ok(()) 109 110 } 110 111 }
+1 -1
src/tui/components/viewport/mod.rs
··· 41 41 _layouts: Layouts::default(), 42 42 switcher, 43 43 zk: Zk::new(kh.clone()).await?, 44 - todo: Todo::new(kh.clone()).await?, 44 + todo: Todo::new(kh.clone()), 45 45 active_region: Region::default(), 46 46 kh, 47 47 })