aboutsummaryrefslogtreecommitdiff
path: root/src/ui/panes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/panes.rs')
-rw-r--r--src/ui/panes.rs44
1 files changed, 43 insertions, 1 deletions
diff --git a/src/ui/panes.rs b/src/ui/panes.rs
index 818ee9fd..72a5c30c 100644
--- a/src/ui/panes.rs
+++ b/src/ui/panes.rs
@@ -18,6 +18,30 @@ pub(crate) fn pane_is_scrolled_back(rt: &PaneRuntime) -> bool {
.is_some_and(|metrics| metrics.offset_from_bottom > 0)
}
+fn truncate_label(text: &str, max_width: usize) -> String {
+ let len = text.chars().count();
+ if len <= max_width {
+ return text.to_string();
+ }
+ if max_width == 0 {
+ return String::new();
+ }
+ if max_width == 1 {
+ return "…".to_string();
+ }
+ let prefix: String = text.chars().take(max_width.saturating_sub(1)).collect();
+ format!("{prefix}…")
+}
+
+fn pane_border_title(label: &str, pane_width: u16) -> Option<String> {
+ let label = label.trim();
+ if label.is_empty() || pane_width <= 4 {
+ return None;
+ }
+ let max_label_width = pane_width.saturating_sub(4) as usize;
+ Some(format!(" {} ", truncate_label(label, max_label_width)))
+}
+
fn stable_terminal_inner_rect(pane_inner: Rect) -> Rect {
if pane_inner.width <= 4 {
return pane_inner;
@@ -174,10 +198,17 @@ pub(super) fn render_panes(app: &AppState, frame: &mut Frame, area: Rect) {
)
};
- let block = Block::default()
+ let mut block = Block::default()
.borders(Borders::ALL)
.border_style(border_style)
.border_set(border_set);
+ if let Some(title) = ws
+ .pane_state(info.id)
+ .and_then(|pane| pane.border_label(app.show_agent_labels_on_pane_borders))
+ .and_then(|label| pane_border_title(label, info.rect.width))
+ {
+ block = block.title(Line::from(Span::styled(title, border_style)));
+ }
frame.render_widget(block, info.rect);
}
@@ -303,6 +334,17 @@ mod tests {
use crate::pane::PaneRuntime;
use crate::workspace::Workspace;
+ #[test]
+ fn pane_border_title_trims_and_truncates() {
+ assert_eq!(
+ pane_border_title(" claude ", 20).as_deref(),
+ Some(" claude ")
+ );
+ assert_eq!(pane_border_title("", 20), None);
+ assert_eq!(pane_border_title("abcdef", 8).as_deref(), Some(" abc… "));
+ assert_eq!(pane_border_title("abcdef", 4), None);
+ }
+
#[tokio::test]
async fn pane_scrollbar_gutter_is_reserved_before_scrollback_exists() {
let mut app = AppState::test_new();