diff --git a/local/recipes/tui/tlc/source/src/filemanager/mod.rs b/local/recipes/tui/tlc/source/src/filemanager/mod.rs index 05b2e6dd0a..9f7b0be2d0 100644 --- a/local/recipes/tui/tlc/source/src/filemanager/mod.rs +++ b/local/recipes/tui/tlc/source/src/filemanager/mod.rs @@ -710,7 +710,7 @@ impl FileManager { /// viewer was closed. pub fn handle_viewer_key(&mut self, key: Key) -> bool { if let Some(v) = &mut self.viewer { - let closed = v.handle_key(key); + let closed = v.handle_key(key) || v.should_close; if closed { v.save_cursor_position(); } diff --git a/local/recipes/tui/tlc/source/src/viewer/mod.rs b/local/recipes/tui/tlc/source/src/viewer/mod.rs index b82ce61ab8..82c434a325 100644 --- a/local/recipes/tui/tlc/source/src/viewer/mod.rs +++ b/local/recipes/tui/tlc/source/src/viewer/mod.rs @@ -117,6 +117,8 @@ pub struct Viewer { pub nroff_enabled: bool, /// Whether to show the F1 help overlay. pub show_help: bool, + /// Set by ViewerCmd::Close — the caller should close the viewer. + pub should_close: bool, /// Active modal prompt at the bottom of the viewer (`None` = /// no prompt open). Drives the prompt's title and Enter /// handler. @@ -198,6 +200,7 @@ impl Viewer { hexview_in_text: false, nroff_enabled: false, show_help: false, + should_close: false, prompt: None, prompt_input: String::new(), loading: size >= crate::viewer::source::INLINE_THRESHOLD, @@ -246,6 +249,7 @@ impl Viewer { hexview_in_text: false, nroff_enabled: false, show_help: false, + should_close: false, prompt: None, prompt_input: String::new(), loading: size >= crate::viewer::source::INLINE_THRESHOLD, @@ -1250,16 +1254,32 @@ impl Viewer { self.prompt = Some(ViewerPrompt::GotoLine); self.prompt_input.clear(); } - ViewerCmd::BookmarkToggle - | ViewerCmd::BookmarkNext - | ViewerCmd::BookmarkPrev - | ViewerCmd::NextFile - | ViewerCmd::PrevFile - | ViewerCmd::Close => { - // Bookmark / file navigation / close are not yet - // wired to menubar commands. They are still reachable - // via their keyboard shortcuts. This is a planned - // follow-up. + ViewerCmd::BookmarkToggle => { + self.marks[self.marker] = Some(self.top); + self.marker = (self.marker + 1) % 10; + } + ViewerCmd::BookmarkNext => { + self.marker = (self.marker + 1) % 10; + if let Some(pos) = self.marks[self.marker] { + self.top = pos; + self.sync_cursor_to_top(); + } + } + ViewerCmd::BookmarkPrev => { + let slot = self.marker.checked_sub(1).unwrap_or(9); + if let Some(pos) = self.marks[slot] { + self.top = pos; + self.sync_cursor_to_top(); + } + } + ViewerCmd::NextFile => { + let _ = self.open_next(); + } + ViewerCmd::PrevFile => { + let _ = self.open_prev(); + } + ViewerCmd::Close => { + self.should_close = true; } } }