diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-11 23:31:36 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-11 23:34:20 +0300 |
| commit | fe693f613a23452e68589a4337863f217cc57930 (patch) | |
| tree | 8d60f6c5b0d8b31426c6623cc8b0c2415d481000 /src/pane | |
| parent | 84c0d003ddb19a8e95e7ad5206771a663913605b (diff) | |
feat: add optional pane border labels
Diffstat (limited to 'src/pane')
| -rw-r--r-- | src/pane/state.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/pane/state.rs b/src/pane/state.rs index 8b36826b..f9b7a149 100644 --- a/src/pane/state.rs +++ b/src/pane/state.rs @@ -28,6 +28,7 @@ pub struct PaneState { pub detected_agent: Option<Agent>, pub fallback_state: AgentState, pub hook_authority: Option<HookAuthority>, + pub manual_label: Option<String>, hook_report_sequences: HashMap<String, u64>, pub state: AgentState, /// Whether the user has seen this pane since its last state change to Idle. @@ -41,6 +42,7 @@ impl PaneState { detected_agent: None, fallback_state: AgentState::Unknown, hook_authority: None, + manual_label: None, hook_report_sequences: HashMap::new(), state: AgentState::Unknown, seen: true, @@ -184,6 +186,23 @@ impl PaneState { self.detected_agent } + pub fn set_manual_label(&mut self, label: String) { + let label = label.trim().to_string(); + self.manual_label = (!label.is_empty()).then_some(label); + } + + pub fn clear_manual_label(&mut self) { + self.manual_label = None; + } + + pub fn border_label(&self, show_agent_labels: bool) -> Option<&str> { + self.manual_label.as_deref().or_else(|| { + show_agent_labels + .then(|| self.effective_agent_label()) + .flatten() + }) + } + fn recompute_effective_state( &mut self, previous_agent_label: Option<String>, @@ -339,6 +358,26 @@ mod tests { } #[test] + fn border_label_prefers_manual_label_over_agent_label() { + let mut pane = PaneState::new(); + pane.set_detected_state(Some(Agent::Claude), AgentState::Idle); + + assert_eq!(pane.border_label(false), None); + assert_eq!(pane.border_label(true), Some("claude")); + + pane.set_manual_label(" reviewer ".into()); + assert_eq!(pane.border_label(false), Some("reviewer")); + assert_eq!(pane.border_label(true), Some("reviewer")); + + pane.set_manual_label(" ".into()); + assert_eq!(pane.border_label(true), Some("claude")); + + pane.set_manual_label("reviewer".into()); + pane.clear_manual_label(); + assert_eq!(pane.border_label(true), Some("claude")); + } + + #[test] fn hook_authority_survives_unrelated_detected_agent_clear() { let mut pane = PaneState::new(); pane.set_detected_state(Some(Agent::Pi), AgentState::Idle); |
