diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-11 19:40:31 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-11 19:40:50 +0300 |
| commit | 84c0d003ddb19a8e95e7ad5206771a663913605b (patch) | |
| tree | 76775210a505270c53a2a9e8dcb4b0f788346ad1 /src | |
| parent | e12c7a2cef6c50f736658c20d0c5a33da033ae4b (diff) | |
fix: show tab names in mobile agent switcher
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/mobile.rs | 52 |
1 files changed, 46 insertions, 6 deletions
diff --git a/src/ui/mobile.rs b/src/ui/mobile.rs index 41f29f89..9a09f3e0 100644 --- a/src/ui/mobile.rs +++ b/src/ui/mobile.rs @@ -6,7 +6,7 @@ use ratatui::{ Frame, }; -use super::sidebar::agent_panel_entries; +use super::sidebar::{agent_panel_entries, AgentPanelEntry}; use super::status::{agent_icon, state_dot}; use crate::app::state::{Palette, ToastKind, ToastNotification}; use crate::app::AppState; @@ -553,11 +553,7 @@ fn render_mobile_switcher_content(app: &AppState, frame: &mut Frame, viewport: R .add_modifier(Modifier::BOLD), ), ]); - let detail = format!( - " {} · {}", - super::status::state_label(entry.state, entry.seen), - entry.agent_label.as_deref().unwrap_or("agent") - ); + let detail = mobile_agent_detail(entry); render_two_line_item( frame, viewport, @@ -594,6 +590,19 @@ fn render_mobile_switcher_content(app: &AppState, frame: &mut Frame, viewport: R } } +fn mobile_agent_detail(entry: &AgentPanelEntry) -> String { + let mut parts = Vec::new(); + if let Some(tab_label) = entry.primary_tab_label.as_deref() { + parts.push(tab_label.to_string()); + } + parts.push(super::status::state_label(entry.state, entry.seen).to_string()); + if let Some(agent_label) = entry.agent_label.as_deref() { + parts.push(agent_label.to_string()); + } + + format!(" {}", parts.join(" · ")) +} + fn render_section_title_at( frame: &mut Frame, viewport: Rect, @@ -886,3 +895,34 @@ fn truncate(text: &str, max_width: usize) -> String { let prefix: String = text.chars().take(max_width.saturating_sub(1)).collect(); format!("{prefix}…") } +#[cfg(test)] +mod tests { + use super::*; + + fn agent_entry(primary_tab_label: Option<&str>, agent_label: Option<&str>) -> AgentPanelEntry { + AgentPanelEntry { + ws_idx: 0, + tab_idx: 0, + pane_id: PaneId::from_raw(1), + primary_label: "herdr".into(), + primary_tab_label: primary_tab_label.map(str::to_string), + agent_label: agent_label.map(str::to_string), + state: AgentState::Idle, + seen: true, + } + } + + #[test] + fn mobile_agent_detail_includes_tab_context_when_available() { + let entry = agent_entry(Some("mobile-state"), Some("pi")); + + assert_eq!(mobile_agent_detail(&entry), " mobile-state · idle · pi"); + } + + #[test] + fn mobile_agent_detail_keeps_existing_compact_detail_without_tab_context() { + let entry = agent_entry(None, Some("pi")); + + assert_eq!(mobile_agent_detail(&entry), " idle · pi"); + } +} |
