diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-17 03:42:43 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-17 03:42:43 +0300 |
| commit | 510f56e1ce3f671a6a2457032a44188997ef0764 (patch) | |
| tree | afc117177aa1969de598d4746012a558ad8a83cf /src | |
| parent | c115dbd0510200371dc033c208c0c3c09131c797 (diff) | |
fix: show border around zoomed multi-pane tabs
refs #115
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/panes.rs | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/src/ui/panes.rs b/src/ui/panes.rs index e149362c..971901bd 100644 --- a/src/ui/panes.rs +++ b/src/ui/panes.rs @@ -55,6 +55,14 @@ fn stable_terminal_inner_rect(pane_inner: Rect) -> Rect { ) } +fn pane_inner_rect(area: Rect, framed: bool) -> Rect { + if framed { + Block::default().borders(Borders::ALL).inner(area) + } else { + area + } +} + fn runtime_for_tab_pane<'a>( app: &'a AppState, tab: &'a crate::workspace::Tab, @@ -101,7 +109,8 @@ pub(super) fn resize_tab_panes( if tab.zoomed { let focused_id = tab.layout.focused(); if let Some((terminal_id, rt)) = runtime_for_tab_pane(app, tab, focused_id) { - let inner_rect = stable_terminal_inner_rect(area); + let pane_inner = pane_inner_rect(area, multi_pane); + let inner_rect = stable_terminal_inner_rect(pane_inner); if !app.direct_attach_resize_locks.contains(terminal_id) { rt.resize( inner_rect.height, @@ -154,10 +163,11 @@ pub(super) fn compute_pane_infos( if ws.zoomed { let focused_id = ws.layout.focused(); - let mut inner_rect = area; + let pane_inner = pane_inner_rect(area, multi_pane); + let mut inner_rect = pane_inner; let mut scrollbar_rect = None; if let Some(rt) = app.runtime_for_pane_in_workspace(ws_idx, focused_id) { - (inner_rect, scrollbar_rect) = stable_scrollbar_gutter(rt, area); + (inner_rect, scrollbar_rect) = stable_scrollbar_gutter(rt, pane_inner); if resize_panes && ws.terminal_id(focused_id).is_some_and(|terminal_id| { !app.direct_attach_resize_locks.contains(terminal_id) @@ -459,6 +469,34 @@ mod tests { } #[tokio::test] + async fn zoomed_multi_pane_keeps_border_space() { + let mut app = AppState::test_new(); + let mut workspace = Workspace::test_new("test"); + let focused_pane = workspace.test_split(ratatui::layout::Direction::Horizontal); + workspace.zoomed = true; + workspace.tabs[0].runtimes.insert( + focused_pane, + TerminalRuntime::test_with_scrollback_bytes(40, 8, 1024, b"ready\n"), + ); + app.workspaces = vec![workspace]; + app.active = Some(0); + + let area = Rect::new(10, 3, 40, 8); + let infos = compute_pane_infos( + &app, + area, + false, + crate::kitty_graphics::HostCellSize::default(), + ); + let info = &infos[0]; + + assert_eq!(info.id, focused_pane); + assert_eq!(info.rect, area); + assert_eq!(info.scrollbar_rect, None); + assert_eq!(info.inner_rect, Rect::new(11, 4, 37, 6)); + } + + #[tokio::test] async fn tiny_pane_does_not_reserve_scrollbar_gutter() { let mut app = AppState::test_new(); let mut workspace = Workspace::test_new("test"); |
