diff --git a/.config/config.ron b/.config/config.ron index 930cabc..88153cd 100644 --- a/.config/config.ron +++ b/.config/config.ron @@ -1,38 +1,38 @@ ( directory: "/Users/suri/dev/projects/filaments/ZettelKasten", global_key_binds: { - "down": MoveDown, - "up": MoveUp, "ctrl-z": Suspend, + "up": MoveUp, + "down": MoveDown, "ctrl-c": Quit, }, zk: ( keybinds: { - "enter": OpenZettel, - "ctrl-n": NewZettel, "tab": SwitchTo( page: Todo(Explorer), ), + "ctrl-n": NewZettel, + "enter": OpenZettel, }, ), todo: ( explorer: ( keybinds: { - "2": SwitchTo( - page: Todo(Inspector), + "tab": SwitchTo( + page: Zk, ), "3": SwitchTo( page: Todo(TaskList), ), - "1": SwitchTo( - page: Todo(Explorer), - ), + "g": NewSubGroup, "k": MoveUp, - "shift-g": NewSubGroup, + "2": SwitchTo( + page: Todo(Inspector), + ), "j": MoveDown, - "k": MoveUp, - "tab": SwitchTo( - page: Zk, + "shift-g": NewGroup, + "1": SwitchTo( + page: Todo(Explorer), ), }, ), @@ -41,34 +41,34 @@ "3": SwitchTo( page: Todo(TaskList), ), - "tab": SwitchTo( - page: Zk, + "1": SwitchTo( + page: Todo(Explorer), ), "2": SwitchTo( page: Todo(Inspector), ), - "1": SwitchTo( - page: Todo(Explorer), + "tab": SwitchTo( + page: Zk, ), }, ), tasklist: ( keybinds: { - "tab": SwitchTo( - page: Zk, - ), - "3": SwitchTo( - page: Todo(TaskList), - ), + "k": MoveUp, "1": SwitchTo( page: Todo(Explorer), ), - "j": MoveDown, - "k": MoveUp, "2": SwitchTo( page: Todo(Inspector), ), + "3": SwitchTo( + page: Todo(TaskList), + ), + "j": MoveDown, + "tab": SwitchTo( + page: Zk, + ), }, ), ), -) +) \ No newline at end of file diff --git a/.config/default_config.ron b/.config/default_config.ron index 18de044..23f4fbe 100644 --- a/.config/default_config.ron +++ b/.config/default_config.ron @@ -22,7 +22,8 @@ "3": SwitchTo(page: Todo(TaskList)), "j": MoveDown, "k": MoveUp, - "g": NewGroup + "shift-g": NewGroup, + "g": NewSubGroup, }, ), inspector: ( diff --git a/justfile b/justfile index b180c62..6966c6a 100644 --- a/justfile +++ b/justfile @@ -19,7 +19,9 @@ run: # Run all tests test: cargo nextest r {{_cargo_flags}} - +reset: + rm -rf ZettleKasten + cargo run -- init # Only used to build / generate entities dev-db := justfile_directory() + "/target/dev.db" diff --git a/src/tui/components/todo/explorer.rs b/src/tui/components/todo/explorer.rs index 2314740..f952c43 100644 --- a/src/tui/components/todo/explorer.rs +++ b/src/tui/components/todo/explorer.rs @@ -6,7 +6,7 @@ use ratatui::{ use tracing::debug; use tree::NodeId; -use crate::types::{TodoNode, TodoNodeKind, TodoTree}; +use crate::types::{Group, TodoNode, TodoNodeKind, TodoTree}; pub struct Explorer<'text> { pub render_list: ratatui::widgets::List<'text>, @@ -79,6 +79,36 @@ impl Explorer<'_> { .border_type(BorderType::Rounded), ); } + + /// Returns the parent `Group` of the current selection in the `Explorer` + pub fn group_of_current_selection<'tree>(&self, tree: &'tree TodoTree) -> Option<&'tree Group> { + let selected = self.id_list.get(self.state.selected()?)?; + + if let TodoNodeKind::Group(group) = &tree + .tree + .get(selected) + .expect("Invaraint Broken! This must be a valid id") + .data() + .kind + { + return Some(group); + } + + let mut ancestors = tree.tree.ancestors(selected).expect("Must be a valid id"); + + ancestors + .next() + .and_then(|parent| match &parent.data().kind { + TodoNodeKind::Root => None, + + TodoNodeKind::Task(_) => { + panic!("Invariant broken! how is a task a parent?!") + } + + TodoNodeKind::Group(group) => Some(group), + }) + .map(|g| &**g) + } } pub struct ExplorerListItem<'text> { diff --git a/src/tui/components/todo/mod.rs b/src/tui/components/todo/mod.rs index b65208d..5a87650 100644 --- a/src/tui/components/todo/mod.rs +++ b/src/tui/components/todo/mod.rs @@ -28,6 +28,7 @@ pub struct Todo<'text> { signal_tx: Option>, kh: KastenHandle, layouts: Layouts, + explorer: Option>, task_list: Option>, inspector: Option>, @@ -238,12 +239,6 @@ impl Component for Todo<'_> { self.task_list = Some(task_list); self.inspector = Some(inspector); - // match self.active { - - // ins - - // } - Ok(()) } @@ -322,13 +317,27 @@ impl Component for Todo<'_> { return Ok(None); } - debug!("Creating Task!"); - let _kt = self.kh.write().await; - todo!(); - // let task = Task::new("wahoo", ); + todo!() + + // let ancestors = kt.todo_tree.tree.ancestors(node_id) = todo!(); + // let task = Task::new("wahoo"); } Signal::NewSubGroup => { + if self.active != TodoRegion::Explorer { + return Ok(None); + } + let mut kt = self.kh.write().await; + let parent = explorer + .group_of_current_selection(&kt.todo_tree) + .map(|parent| parent.id.clone()); + let group = Group::new(NanoId::default().to_string(), parent, &mut kt).await?; + drop(kt); + debug!("Created group: {group:#?}"); + return Ok(Some(Signal::Refresh)); + } + + Signal::NewGroup => { if self.active != TodoRegion::Explorer { return Ok(None); } diff --git a/src/tui/components/viewport/mod.rs b/src/tui/components/viewport/mod.rs index 523644a..ed1ab05 100644 --- a/src/tui/components/viewport/mod.rs +++ b/src/tui/components/viewport/mod.rs @@ -65,6 +65,11 @@ impl Component for Viewport<'_> { async fn init(&mut self, area: Size) -> color_eyre::Result<()> { self.zk.init(area).await?; self.todo.init(area).await?; + + self.signal_tx.as_mut().unwrap().send(Signal::SwitchTo { + page: Page::default(), + })?; + Ok(()) } diff --git a/src/tui/components/zk/mod.rs b/src/tui/components/zk/mod.rs index e80a67d..6751d02 100644 --- a/src/tui/components/zk/mod.rs +++ b/src/tui/components/zk/mod.rs @@ -7,7 +7,7 @@ use tokio::sync::mpsc::UnboundedSender; use tracing::info; use crate::{ - tui::{Signal, components::Component}, + tui::{Page, Signal, components::Component}, types::{KastenHandle, Zettel}, }; @@ -36,6 +36,8 @@ pub struct Zk<'text> { zettel_list: Option>, zettel_view: Option>, preview: Option>, + + active: bool, } struct Layouts { @@ -97,6 +99,8 @@ impl Zk<'_> { zettel_list: None, zettel_view: None, preview: None, + + active: false, } } @@ -308,17 +312,25 @@ impl Component for Zk<'_> { let zettel_list = self.zettel_list.as_mut().expect("Must be initialized"); let search = self.search.as_mut().expect("Must be initialized"); match signal { + Signal::SwitchTo { page } => { + self.active = page == Page::Zk; + } + Signal::Refresh => { self.refresh().await?; } Signal::MoveDown => { - zettel_list.state.select_next(); - self.update_views_from_zettel_list_selection().await?; + if self.active { + zettel_list.state.select_next(); + self.update_views_from_zettel_list_selection().await?; + } } Signal::MoveUp => { - zettel_list.state.select_previous(); - self.update_views_from_zettel_list_selection().await?; + if self.active { + zettel_list.state.select_previous(); + self.update_views_from_zettel_list_selection().await?; + } } Signal::OpenZettel => { diff --git a/src/types/task.rs b/src/types/task.rs index 4876813..062a566 100644 --- a/src/types/task.rs +++ b/src/types/task.rs @@ -1,7 +1,7 @@ use color_eyre::eyre::{Context, Result, eyre}; use dto::{ - Date, DateTime, GroupEntity, HasOne, IntoActiveModel as _, NanoId, TagEntity, TaskActiveModel, - TaskEntity, TaskModelEx, Time, ZettelEntity, + DateTime, GroupEntity, HasOne, IntoActiveModel as _, NanoId, TagEntity, TaskActiveModel, + TaskEntity, TaskModelEx, ZettelEntity, }; use crate::types::{Group, Kasten, Priority, Zettel, frontmatter};