Feat: begin sample explorer overhaul
All checks were successful
Deploy Website / deploy (push) Has been skipped

This commit is contained in:
2026-03-05 00:42:39 +01:00
parent 2c8a6794a3
commit 4743c33916
5 changed files with 143 additions and 28 deletions

View File

@@ -211,6 +211,21 @@ fn handle_scroll(ctx: &mut InputContext, col: u16, row: u16, term: Rect, up: boo
return;
}
// Scroll over side panel area
if ctx.app.panel.visible && ctx.app.panel.side.is_some() {
let (_main_area, side_area) = panel_split(body);
if contains(side_area, col, row) {
if let Some(crate::state::SidePanel::SampleBrowser(state)) = &mut ctx.app.panel.side {
if up {
state.move_up();
} else {
state.move_down();
}
}
return;
}
}
match ctx.app.page {
Page::Main => {
if up {
@@ -356,25 +371,60 @@ fn handle_footer_click(ctx: &mut InputContext, col: u16, row: u16, footer: Rect)
// --- Body ---
fn handle_body_click(ctx: &mut InputContext, col: u16, row: u16, body: Rect, kind: ClickKind) {
// Account for side panel splitting
let page_area = if ctx.app.panel.visible && ctx.app.panel.side.is_some() {
if body.width >= 120 {
let panel_width = body.width * 35 / 100;
let [main, _side] =
Layout::horizontal([Constraint::Fill(1), Constraint::Length(panel_width)])
.areas(body);
main
} else {
let panel_height = body.height * 40 / 100;
let [main, _side] =
Layout::vertical([Constraint::Fill(1), Constraint::Length(panel_height)])
.areas(body);
main
}
fn panel_split(body: Rect) -> (Rect, Rect) {
if body.width >= 120 {
let panel_width = body.width * 35 / 100;
let [main, side] =
Layout::horizontal([Constraint::Fill(1), Constraint::Length(panel_width)])
.areas(body);
(main, side)
} else {
body
};
let panel_height = body.height * 40 / 100;
let [main, side] =
Layout::vertical([Constraint::Fill(1), Constraint::Length(panel_height)])
.areas(body);
(main, side)
}
}
fn handle_body_click(ctx: &mut InputContext, col: u16, row: u16, body: Rect, kind: ClickKind) {
use crate::state::PanelFocus;
if ctx.app.panel.visible && ctx.app.panel.side.is_some() {
let (main_area, side_area) = panel_split(body);
if contains(side_area, col, row) {
ctx.app.panel.focus = PanelFocus::Side;
return;
}
// Click on main area: defocus panel
if contains(main_area, col, row) {
if kind == ClickKind::Double {
ctx.dispatch(AppCommand::ClosePanel);
} else {
ctx.app.panel.focus = PanelFocus::Main;
}
}
// Fall through to page-specific handler with main_area
if !contains(main_area, col, row) {
return;
}
match ctx.app.page {
Page::Main => handle_main_click(ctx, col, row, main_area, kind),
Page::Patterns => handle_patterns_click(ctx, col, row, main_area, kind),
Page::Help => handle_help_click(ctx, col, row, main_area),
Page::Dict => handle_dict_click(ctx, col, row, main_area),
Page::Options => handle_options_click(ctx, col, row, main_area),
Page::Engine => handle_engine_click(ctx, col, row, main_area, kind),
Page::Script => handle_script_click(ctx, col, row, main_area),
}
return;
}
let page_area = body;
if !contains(page_area, col, row) {
return;