diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-13 03:26:03 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-13 03:30:13 +0300 |
| commit | 5cfe5e5e730246948b0c9428ad876b6938590aad (patch) | |
| tree | 53d4bbe1aff6887f63f279eed1b5e4e11e7331b7 /src/app/input | |
| parent | 7f3364a468f7dcfd8c9c84e5737fe5699f0e3a93 (diff) | |
feat: add configurable sidebar metadata tokens
Diffstat (limited to 'src/app/input')
| -rw-r--r-- | src/app/input/sidebar.rs | 66 |
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); |
