···11use async_trait::async_trait;
22-use dto::NanoId;
22+use color_eyre::eyre::Result;
33+use crossterm::event::KeyEvent;
34use ratatui::{
45 Frame,
56 layout::{Constraint, Layout, Rect, Size},
···12131314use crate::{
1415 tui::{Page, Signal, components::Component},
1515- types::{Group, KastenHandle, Priority, Task},
1616+ types::{Group, KastenHandle, Priority, Task, TodoTree},
1617};
17181819mod explorer;
···2425use inspector::Inspector;
25262627pub struct Todo<'text> {
2727- #[expect(dead_code)]
2828 signal_tx: Option<UnboundedSender<Signal>>,
2929 kh: KastenHandle,
3030 layouts: Layouts,
···3636 area: Size,
3737 active: TodoRegion,
3838}
3939+4040+pub const DEFAULT_NAME: &str = "Rename Me!";
39414042/// The different regions inside the `Todo` component
4143#[derive(
···8082 .state
8183 .selected()
8284 .and_then(|idx| task_list.id_list.get(idx));
8383- let kt = self.kh.read().await;
8585+8686+ let mut kt = self.kh.write().await;
8787+8888+ // fuck it we just fully rebuild the tree, how computationally expensive could it even be
8989+ kt.todo_tree = TodoTree::construct(&kt.db).await.expect("Must not error");
9090+8491 let tree = &kt.todo_tree;
85928693 debug!("tree after refresh {tree:#?}");
···162169 };
163170 let tree = &self.kh.read().await.todo_tree.tree;
164171165165- *inspector = tree
166166- .get(selected_node_id)
167167- .expect("Nodeid must be valid")
168168- .data()
169169- .into();
172172+ inspector.inspect(
173173+ tree.get(selected_node_id)
174174+ .expect("Nodeid must be valid")
175175+ .data(),
176176+ );
170177 }
171178}
172179···230237 )
231238 .expect("Node id must be valid");
232239233233- let mut inspector: Inspector<'_> = first.data().into();
240240+ let mut inspector: Inspector<'_> = Inspector::new(self.kh.clone(), first.data());
234241235242 explorer.set_inactive();
236243 inspector.set_inactive();
···239246 self.task_list = Some(task_list);
240247 self.inspector = Some(inspector);
241248249249+ self.inspector
250250+ .as_mut()
251251+ .unwrap()
252252+ .register_signal_handler(self.signal_tx.clone().unwrap())?;
253253+ Ok(())
254254+ }
255255+256256+ fn register_signal_handler(&mut self, tx: UnboundedSender<Signal>) -> Result<()> {
257257+ self.signal_tx = Some(tx);
242258 Ok(())
243259 }
244260···258274 .as_mut()
259275 .expect("This should have already been initialized");
260276277277+ let signal_tx = self
278278+ .signal_tx
279279+ .as_mut()
280280+ .expect("Invariant broken, must exist");
281281+282282+ if let Ok(Some(signal)) = inspector.update(signal.clone()).await {
283283+ signal_tx.send(signal)?;
284284+ }
285285+261286 match signal {
287287+ Signal::Select { nanoid } => {
288288+ let node_id = self
289289+ .kh
290290+ .read()
291291+ .await
292292+ .todo_tree
293293+ .nanoid_to_nodeid
294294+ .get(&nanoid)
295295+ .expect("Invariant broken, why would we ever ask for this")
296296+ .clone();
297297+298298+ let Some(pos) = explorer.id_list.iter().position(|id| node_id == *id) else {
299299+ return Ok(None);
300300+ };
301301+ explorer.state.select(Some(pos));
302302+ self.update_inspector_from_selection().await;
303303+ }
304304+262305 Signal::SwitchTo {
263306 page: Page::Todo(region),
264307 } => {
···283326284327 self.update_inspector_from_selection().await;
285328 }
329329+286330 Signal::MoveDown => {
287331 match self.active {
288332 TodoRegion::TaskList => {
···326370 else {
327371 return Ok(None);
328372 };
329329- let task = Task::new(
330330- NanoId::default().to_string(),
331331- parent,
332332- &mut kt,
333333- None,
334334- Priority::default(),
335335- )
336336- .await?;
373373+ let task =
374374+ Task::new(DEFAULT_NAME, parent, &mut kt, None, Priority::default()).await?;
337375338376 drop(kt);
339377 debug!("created task: {task:#?}");
340340- return Ok(Some(Signal::Refresh));
378378+379379+ signal_tx.send(Signal::Refresh)?;
380380+ signal_tx.send(Signal::Select { nanoid: task.id })?;
381381+ return Ok(Some(Signal::SwitchTo {
382382+ page: Page::Todo(TodoRegion::Inspector),
383383+ }));
341384 }
342385343386 Signal::NewSubGroup => {
···348391 let parent = explorer
349392 .group_of_current_selection(&kt.todo_tree)
350393 .map(|parent| parent.id.clone());
351351- let group = Group::new(NanoId::default().to_string(), parent, &mut kt).await?;
394394+ let group = Group::new(DEFAULT_NAME, parent, &mut kt).await?;
352395 drop(kt);
353396 debug!("Created group: {group:#?}");
354354- return Ok(Some(Signal::Refresh));
397397+398398+ signal_tx.send(Signal::Refresh)?;
399399+ signal_tx.send(Signal::Select { nanoid: group.id })?;
400400+ return Ok(Some(Signal::SwitchTo {
401401+ page: Page::Todo(TodoRegion::Inspector),
402402+ }));
355403 }
356404357405 Signal::NewGroup => {
···360408 }
361409 debug!("Creating Group!");
362410 let mut kt = self.kh.write().await;
363363- let group = Group::new(NanoId::default().to_string(), None, &mut kt).await?;
411411+ let group = Group::new(DEFAULT_NAME, None, &mut kt).await?;
364412 drop(kt);
365413 debug!("Created group: {group:#?}");
366366- return Ok(Some(Signal::Refresh));
414414+415415+ signal_tx.send(Signal::Refresh)?;
416416+ signal_tx.send(Signal::Select { nanoid: group.id })?;
417417+ return Ok(Some(Signal::SwitchTo {
418418+ page: Page::Todo(TodoRegion::Inspector),
419419+ }));
367420 }
368421369422 Signal::Refresh => {
370423 self.refresh().await;
371424 }
425425+372426 _ => {}
373427 }
374428 Ok(None)
429429+ }
430430+431431+ async fn handle_key_event(&mut self, key: KeyEvent) -> color_eyre::Result<Option<Signal>> {
432432+ self.inspector.as_mut().unwrap().handle_key_event(key).await
375433 }
376434377435 fn draw(&mut self, frame: &mut Frame, area: Rect) -> color_eyre::Result<()> {
378436 let explorer = self.explorer.as_mut().unwrap();
379437 let task_list = self.task_list.as_mut().unwrap();
380438439439+ let inspector = self.inspector.as_mut().unwrap();
440440+381441 let splits = self.layouts.split(area);
382442383443 frame.render_stateful_widget(&explorer.render_list, splits.explorer, &mut explorer.state);
···386446 splits.task_list,
387447 &mut task_list.state,
388448 );
389389- frame.render_widget(self.inspector.as_ref().unwrap(), splits.inspector);
449449+450450+ inspector.draw(frame, splits.inspector)?;
451451+390452 Ok(())
391453 }
392454}
+1-1
src/tui/components/todo/tasklist.rs
···2222 let render_list = List::new(
2323 tree.tree
2424 .traverse_pre_order(scope)
2525- .expect("nthis should not panic as the node id should exist inside")
2525+ .expect("This should not panic as the node id should exist inside")
2626 .zip(
2727 tree.tree
2828 .traverse_pre_order_ids(scope)
+17
src/tui/signal.rs
···11use std::path::PathBuf;
2233+use dto::NanoId;
34use strum::Display;
4556use serde::{Deserialize, Serialize};
···6970 /// Only works with the inspector
7071 EditName,
71727373+ /// Edit the `Priority` of a `Task` or a `Group`.
7474+ /// Only works with the inspector
7575+ EditPriority,
7676+7777+ /// Internal Signal that tells the app to resume interpreting keys
7878+ ExitRawText,
7979+8080+ /// Internal Signal that tells the app to stop interpreting keys
8181+ /// as signals
8282+ EnterRawText,
8383+7284 /// this is fucking temporary
7385 Helix {
7486 path: PathBuf,
8787+ },
8888+8989+ /// Requests the `Explorer` to select the following `NanoId`.
9090+ Select {
9191+ nanoid: NanoId,
7592 },
7693}
7794