fix(sidebar): keep worktree groups packed

This commit is contained in:
Ogulcan Celik 2026-07-31 15:40:20 +03:00
parent b4112743cf
commit 7db744ab47
2 changed files with 9 additions and 16 deletions

View File

@ -702,7 +702,7 @@
"key": "ui.sidebar.spaces.row_gap",
"type": "integer",
"default": "0",
"description": "Blank terminal rows between expanded Space sidebar entries. Set to 1 to restore the previous spacing. Consecutive indented worktree children remain packed as one group."
"description": "Blank terminal rows between worktree groups and unrelated top-level Spaces. Worktree parents and their indented children remain packed."
},
{
"key": "ui.sidebar.spaces.rows",

View File

@ -230,15 +230,8 @@ fn workspace_row_height_in_body(
workspace_row_height(app, workspace, indented).min(body_height)
}
fn workspace_entry_gap(
app: &AppState,
entries: &[WorkspaceListEntry],
entry_idx: usize,
indented: bool,
) -> u16 {
if entry_idx + 1 < entries.len()
&& !(indented && next_entry_is_indented_workspace(entries, entry_idx))
{
fn workspace_entry_gap(app: &AppState, entries: &[WorkspaceListEntry], entry_idx: usize) -> u16 {
if entry_idx + 1 < entries.len() && !next_entry_is_indented_workspace(entries, entry_idx) {
app.sidebar_spaces.row_gap
} else {
0
@ -476,7 +469,7 @@ fn workspace_list_visible_count(app: &AppState, area: Rect, scroll: usize) -> us
};
(
workspace_row_height_in_body(app, ws, *indented, body.height),
workspace_entry_gap(app, &entries, entry_idx, *indented),
workspace_entry_gap(app, &entries, entry_idx),
)
}
};
@ -500,7 +493,7 @@ fn workspace_list_bottom_start(app: &AppState, area: Rect) -> usize {
let Some(workspace) = app.workspaces.get(*ws_idx) else {
continue;
};
let gap = workspace_entry_gap(app, &entries, entry_idx, *indented);
let gap = workspace_entry_gap(app, &entries, entry_idx);
let needed = workspace_row_height_in_body(app, workspace, *indented, body.height)
.saturating_add(gap);
if used_rows.saturating_add(needed) > body.height {
@ -691,7 +684,7 @@ pub(crate) fn compute_workspace_list_areas(
continue;
};
let row_height = workspace_row_height_in_body(app, ws, *indented, body.height);
let gap = workspace_entry_gap(app, &entries, entry_idx, *indented);
let gap = workspace_entry_gap(app, &entries, entry_idx);
if row_y.saturating_add(row_height) > body_bottom {
break;
}
@ -2488,7 +2481,7 @@ rows = [[{ token = "git_status", fg = "#123456" }]]
assert!(!cards[0].indented);
assert_eq!(cards[1].ws_idx, 1);
assert!(cards[1].indented);
assert_eq!(cards[1].rect.y, cards[0].rect.y + cards[0].rect.height + 1);
assert_eq!(cards[1].rect.y, cards[0].rect.y + cards[0].rect.height);
}
#[test]
@ -2506,7 +2499,7 @@ rows = [[{ token = "git_status", fg = "#123456" }]]
let (spacious, _) = compute_workspace_list_areas(&app, Rect::new(0, 0, 30, 30));
assert_eq!(
spacious[1].rect.y,
spacious[0].rect.y + spacious[0].rect.height + 2
spacious[0].rect.y + spacious[0].rect.height
);
assert_eq!(
spacious[2].rect.y,
@ -2517,7 +2510,7 @@ rows = [[{ token = "git_status", fg = "#123456" }]]
spacious[2].rect.y + spacious[2].rect.height + 2
);
let spacious_metrics = workspace_list_scroll_metrics(&app, Rect::new(0, 0, 30, 7));
assert_eq!(spacious_metrics.viewport_rows, 2);
assert_eq!(spacious_metrics.viewport_rows, 3);
assert_eq!(spacious_metrics.max_offset_from_bottom, 2);
app.sidebar_spaces.row_gap = 0;