aboutsummaryrefslogtreecommitdiff
path: root/src/workspace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/workspace.rs')
-rw-r--r--src/workspace.rs75
1 files changed, 71 insertions, 4 deletions
diff --git a/src/workspace.rs b/src/workspace.rs
index d10cdfe2..2de109d9 100644
--- a/src/workspace.rs
+++ b/src/workspace.rs
@@ -192,11 +192,15 @@ impl Tab {
let agent = pane.and_then(|p| p.detected_agent);
let state = pane.map(|p| p.state).unwrap_or(AgentState::Unknown);
let seen = pane.map(|p| p.seen).unwrap_or(true);
- let label = agent
+ let agent_label = agent
.map(|a| agent_name(a).to_string())
.unwrap_or_else(|| "shell".to_string());
PaneDetail {
- label,
+ pane_id: *id,
+ tab_idx: self.number.saturating_sub(1),
+ tab_label: self.display_name(),
+ label: agent_label.clone(),
+ agent_label,
agent,
state,
seen,
@@ -442,7 +446,17 @@ impl Workspace {
}
pub fn pane_details(&self) -> Vec<PaneDetail> {
- self.active_tab().map(Tab::pane_details).unwrap_or_default()
+ let multi_tab = self.tabs.len() > 1;
+ self.tabs
+ .iter()
+ .flat_map(Tab::pane_details)
+ .map(|mut detail| {
+ if multi_tab {
+ detail.label = format!("{} / {}", detail.tab_label, detail.agent_label);
+ }
+ detail
+ })
+ .collect()
}
pub fn focused_runtime(&self) -> Option<&PaneRuntime> {
@@ -532,7 +546,11 @@ impl Workspace {
/// Detail info for a single pane, used by the agent detail panel.
pub struct PaneDetail {
+ pub pane_id: PaneId,
+ pub tab_idx: usize,
+ pub tab_label: String,
pub label: String,
+ pub agent_label: String,
#[allow(dead_code)]
pub agent: Option<Agent>,
pub state: AgentState,
@@ -680,12 +698,36 @@ impl Workspace {
self.register_new_pane(new_id);
new_id
}
+
+ pub fn test_add_tab(&mut self, name: Option<&str>) -> usize {
+ let (events, _) = mpsc::channel(64);
+ let render_notify = Arc::new(Notify::new());
+ let render_dirty = Arc::new(AtomicBool::new(false));
+ let (layout, root_id) = TileLayout::new();
+ let mut panes = HashMap::new();
+ panes.insert(root_id, PaneState::new());
+ let tab = Tab {
+ custom_name: name.map(str::to_string),
+ number: self.tabs.len() + 1,
+ root_pane: root_id,
+ layout,
+ panes,
+ runtimes: HashMap::new(),
+ zoomed: false,
+ events,
+ render_notify,
+ render_dirty,
+ };
+ self.register_new_pane(root_id);
+ self.tabs.push(tab);
+ self.tabs.len() - 1
+ }
}
#[cfg(test)]
mod tests {
use super::*;
- use crate::detect::AgentState;
+ use crate::detect::{Agent, AgentState};
#[test]
fn aggregate_state_all_unknown() {
@@ -732,4 +774,29 @@ mod tests {
assert_eq!(state, AgentState::Idle);
assert!(!seen);
}
+
+ #[test]
+ fn pane_details_include_tab_context_when_workspace_has_multiple_tabs() {
+ let mut ws = Workspace::test_new("test");
+ ws.tabs[0].set_custom_name("main".into());
+ let root_pane = ws.tabs[0].root_pane;
+ ws.tabs[0]
+ .panes
+ .get_mut(&root_pane)
+ .unwrap()
+ .detected_agent = Some(Agent::Pi);
+
+ let tab_idx = ws.test_add_tab(Some("logs"));
+ let second_root_pane = ws.tabs[tab_idx].root_pane;
+ ws.tabs[tab_idx]
+ .panes
+ .get_mut(&second_root_pane)
+ .unwrap()
+ .detected_agent = Some(Agent::Claude);
+
+ let details = ws.pane_details();
+ assert_eq!(details.len(), 2);
+ assert!(details.iter().any(|detail| detail.label == "main / pi"));
+ assert!(details.iter().any(|detail| detail.label == "logs / claude"));
+ }
}