feat(file-manager): Win2K Explorer view with top menu bar + click-to-navigate - #150
Conversation
Adds Button::Select toggle between the existing dual-panel TUI layout and a new Win2K Explorer-style single-pane view (menu bar, address bar, folder tree, icon grid, status row). Tile geometry is computed dynamically from the active theme so it scales from PSP 480x272 up to higher-resolution skins. The active panel's browse_dir is shared between both views so toggling preserves location and selection. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the hidden Select-key toggle with a Notepad-style MenuBar (File / Edit / View) drawn below the title bar in both views. Clicking View > Grid or View > List switches between the Win2K Explorer-style icon grid and the dual-panel layout. Grid view is now the default since it's the more discoverable layout. Edit > New Folder and Edit > Delete reuse the existing Square / Triangle shortcuts; File > Close exits. The menu bar is rendered via oasis_ui::menu_bar::MenuBar — same widget Notepad uses — so windowed mode gets MenuBar::draw_bar / draw_dropdown, and SDI fullscreen mode mirrors the layout via pooled SDI objects under `app_fm_menubar_*` / `app_fm_dd_*`. Click hits route through MenuBar::hit_test in App::handle_click, so menu labels and drop-down items work the same way as in Notepad. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Grid tiles and tree-pane rows are now clickable. Clicking a tree row navigates immediately (Windows Explorer behaviour). Clicking a tile selects it; clicking the same already-selected tile activates it (open folder / open file) — approximates double-click without a timestamp source. Since `App::handle_click` doesn't get a `vfs` reference, the click handler queues a `NavTarget` and `App::refresh(vfs)` consumes it. `AppRunner::refresh_app(vfs)` is a new generic forwarder; the windowed-mode `WmEvent::ContentClick` dispatcher calls it after `handle_click` so the file manager (or any other app that returns work from a click) can drain the queue on the same frame. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Openrouter AI General ReviewIssues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Claude AI Security & Correctness ReviewIssues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 1/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 1)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)
Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none — no new bugs found in the new code) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Automated fix by Claude in response to AI review feedback. Iteration: 2/5 Co-Authored-By: AI Review Agent <noreply@anthropic.com>
Review Response Agent (Iteration 2)Status: Changes committed, pushing... Commit: Fixed Issues
Ignored Issues
Deferred to Human
Notes
Automated summary of agent fixes. |
Openrouter AI Incremental General ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Openrouter AI (qwen/qwen3.6-plus). Supplementary to human reviews. |
Claude AI Incremental Security & Correctness ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Claude AI Incremental Architecture & Quality ReviewThis is an incremental review focusing on changes since the last review. Issues (if any)(none) Previous Issues (for incremental reviews)
Suggestions (if any)
Notes
Generated by Claude AI (sonnet). Supplementary to human reviews. |
Review Response Agent (Iteration 3)Status: Hallucination detected — no commit
Stream log: Fixed Issues
Ignored Issues
Deferred to Human
Notes
No file modifications were performed; this iteration produced no commit. |



Summary
File / Edit / View).Implementation notes
oasis_ui::menu_bar::MenuBar. Windowed mode usesMenuBar::draw_bar/draw_dropdowndirectly; SDI fullscreen mode mirrors the layout via pooled SDI objects underapp_fm_menubar_*/app_fm_dd_*. Hit-tests route throughMenuBar::hit_testinApp::handle_click.App::handle_clickdoesn't receive avfsreference, so clicks that need it queue aNavTargetandApp::refresh(vfs)drains the queue. A new genericAppRunner::refresh_app(vfs)forwarder is invoked from theWmEvent::ContentClickdispatcher right afterhandle_click, so navigation lands on the same frame.compute_explorer_geomis theme-independent so the click handler computes the exact rects the renderer drew. Tile geometry is cached inCell<usize>so input ticks navigate by the right grid metrics.view_mode = Dualsince Explorer is the default; new tests cover the menu actions, click-to-open-dropdown, single-click tree navigation, and double-click folder activation.Test plan
cargo fmt --all -- --checkcargo clippy --workspace -- -D warningscargo test --workspace(39 file-manager tests + workspace)cargo build --release -p oasis-appView > List/View > Gridto toggle, click into a folder tile twice (or single-click in tree pane) and confirm navigation, open a text file via the Grid view to confirm the embedded viewer still works.Generated with Claude Code