diff --git a/core/src/state/notebook.rs b/core/src/state/notebook.rs index 96b2c91..7c9b6e2 100644 --- a/core/src/state/notebook.rs +++ b/core/src/state/notebook.rs @@ -127,7 +127,7 @@ impl NotebookState { vec![ "[Esc] Menu", "[L] Toggle", - "[H] Close", + "[H] Close parent directory", "[J] Select next", "[K] Select previous", "[M] More actions", @@ -197,24 +197,41 @@ pub async fn consume(glues: &mut Glues, event: Event) -> Result { - let directory_id = &state.get_selected_directory()?.id; - let directory_item = state.root.find(directory_id).ok_or(Error::Wip( - "[Key::L] failed to find parent directory".to_owned(), + let directory = state.get_selected_directory()?.clone(); + let directory_item = state.root.find(&directory.id).ok_or(Error::Wip( + "[Key::L] failed to find the target directory".to_owned(), ))?; if directory_item.children.is_none() { - directory::open(db, state, directory_id.clone()).await + directory::open(db, state, directory.id.clone()).await } else { - directory::close(state, directory_id.clone()) + directory::close(state, directory) } } (Notebook(CloseDirectory(directory_id)), DirectorySelected | NoteSelected) => { - directory::close(state, directory_id) + let directory = state + .root + .find(&directory_id) + .ok_or(Error::Wip( + "[CloseDirectory] failed to find target directory".to_owned(), + ))? + .directory + .clone(); + + directory::close(state, directory) } (Key(KeyEvent::H) | Key(KeyEvent::Left), DirectorySelected) => { - let directory_id = state.get_selected_directory()?.id.clone(); + let directory = state.get_selected_directory()?; + if state.root.directory.id == directory.id { + return Ok(NotebookTransition::None); + } + + let parent_item = state.root.find(&directory.parent_id).ok_or(Error::Wip( + "[Key::H] failed to find parent directory".to_owned(), + ))?; + let parent = parent_item.directory.clone(); - directory::close(state, directory_id) + directory::close(state, parent) } (Key(KeyEvent::H) | Key(KeyEvent::Left), NoteSelected) => { let directory_id = &state.get_selected_note()?.directory_id; @@ -223,7 +240,7 @@ pub async fn consume(glues: &mut Glues, event: Event) -> Result traverse::select_next(state), (Key(KeyEvent::K), DirectorySelected | NoteSelected) => traverse::select_prev(state), diff --git a/core/src/state/notebook/consume/directory.rs b/core/src/state/notebook/consume/directory.rs index 9274128..85426d2 100644 --- a/core/src/state/notebook/consume/directory.rs +++ b/core/src/state/notebook/consume/directory.rs @@ -41,34 +41,22 @@ pub async fn open( }) } -pub fn close(state: &mut NotebookState, directory_id: DirectoryId) -> Result { +pub fn close(state: &mut NotebookState, directory: Directory) -> Result { state .root - .find_mut(&directory_id) - .ok_or(Error::Wip("todo: asdfasdf".to_owned()))? + .find_mut(&directory.id) + .ok_or(Error::Wip(format!( + "[directory::close] failed to find directory '{}'", + directory.name + )))? .children = None; - Ok(NotebookTransition::CloseDirectory { - directory_id: directory_id.clone(), - by_note: false, - }) -} - -pub fn close_by_note( - state: &mut NotebookState, - directory: Directory, -) -> Result { - close(state, directory.id.clone())?; - let directory_id = directory.id.clone(); state.selected = SelectedItem::Directory(directory); state.inner_state = InnerState::DirectorySelected; - Ok(NotebookTransition::CloseDirectory { - directory_id, - by_note: true, - }) + Ok(NotebookTransition::CloseDirectory(directory_id)) } pub fn show_actions_dialog( diff --git a/core/src/transition.rs b/core/src/transition.rs index 2a35aea..fa07c10 100644 --- a/core/src/transition.rs +++ b/core/src/transition.rs @@ -37,10 +37,7 @@ pub enum NotebookTransition { notes: Vec, directories: Vec, }, - CloseDirectory { - directory_id: DirectoryId, - by_note: bool, - }, + CloseDirectory(DirectoryId), RenameNote(Note), RenameDirectory(Directory), diff --git a/tui/src/transitions.rs b/tui/src/transitions.rs index 4d7d3f8..76948ba 100644 --- a/tui/src/transitions.rs +++ b/tui/src/transitions.rs @@ -89,10 +89,7 @@ fn handle_notebook_transition(siv: &mut Cursive, transition: NotebookTransition) } => { open_directory(siv, id, notes, directories); } - NotebookTransition::CloseDirectory { - directory_id, - by_note, - } => close_directory(siv, directory_id, by_note), + NotebookTransition::CloseDirectory(directory_id) => close_directory(siv, directory_id), NotebookTransition::OpenNote { note, content } => { open_note(siv, note, content); } diff --git a/tui/src/transitions/notebook/close_directory.rs b/tui/src/transitions/notebook/close_directory.rs index 1dc9fcf..d73cc33 100644 --- a/tui/src/transitions/notebook/close_directory.rs +++ b/tui/src/transitions/notebook/close_directory.rs @@ -4,7 +4,7 @@ use { glues_core::types::DirectoryId, }; -pub fn close_directory(siv: &mut Cursive, directory_id: DirectoryId, by_note: bool) { +pub fn close_directory(siv: &mut Cursive, directory_id: DirectoryId) { let directory_node = Node::notebook().note_tree().directory(&directory_id); directory_node.caret().find(siv).set_content("▸ "); @@ -14,13 +14,11 @@ pub fn close_directory(siv: &mut Cursive, directory_id: DirectoryId, by_note: bo container.remove_child(1); } - if by_note { - siv.focus_on_next_tick( - Node::notebook() - .note_tree() - .directory(&directory_id) - .name_button() - .name(), - ); - } + siv.focus_on_next_tick( + Node::notebook() + .note_tree() + .directory(&directory_id) + .name_button() + .name(), + ); }