WIP: menu

This commit is contained in:
2026-01-25 21:37:53 +01:00
parent 250e359fc5
commit 6efcabd32d
14 changed files with 635 additions and 335 deletions

View File

@@ -1,3 +1,5 @@
use std::time::Instant;
use ratatui::layout::{Alignment, Constraint, Layout, Rect};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};
@@ -10,9 +12,9 @@ use crate::model::SourceSpan;
use crate::page::Page;
use crate::state::{Modal, PanelFocus, PatternField, SidePanel};
use crate::views::highlight::{self, highlight_line, highlight_line_with_runtime};
use crate::widgets::{ConfirmModal, ModalFrame, SampleBrowser, TextInputModal};
use crate::widgets::{ConfirmModal, ModalFrame, NavMinimap, NavTile, SampleBrowser, TextInputModal};
use super::{audio_view, doc_view, main_view, patterns_view, title_view};
use super::{audio_view, dict_view, help_view, main_view, patterns_view, title_view};
fn adjust_spans_for_line(spans: &[SourceSpan], line_start: usize, line_len: usize) -> Vec<SourceSpan> {
spans.iter().filter_map(|s| {
@@ -81,7 +83,8 @@ pub fn render(frame: &mut Frame, app: &mut App, link: &LinkState, snapshot: &Seq
Page::Main => main_view::render(frame, app, snapshot, page_area),
Page::Patterns => patterns_view::render(frame, app, snapshot, page_area),
Page::Audio => audio_view::render(frame, app, link, page_area),
Page::Doc => doc_view::render(frame, app, page_area),
Page::Help => help_view::render(frame, app, page_area),
Page::Dict => dict_view::render(frame, app, page_area),
}
if let Some(side_area) = panel_area {
@@ -90,6 +93,24 @@ pub fn render(frame: &mut Frame, app: &mut App, link: &LinkState, snapshot: &Seq
render_footer(frame, app, footer_area);
render_modal(frame, app, snapshot, term);
let show_minimap = app
.ui
.minimap_until
.map(|until| Instant::now() < until)
.unwrap_or(false);
if show_minimap {
let tiles: Vec<NavTile> = Page::ALL
.iter()
.map(|p| {
let (col, row) = p.grid_pos();
NavTile { col, row, name: p.name() }
})
.collect();
let selected = app.page.grid_pos();
NavMinimap::new(&tiles, selected).render_centered(frame, term);
}
}
fn render_side_panel(frame: &mut Frame, app: &App, area: Rect) {
@@ -241,7 +262,8 @@ fn render_footer(frame: &mut Frame, app: &App, area: Rect) {
Page::Main => "[MAIN]",
Page::Patterns => "[PATTERNS]",
Page::Audio => "[AUDIO]",
Page::Doc => "[DOC]",
Page::Help => "[HELP]",
Page::Dict => "[DICT]",
};
let content = if let Some(ref msg) = app.ui.status_message {
@@ -281,12 +303,16 @@ fn render_footer(frame: &mut Frame, app: &App, area: Rect) {
("t", "Test"),
("Space", "Play"),
],
Page::Doc => vec![
Page::Help => vec![
("↑↓", "Scroll"),
("←→", "Category"),
("Tab", "Topic"),
("PgUp/Dn", "Page"),
],
Page::Dict => vec![
("Tab", "Focus"),
("↑↓", "Navigate"),
("PgUp/Dn", "Page"),
],
};
let page_width = page_indicator.chars().count();