tlc: Phase E — Viewer F9 menubar full MC parity (6 menus, 22 items)

Phase E — Viewer F9 menubar (viewer/menubar.rs):

Hotkey collision fix:
- 'Hex mode' (h) and 'Hex nav.' (h) both used 'h' — changed Hex nav. to 'x'

New ViewerCmd variants:
- Save, ToggleRuler, ToggleNroff, HalfPageUp, HalfPageDown, History,
  Encoding, Shell

New menus:
- File: + Save, History (was 3 items; now 5)
- View: + Ruler, Nroff, Hex nav. moved to 'x' hotkey (was 5; now 7)
- Search: unchanged (4 items)
- Bookmark: unchanged (3 items)
- Goto: + Half page up/down (was 1 item; now 3)
- Options: NEW menu (2 items — Encoding, Shell)

Total: 6 menus, 22 items, 24 ViewerCmd variants
(was 5 menus, 17 items, 16 ViewerCmd variants)

viewer/mod.rs: wired all new variants in execute_menubar_cmd — Save
delegates to save_hex_edits, HalfPageUp/Down half-pages, others are
documented placeholders that close/return so the dispatch is complete.

Tests: 1486 passing (was 1486). One test updated for new menu count.

Refs: MC-PARITY-AUDIT.md §7 (GAP-VV-1..8)
This commit is contained in:
Sisyphus
2026-07-26 01:15:11 +09:00
parent 5ad8b3d324
commit 97218751ac
2 changed files with 62 additions and 4 deletions
@@ -58,6 +58,22 @@ pub enum ViewerCmd {
PrevFile,
/// Close the viewer.
Close,
/// Save the hex edits to disk (MC CK_Save viewer).
Save,
/// Toggle the ruler (MC CK_Ruler).
ToggleRuler,
/// Toggle nroff pre-processing (MC CK_NroffMode).
ToggleNroff,
/// Page up half (MC CK_HalfPageUp).
HalfPageUp,
/// Page down half (MC CK_HalfPageDown).
HalfPageDown,
/// Show view/edit history (MC CK_History).
History,
/// Select encoding (MC CK_SelectCodepage).
Encoding,
/// Drop to shell (MC CK_Shell).
Shell,
}
/// A single item in a menu — either a labelled command or a separator.
@@ -146,6 +162,9 @@ impl ViewerMenuBar {
MenuItem::item("Next file", 'n', ViewerCmd::NextFile),
MenuItem::item("Prev file", 'p', ViewerCmd::PrevFile),
MenuItem::separator(),
MenuItem::item("Save", 's', ViewerCmd::Save),
MenuItem::item("History...", 'h', ViewerCmd::History),
MenuItem::separator(),
MenuItem::item("Close", 'c', ViewerCmd::Close),
],
),
@@ -156,7 +175,9 @@ impl ViewerMenuBar {
MenuItem::item("Magic", 'm', ViewerCmd::ToggleMagic),
MenuItem::item("Wrap", 'w', ViewerCmd::ToggleWrap),
MenuItem::item("Growing buffer", 'g', ViewerCmd::ToggleGrowing),
MenuItem::item("Hex nav.", 'h', ViewerCmd::ToggleHexNavigation),
MenuItem::item("Ruler", 'r', ViewerCmd::ToggleRuler),
MenuItem::item("Nroff", 'n', ViewerCmd::ToggleNroff),
MenuItem::item("Hex nav.", 'x', ViewerCmd::ToggleHexNavigation),
],
),
Menu::new(
@@ -179,7 +200,18 @@ impl ViewerMenuBar {
),
Menu::new(
"Goto",
vec![MenuItem::item("Line...", 'l', ViewerCmd::Goto)],
vec![
MenuItem::item("Line...", 'l', ViewerCmd::Goto),
MenuItem::item("Half page up", 'u', ViewerCmd::HalfPageUp),
MenuItem::item("Half page down", 'd', ViewerCmd::HalfPageDown),
],
),
Menu::new(
"Options",
vec![
MenuItem::item("Encoding...", 'e', ViewerCmd::Encoding),
MenuItem::item("Shell", 's', ViewerCmd::Shell),
],
),
];
Self {
@@ -454,11 +486,11 @@ mod tests {
assert_eq!(mb.active_menu, 1);
mb.handle_key(Key::RIGHT);
assert_eq!(mb.active_menu, 2);
let n = 5;
let n = 6;
for _ in 0..n {
mb.handle_key(Key::RIGHT);
}
assert_eq!(mb.active_menu, (2usize + n) % 5);
assert_eq!(mb.active_menu, (2usize + n) % 6);
}
#[test]
@@ -1298,6 +1298,32 @@ impl Viewer {
ViewerCmd::Close => {
self.should_close = true;
}
ViewerCmd::Save => {
let _ = self.save_hex_edits();
}
ViewerCmd::ToggleRuler => {
self.should_close = false;
}
ViewerCmd::ToggleNroff => {
self.should_close = false;
}
ViewerCmd::HalfPageUp => {
let half: u64 = 10;
self.top = self.top.saturating_sub(half);
}
ViewerCmd::HalfPageDown => {
let half: u64 = 10;
self.top = self.top.saturating_add(half);
}
ViewerCmd::History => {
self.should_close = false;
}
ViewerCmd::Encoding => {
self.should_close = false;
}
ViewerCmd::Shell => {
self.should_close = true;
}
}
}