aboutsummaryrefslogtreecommitdiff
path: root/src/ui/panes.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-15 15:48:38 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-16 22:47:10 +0300
commit8dcb75a5c08b4dd1f225ea531a27824a9f41ae4a (patch)
tree48b4b74e857c93ffc03ff1b790b2f9e76e0113ac /src/ui/panes.rs
parentf43a6d4a5591a0286e01de737be7b3f42416898b (diff)
refactor: extract active tab surface rendering
Diffstat (limited to 'src/ui/panes.rs')
-rw-r--r--src/ui/panes.rs69
1 files changed, 41 insertions, 28 deletions
diff --git a/src/ui/panes.rs b/src/ui/panes.rs
index ae4cc132..981f3246 100644
--- a/src/ui/panes.rs
+++ b/src/ui/panes.rs
@@ -297,21 +297,20 @@ pub(super) fn render_panes(
app: &AppState,
terminal_runtimes: &TerminalRuntimeRegistry,
frame: &mut Frame,
- area: Rect,
+ pane_infos: &[PaneInfo],
+ split_borders: &[crate::layout::SplitBorder],
) {
let Some(ws_idx) = app.active else {
- render_empty(app, frame, area);
return;
};
let Some(ws) = app.workspaces.get(ws_idx) else {
- render_empty(app, frame, area);
return;
};
let multi_pane = ws.layout.pane_count() > 1;
let terminal_active = app.mode == Mode::Terminal;
- for info in &app.view.pane_infos {
+ for info in pane_infos {
if let Some(rt) = app.runtime_for_pane_in_workspace(terminal_runtimes, ws_idx, info.id) {
let show_cursor = info.is_focused
&& terminal_active
@@ -365,7 +364,7 @@ pub(super) fn render_panes(
}
}
- render_pane_borders(app, ws, frame);
+ render_pane_borders(app, ws, pane_infos, split_borders, frame);
}
pub(crate) fn popup_pane_rects(app: &AppState, area: Rect) -> Option<(Rect, Rect)> {
@@ -437,22 +436,22 @@ struct LineCell {
right: bool,
}
-fn render_pane_borders(app: &AppState, ws: &crate::workspace::Workspace, frame: &mut Frame) {
- if !app.pane_borders
- || app
- .view
- .pane_infos
- .iter()
- .all(|info| info.borders.is_empty())
- {
+fn render_pane_borders(
+ app: &AppState,
+ ws: &crate::workspace::Workspace,
+ pane_infos: &[PaneInfo],
+ split_borders: &[crate::layout::SplitBorder],
+ frame: &mut Frame,
+) {
+ if !app.pane_borders || pane_infos.iter().all(|info| info.borders.is_empty()) {
return;
}
let mut cells = std::collections::HashMap::<(u16, u16), LineCell>::new();
- for info in &app.view.pane_infos {
+ for info in pane_infos {
add_pane_border_cells(&mut cells, info);
}
- add_split_border_cells(app, &mut cells);
+ add_split_border_cells(app.pane_gaps, split_borders, &mut cells);
let buf = frame.buffer_mut();
let area = buf.area;
@@ -464,9 +463,7 @@ fn render_pane_borders(app: &AppState, ws: &crate::workspace::Workspace, frame:
{
continue;
}
- let focused = app
- .view
- .pane_infos
+ let focused = pane_infos
.iter()
.any(|info| info.is_focused && line_touches_pane(x, y, info, app.pane_gaps));
let symbol = line_cell_symbol(line);
@@ -483,18 +480,19 @@ fn render_pane_borders(app: &AppState, ws: &crate::workspace::Workspace, frame:
cell.set_style(Style::default().fg(color));
}
- render_pane_border_titles(app, ws, frame);
+ render_pane_border_titles(app, ws, pane_infos, frame);
}
fn add_split_border_cells(
- app: &AppState,
+ pane_gaps: bool,
+ split_borders: &[crate::layout::SplitBorder],
cells: &mut std::collections::HashMap<(u16, u16), LineCell>,
) {
- if app.pane_gaps {
+ if pane_gaps {
return;
}
- for split in &app.view.split_borders {
+ for split in split_borders {
match split.direction {
ratatui::layout::Direction::Horizontal => {
let x = split.pos;
@@ -607,10 +605,15 @@ fn line_touches_pane(x: u16, y: u16, info: &PaneInfo, pane_gaps: bool) -> bool {
|| (x == shared_right && y == shared_bottom)
}
-fn render_pane_border_titles(app: &AppState, ws: &crate::workspace::Workspace, frame: &mut Frame) {
+fn render_pane_border_titles(
+ app: &AppState,
+ ws: &crate::workspace::Workspace,
+ pane_infos: &[PaneInfo],
+ frame: &mut Frame,
+) {
let buf = frame.buffer_mut();
let area = buf.area;
- for info in &app.view.pane_infos {
+ for info in pane_infos {
if !info.borders.contains(Borders::TOP) || info.rect.width <= 4 {
continue;
}
@@ -911,7 +914,7 @@ fn color_to_rgb(color: Color) -> Option<Rgb> {
}
}
-fn render_empty(app: &AppState, frame: &mut Frame, area: Rect) {
+pub(super) fn render_empty(app: &AppState, frame: &mut Frame, area: Rect) {
let p = &app.palette;
let lines = vec![
Line::from(""),
@@ -961,6 +964,16 @@ mod tests {
use crate::terminal::TerminalState;
use crate::workspace::Workspace;
+ fn render_view_pane_borders(app: &AppState, ws: &Workspace, frame: &mut Frame) {
+ render_pane_borders(
+ app,
+ ws,
+ &app.view.pane_infos,
+ &app.view.split_borders,
+ frame,
+ );
+ }
+
#[test]
fn pane_border_title_trims_and_truncates() {
assert_eq!(
@@ -1015,7 +1028,7 @@ mod tests {
let mut terminal =
ratatui::Terminal::new(ratatui::backend::TestBackend::new(12, 3)).unwrap();
terminal
- .draw(|frame| render_pane_borders(&app, &ws, frame))
+ .draw(|frame| render_view_pane_borders(&app, &ws, frame))
.unwrap();
let buffer = terminal.backend().buffer();
@@ -1182,7 +1195,7 @@ mod tests {
ratatui::Terminal::new(ratatui::backend::TestBackend::new(4, 4)).unwrap();
terminal
- .draw(|frame| render_pane_borders(&app, &ws, frame))
+ .draw(|frame| render_view_pane_borders(&app, &ws, frame))
.unwrap();
let buffer = terminal.backend().buffer();
@@ -1221,7 +1234,7 @@ mod tests {
ratatui::Terminal::new(ratatui::backend::TestBackend::new(4, 3)).unwrap();
terminal
- .draw(|frame| render_pane_borders(&app, &ws, frame))
+ .draw(|frame| render_view_pane_borders(&app, &ws, frame))
.unwrap();
let buffer = terminal.backend().buffer();