aboutsummaryrefslogtreecommitdiff
path: root/src/app/input
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-13 03:26:03 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-13 03:30:13 +0300
commit5cfe5e5e730246948b0c9428ad876b6938590aad (patch)
tree53d4bbe1aff6887f63f279eed1b5e4e11e7331b7 /src/app/input
parent7f3364a468f7dcfd8c9c84e5737fe5699f0e3a93 (diff)
feat: add configurable sidebar metadata tokens
Diffstat (limited to 'src/app/input')
-rw-r--r--src/app/input/sidebar.rs66
1 files changed, 61 insertions, 5 deletions
diff --git a/src/app/input/sidebar.rs b/src/app/input/sidebar.rs
index 32ad14b3..acbdfb9a 100644
--- a/src/app/input/sidebar.rs
+++ b/src/app/input/sidebar.rs
@@ -443,7 +443,7 @@ impl AppState {
detail_area,
crate::ui::should_show_scrollbar(metrics),
);
- if body.height < 2 || row < body.y || row >= body.y + body.height {
+ if body.height == 0 || row < body.y || row >= body.y + body.height {
return None;
}
@@ -452,13 +452,14 @@ impl AppState {
.into_iter()
.skip(self.agent_panel_scroll)
{
- if row_y.saturating_add(1) >= body.y + body.height {
+ let height = crate::ui::agent_entry_height_in_body(self, &detail, body.height);
+ if row_y.saturating_add(height) > body.y + body.height {
break;
}
- if row == row_y || row == row_y + 1 {
+ if row >= row_y && row < row_y.saturating_add(height) {
return Some((detail.ws_idx, detail.tab_idx, detail.pane_id));
}
- row_y = row_y.saturating_add(2);
+ row_y = row_y.saturating_add(height);
if row_y < body.y + body.height {
row_y = row_y.saturating_add(1);
}
@@ -692,6 +693,53 @@ mod tests {
}
#[test]
+ fn per_agent_row_heights_preserve_card_gaps_and_trailing_mouse_targets() {
+ let mut app = app_for_mouse_test();
+ let first = Workspace::test_new("one");
+ let first_pane = first.tabs[0].root_pane;
+ let second = Workspace::test_new("two");
+ let second_pane = second.tabs[0].root_pane;
+ app.state.workspaces = vec![first, second];
+ app.state.ensure_test_terminals();
+ for (ws_idx, pane_id, agent) in
+ [(0, first_pane, Agent::Pi), (1, second_pane, Agent::Claude)]
+ {
+ let terminal_id = app.state.workspaces[ws_idx].tabs[0].panes[&pane_id]
+ .attached_terminal_id
+ .clone();
+ app.state
+ .terminals
+ .get_mut(&terminal_id)
+ .unwrap()
+ .detected_agent = Some(agent);
+ }
+ app.state.sidebar_agents.rows = vec![vec![crate::config::AgentSidebarToken::Agent]];
+ app.state.sidebar_agents.rows_by_agent.insert(
+ "claude".into(),
+ vec![
+ vec![crate::config::AgentSidebarToken::Agent],
+ vec![crate::config::AgentSidebarToken::Workspace],
+ ],
+ );
+ let detail_area = app.state.agent_panel_rect();
+ let metrics = crate::ui::agent_panel_scroll_metrics(&app.state, detail_area);
+ let body = crate::ui::agent_panel_body_rect(
+ detail_area,
+ crate::ui::should_show_scrollbar(metrics),
+ );
+
+ assert_eq!(
+ app.state.agent_detail_target_at(body.y),
+ Some((0, 0, first_pane))
+ );
+ assert_eq!(app.state.agent_detail_target_at(body.y + 1), None);
+ assert_eq!(
+ app.state.agent_detail_target_at(body.y + 3),
+ Some((1, 0, second_pane))
+ );
+ }
+
+ #[test]
fn clicking_agent_panel_toggle_switches_sort() {
let mut app = app_for_mouse_test();
app.state.workspaces = vec![Workspace::test_new("test")];
@@ -866,6 +914,14 @@ mod tests {
app.state.active = Some(0);
app.state.selected = 0;
app.state.mode = Mode::Terminal;
+ app.state.sidebar_agents.rows = vec![vec![crate::config::AgentSidebarToken::Agent]];
+ app.state.sidebar_agents.rows_by_agent.insert(
+ "claude".into(),
+ vec![
+ vec![crate::config::AgentSidebarToken::Agent],
+ vec![crate::config::AgentSidebarToken::Workspace],
+ ],
+ );
app.state.agent_panel_scroll = 1;
let detail_area = app.state.agent_panel_rect();
@@ -873,7 +929,7 @@ mod tests {
app.handle_mouse(mouse(
MouseEventKind::Down(MouseButton::Left),
body.x + 1,
- body.y,
+ body.y + 1,
));
assert_eq!(app.state.workspaces[0].active_tab, second_tab);