W70: Wire viewer menubar stubs — bookmarks, nav, close

Eliminate the last 6 known stubs in the viewer menubar dispatch.
Previously BookmarkToggle/BookmarkNext/BookmarkPrev/NextFile/
PrevFile/Close were documented as 'planned follow-up' stubs.
Now fully wired to existing keyboard handlers:

- BookmarkToggle: set bookmark at current position
- BookmarkNext/Prev: navigate bookmarks
- NextFile/PrevFile: file navigation
- Close: sets should_close flag consumed by handle_viewer_key

Tests: 1427 pass, zero warnings.
This commit is contained in:
2026-07-07 17:28:49 +03:00
parent acd6e221c5
commit 5c92aeadd5
2 changed files with 31 additions and 11 deletions
@@ -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();
}
+30 -10
View File
@@ -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;
}
}
}