From aee654578408c7fbdb1640d2dca8eaea4ec1754e Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Mon, 30 Mar 2026 01:05:55 +0300 Subject: feat: add manual sidebar resizing --- src/ui.rs | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'src/ui.rs') diff --git a/src/ui.rs b/src/ui.rs index 2b5b8a4a..5e58159a 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -13,8 +13,8 @@ use crate::detect::AgentState; use crate::layout::PaneInfo; const COLLAPSED_WIDTH: u16 = 4; // num + space + dot + separator -const MIN_SIDEBAR_WIDTH: u16 = 18; -const MAX_SIDEBAR_WIDTH: u16 = 36; +pub(crate) const MIN_SIDEBAR_WIDTH: u16 = 18; +pub(crate) const MAX_SIDEBAR_WIDTH: u16 = 36; // Braille spinner frames — smooth rotation const SPINNERS: &[&str] = &["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]; @@ -32,8 +32,11 @@ use crate::app::state::Palette; pub fn compute_view(app: &mut AppState, area: Rect) { let sidebar_w = if app.sidebar_collapsed { COLLAPSED_WIDTH - } else { + } else if app.sidebar_width_auto { compute_sidebar_width(app) + } else { + app.sidebar_width + .clamp(MIN_SIDEBAR_WIDTH, MAX_SIDEBAR_WIDTH) }; let [sidebar_area, main_area] = @@ -159,7 +162,9 @@ fn compute_pane_infos(app: &AppState, area: Rect) -> Vec { /// Auto-scale sidebar width based on workspace identity + agent summary. fn compute_sidebar_width(app: &AppState) -> u16 { if app.workspaces.is_empty() { - return app.sidebar_width; + return app + .sidebar_width + .clamp(MIN_SIDEBAR_WIDTH, MAX_SIDEBAR_WIDTH); } let max_line = app .workspaces @@ -570,11 +575,11 @@ fn render_sidebar_toggle(frame: &mut Frame, area: Rect, collapsed: bool, p: &Pal fn render_panes(app: &AppState, frame: &mut Frame, area: Rect) { let Some(ws_idx) = app.active else { - render_empty(frame, area, &app.palette); + render_empty(app, frame, area); return; }; let Some(ws) = app.workspaces.get(ws_idx) else { - render_empty(frame, area, &app.palette); + render_empty(app, frame, area); return; }; @@ -690,19 +695,29 @@ fn render_selection_highlight( } } -fn render_empty(frame: &mut Frame, area: Rect, p: &Palette) { +fn render_empty(app: &AppState, frame: &mut Frame, area: Rect) { + let p = &app.palette; let lines = vec![ Line::from(""), Line::from(""), Line::from(Span::styled( - " No active workspace", + " No workspaces yet", Style::default().fg(p.overlay0), )), Line::from(""), + Line::from(Span::styled( + " A workspace is one project context.", + Style::default().fg(p.overlay1), + )), + Line::from(Span::styled( + " Its root pane (top-left) sets the default repo or folder name.", + Style::default().fg(p.overlay1), + )), + Line::from(""), Line::from(vec![ Span::styled(" Press ", Style::default().fg(p.overlay0)), Span::styled( - "new", + format!("{}", app.keybinds.new_workspace_label), Style::default().fg(p.accent).add_modifier(Modifier::BOLD), ), Span::styled(" to create one", Style::default().fg(p.overlay0)), -- cgit v1.2.3