diff --git a/src/tui/app.rs b/src/tui/app.rs index d5bee29..1e2e33c 100644 --- a/src/tui/app.rs +++ b/src/tui/app.rs @@ -234,6 +234,8 @@ impl App { self.signal_tx.send(Signal::ClosedZettel { zid })?; + self.signal_tx.send(Signal::Refresh)?; + tui.terminal.clear()?; tui.enter()?; } diff --git a/src/tui/components/todo/inspector/groupview.rs b/src/tui/components/todo/inspector/groupview.rs index 5d4e709..0131c36 100644 --- a/src/tui/components/todo/inspector/groupview.rs +++ b/src/tui/components/todo/inspector/groupview.rs @@ -5,13 +5,17 @@ use ratatui::{ }; use ratatui_textarea::TextArea; -use crate::types::Group; +use crate::{ + tui::components::preview::Preview, + types::{Group, Index}, +}; #[derive(Debug, Clone)] pub struct GroupView<'text> { pub name: TextArea<'text>, pub priority: TextArea<'text>, created_at: Paragraph<'text>, + preview: Preview<'text>, layouts: Layouts, } @@ -26,6 +30,7 @@ impl Default for Layouts { Self { left_content: Layout::horizontal(vec![ Constraint::Percentage(30), + Constraint::Min(1), Constraint::Fill(100), ]), name_priority_created_at: Layout::vertical(vec![ @@ -38,23 +43,28 @@ impl Default for Layouts { } } -impl From<&Group> for GroupView<'_> { - fn from(value: &Group) -> Self { - let mut name = TextArea::new(vec![value.name.clone()]); +impl From<(&Group, &Index)> for GroupView<'_> { + fn from(value: (&Group, &Index)) -> Self { + let group = value.0; + let idx = value.1; + let mut name = TextArea::new(vec![group.name.clone()]); name.set_block(Block::bordered().title("[N]ame")); name.set_cursor_style(Style::reset()); name.set_cursor_line_style(Style::reset()); - let mut priority = TextArea::new(vec![value.priority.to_string()]); + let mut priority = TextArea::new(vec![group.priority.to_string()]); priority.set_block(Block::bordered().title("[P]riority")); priority.set_cursor_style(Style::reset()); priority.set_cursor_line_style(Style::reset()); + let preview = idx.get_zod(&group.zettel.id).body.clone().into(); + Self { name, priority, - created_at: Paragraph::new(value.created_at()) + created_at: Paragraph::new(group.created_at()) .block(Block::bordered().title("Created At")), + preview, layouts: Layouts::default(), } } @@ -65,15 +75,16 @@ impl Widget for GroupView<'_> { where Self: Sized, { - let (name_rect, priority_rect, created_at, _content_rect) = { + let (name_rect, priority_rect, created_at, content_rect) = { let rects = self.layouts.left_content.split(area); let l_rects = self.layouts.name_priority_created_at.split(rects[0]); - (l_rects[0], l_rects[1], l_rects[2], rects[1]) + (l_rects[0], l_rects[1], l_rects[2], rects[2]) }; self.name.render(name_rect, buf); self.priority.render(priority_rect, buf); self.created_at.render(created_at, buf); + self.preview.render(content_rect, buf); } } diff --git a/src/tui/components/todo/inspector/mod.rs b/src/tui/components/todo/inspector/mod.rs index 56c83fc..5d8fdc5 100644 --- a/src/tui/components/todo/inspector/mod.rs +++ b/src/tui/components/todo/inspector/mod.rs @@ -46,7 +46,7 @@ enum Edit { } impl Inspector<'_> { - pub fn new(kh: KastenHandle, node: &TodoNode) -> Self { + pub async fn new(kh: KastenHandle, node: &TodoNode) -> Self { let margins = Layout::new(Direction::Horizontal, [Constraint::Percentage(100)]) .horizontal_margin(3) .vertical_margin(2); @@ -59,6 +59,7 @@ impl Inspector<'_> { .border_type(BorderType::Rounded); let mut nanoid = None; + let kt = kh.read().await; let render_data = match node.kind { TodoNodeKind::Root => RenderData::Root { @@ -68,18 +69,20 @@ impl Inspector<'_> { nanoid = Some(group.id.clone()); RenderData::Group { - widget: Box::new(GroupView::from(&**group)), + widget: Box::new(GroupView::from((&**group, &kt.index))), } } TodoNodeKind::Task(ref task) => { nanoid = Some(task.id.clone()); RenderData::Task { - widget: Box::new(TaskView::from(&**task)), + widget: Box::new(TaskView::from((&**task, &kt.index))), } } }; + drop(kt); + Self { render_data, margins, @@ -113,7 +116,9 @@ impl Inspector<'_> { .border_type(BorderType::Rounded); } - pub fn inspect(&mut self, node: &TodoNode) { + pub async fn inspect(&mut self, node: &TodoNode) { + let kt = self.kh.read().await; + self.render_data = match node.kind { TodoNodeKind::Root => { self.inspecting = None; @@ -124,13 +129,13 @@ impl Inspector<'_> { TodoNodeKind::Group(ref group) => { self.inspecting = Some(group.id.clone()); RenderData::Group { - widget: Box::new(GroupView::from(&**group)), + widget: Box::new(GroupView::from((&**group, &kt.index))), } } TodoNodeKind::Task(ref task) => { self.inspecting = Some(task.id.clone()); RenderData::Task { - widget: Box::new(TaskView::from(&**task)), + widget: Box::new(TaskView::from((&**task, &kt.index))), } } } @@ -145,7 +150,7 @@ impl Inspector<'_> { return; }; let node = kt.todo_tree.get_node_by_nano_id(inspecting).data(); - self.inspect(node); + self.inspect(node).await; drop(kt); } @@ -166,6 +171,14 @@ impl Component for Inspector<'_> { async fn update(&mut self, signal: Signal) -> color_eyre::Result> { match signal { + Signal::SwitchTo { + page: crate::tui::Page::Zk, + } => { + self.is_active = false; + + self.set_inactive(); + } + Signal::EditName => { let name = match &mut self.render_data { RenderData::Root { widget: _ } => return Ok(None), diff --git a/src/tui/components/todo/inspector/taskview.rs b/src/tui/components/todo/inspector/taskview.rs index f046f7b..c0e869f 100644 --- a/src/tui/components/todo/inspector/taskview.rs +++ b/src/tui/components/todo/inspector/taskview.rs @@ -5,7 +5,10 @@ use ratatui::{ }; use ratatui_textarea::TextArea; -use crate::types::Task; +use crate::{ + tui::components::preview::Preview, + types::{Index, Task}, +}; #[derive(Debug, Clone)] pub struct TaskView<'text> { @@ -13,6 +16,7 @@ pub struct TaskView<'text> { pub priority: TextArea<'text>, pub due_finished_at: TextArea<'text>, parent_group: Paragraph<'text>, + preview: Preview<'text>, layouts: Layouts, } @@ -27,8 +31,10 @@ impl Default for Layouts { Self { left_content: Layout::horizontal(vec![ Constraint::Percentage(30), + Constraint::Min(1), Constraint::Fill(100), ]), + // .horizontal_margin(2), name_priority_due_group: Layout::vertical(vec![ Constraint::Min(3), Constraint::Min(3), @@ -39,21 +45,24 @@ impl Default for Layouts { } } -impl From<&Task> for TaskView<'_> { - fn from(value: &Task) -> Self { - let mut name = TextArea::new(vec![value.name.clone()]); +impl From<(&Task, &Index)> for TaskView<'_> { + fn from(value: (&Task, &Index)) -> Self { + let task = value.0; + let idx = value.1; + + let mut name = TextArea::new(vec![task.name.clone()]); name.set_block(Block::bordered().title("[N]ame")); name.set_cursor_style(Style::reset()); name.set_cursor_line_style(Style::reset()); - let mut priority = TextArea::new(vec![value.priority.to_string()]); + let mut priority = TextArea::new(vec![task.priority.to_string()]); priority.set_block(Block::bordered().title("[P]riority")); priority.set_cursor_style(Style::reset()); priority.set_cursor_line_style(Style::reset()); let due_finished_at = { - let (title, content) = value.finished_at().map_or_else( - || ("[D]ue", value.due.to_string()), + let (title, content) = task.finished_at().map_or_else( + || ("[D]ue", task.due.to_string()), |finished| ("[F]inished At", finished), ); @@ -63,13 +72,17 @@ impl From<&Task> for TaskView<'_> { textarea.set_cursor_line_style(Style::reset()); textarea }; + + let preview = idx.get_zod(&task.zettel.id).body.clone().into(); + Self { name, priority, due_finished_at, - parent_group: Paragraph::new(value.group.name.clone()) + parent_group: Paragraph::new(task.group.name.clone()) .block(Block::bordered().title("Group")), layouts: Layouts::default(), + preview, } } } @@ -79,16 +92,17 @@ impl Widget for TaskView<'_> { where Self: Sized, { - let (name_rect, priority_rect, due_rect, group_rect, _content_rect) = { + let (name_rect, priority_rect, due_rect, group_rect, content_rect) = { let rects = self.layouts.left_content.split(area); let l_rects = self.layouts.name_priority_due_group.split(rects[0]); - (l_rects[0], l_rects[1], l_rects[2], l_rects[3], rects[1]) + (l_rects[0], l_rects[1], l_rects[2], l_rects[3], rects[2]) }; self.name.render(name_rect, buf); self.priority.render(priority_rect, buf); self.due_finished_at.render(due_rect, buf); self.parent_group.render(group_rect, buf); + self.preview.render(content_rect, buf); } } diff --git a/src/tui/components/todo/mod.rs b/src/tui/components/todo/mod.rs index a8a35bf..b6c841b 100644 --- a/src/tui/components/todo/mod.rs +++ b/src/tui/components/todo/mod.rs @@ -165,11 +165,13 @@ impl Todo<'_> { }; let tree = &self.kh.read().await.todo_tree.tree; - inspector.inspect( - tree.get(selected_node_id) - .expect("Nodeid must be valid") - .data(), - ); + inspector + .inspect( + tree.get(selected_node_id) + .expect("Nodeid must be valid") + .data(), + ) + .await; } } @@ -233,7 +235,7 @@ impl Component for Todo<'_> { ) .expect("Node id must be valid"); - let mut inspector: Inspector<'_> = Inspector::new(self.kh.clone(), first.data()); + let mut inspector: Inspector<'_> = Inspector::new(self.kh.clone(), first.data()).await; explorer.set_inactive(); inspector.set_inactive(); diff --git a/src/tui/components/zk/mod.rs b/src/tui/components/zk/mod.rs index 93a2557..7b6d4f1 100644 --- a/src/tui/components/zk/mod.rs +++ b/src/tui/components/zk/mod.rs @@ -11,7 +11,7 @@ use crate::{ types::{KastenHandle, Zettel}, }; -mod preview; +pub mod preview; mod search; mod zettel_list; mod zettel_view; diff --git a/src/tui/components/zk/preview.rs b/src/tui/components/zk/preview.rs index 9724e07..4511f1a 100644 --- a/src/tui/components/zk/preview.rs +++ b/src/tui/components/zk/preview.rs @@ -1,14 +1,22 @@ -use ratatui::{text::Text, widgets::Widget}; +use ratatui::{ + text::Text, + widgets::{Block, BorderType, Borders, Paragraph, Widget}, +}; #[derive(Debug, Clone)] pub struct Preview<'text> { - content: Text<'text>, + content: Paragraph<'text>, } impl From for Preview<'_> { fn from(value: String) -> Self { Self { - content: Text::from(value), + content: Paragraph::new(Text::from(value)).block( + Block::new() + .borders(Borders::TOP | Borders::LEFT) + .border_type(BorderType::Rounded) + .title("Preview"), + ), } } }