aboutsummaryrefslogtreecommitdiff
path: root/src/ui.rs
diff options
context:
space:
mode:
authorCHIH,GODLEE <61595521+ChihGodlee@users.noreply.github.com>2026-05-18 20:27:43 +0800
committerGitHub <noreply@github.com>2026-05-18 15:27:43 +0300
commit3189ede2b9225b1b930cc43368248c6b4f3a4daf (patch)
tree24252debe6f388edfe0e621462f1bf38d5b46b20 /src/ui.rs
parentc9eb7520e66c2a941c020e96e8242de66847f29d (diff)
feat: configure sidebar min/max width via [ui] (#135)
* feat: configure sidebar min/max width via [ui] Expose the previously hardcoded MIN_SIDEBAR_WIDTH / MAX_SIDEBAR_WIDTH clamps as [ui] sidebar_min_width / sidebar_max_width. Defaults remain 18 / 36 so existing configs are unchanged. Hot-reload is wired through the existing [ui] block; reload re-clamps the live width to the new bounds so tightening takes effect immediately. Reject inverted bounds (min > max) at every entry point so a bad config can never reach u16::clamp(min, max), which panics: App::new falls back to defaults, and apply_live_config treats the whole [ui] section as invalid and returns a partial reload report. refs #132 * test: keep sidebar reload width within bounds refs #132 --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
Diffstat (limited to 'src/ui.rs')
-rw-r--r--src/ui.rs34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/ui.rs b/src/ui.rs
index a92eb1fe..846979da 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -71,8 +71,6 @@ use crate::app::state::ViewLayout;
use crate::app::{AppState, Mode};
const COLLAPSED_WIDTH: u16 = 4; // num + space + dot + separator
-pub(crate) const MIN_SIDEBAR_WIDTH: u16 = 18;
-pub(crate) const MAX_SIDEBAR_WIDTH: u16 = 36;
// Braille spinner frames — smooth rotation
const SPINNERS: &[&str] = &["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
@@ -147,7 +145,7 @@ fn compute_view_internal(
COLLAPSED_WIDTH
} else {
app.sidebar_width
- .clamp(MIN_SIDEBAR_WIDTH, MAX_SIDEBAR_WIDTH)
+ .clamp(app.sidebar_min_width, app.sidebar_max_width)
};
let [sidebar_area, main_area] =
@@ -451,6 +449,36 @@ mod tests {
}
#[test]
+ fn compute_view_clamps_sidebar_width_to_configured_max() {
+ let mut app = crate::app::state::AppState::test_new();
+ app.workspaces = vec![Workspace::test_new("one")];
+ app.active = Some(0);
+ app.selected = 0;
+ app.mode = Mode::Terminal;
+ app.sidebar_max_width = 30;
+ app.sidebar_width = 999;
+
+ compute_view(&mut app, Rect::new(0, 0, 100, 20));
+
+ assert_eq!(app.view.sidebar_rect.width, 30);
+ }
+
+ #[test]
+ fn compute_view_clamps_sidebar_width_to_configured_min() {
+ let mut app = crate::app::state::AppState::test_new();
+ app.workspaces = vec![Workspace::test_new("one")];
+ app.active = Some(0);
+ app.selected = 0;
+ app.mode = Mode::Terminal;
+ app.sidebar_min_width = 22;
+ app.sidebar_width = 5;
+
+ compute_view(&mut app, Rect::new(0, 0, 100, 20));
+
+ assert_eq!(app.view.sidebar_rect.width, 22);
+ }
+
+ #[test]
fn collapsed_sidebar_keeps_active_workspace_highlight_in_terminal_mode() {
let mut app = crate::app::state::AppState::test_new();
app.sidebar_collapsed = true;