aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-11 19:40:31 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-11 19:40:50 +0300
commit84c0d003ddb19a8e95e7ad5206771a663913605b (patch)
tree76775210a505270c53a2a9e8dcb4b0f788346ad1 /src
parente12c7a2cef6c50f736658c20d0c5a33da033ae4b (diff)
fix: show tab names in mobile agent switcher
Diffstat (limited to 'src')
-rw-r--r--src/ui/mobile.rs52
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");
+ }
+}