From b80d522f0ebb59e62aafeaf15a12211bb9aa63a0 Mon Sep 17 00:00:00 2001 From: Hunter Bown Date: Thu, 7 May 2026 15:17:08 -0500 Subject: [PATCH] fix(tui): clear stale scrollbar drag state --- crates/tui/src/tui/app.rs | 1 + crates/tui/src/tui/ui.rs | 2 ++ crates/tui/src/tui/ui/tests.rs | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/crates/tui/src/tui/app.rs b/crates/tui/src/tui/app.rs index 5bdc88a3..d14a039c 100644 --- a/crates/tui/src/tui/app.rs +++ b/crates/tui/src/tui/app.rs @@ -2467,6 +2467,7 @@ impl App { self.viewport.pending_scroll_delta = 0; self.viewport.transcript_selection.clear(); + self.viewport.transcript_scrollbar_dragging = false; self.viewport.last_transcript_area = None; self.viewport.last_transcript_top = 0; diff --git a/crates/tui/src/tui/ui.rs b/crates/tui/src/tui/ui.rs index 13aa6f3a..eb5c4d0f 100644 --- a/crates/tui/src/tui/ui.rs +++ b/crates/tui/src/tui/ui.rs @@ -7338,6 +7338,8 @@ fn handle_mouse_event(app: &mut App, mouse: MouseEvent) -> Vec { } } MouseEventKind::Down(MouseButton::Left) => { + app.viewport.transcript_scrollbar_dragging = false; + if mouse_hits_rect(mouse, app.viewport.jump_to_latest_button_area) { app.scroll_to_bottom(); return Vec::new(); diff --git a/crates/tui/src/tui/ui/tests.rs b/crates/tui/src/tui/ui/tests.rs index 228a44d6..b9fa29e1 100644 --- a/crates/tui/src/tui/ui/tests.rs +++ b/crates/tui/src/tui/ui/tests.rs @@ -359,6 +359,38 @@ fn transcript_scrollbar_drag_maps_mouse_row_to_scroll_position() { assert!(!app.viewport.transcript_scrollbar_dragging); } +#[test] +fn new_left_down_clears_stale_transcript_scrollbar_drag() { + let mut app = create_test_app(); + app.history = vec![HistoryCell::Assistant { + content: "alpha beta".to_string(), + streaming: false, + }]; + app.resync_history_revisions(); + app.viewport.last_transcript_area = Some(Rect { + x: 2, + y: 5, + width: 20, + height: 10, + }); + app.viewport.last_transcript_visible = 10; + app.viewport.last_transcript_total = 110; + app.viewport.transcript_scrollbar_dragging = true; + + let events = handle_mouse_event( + &mut app, + MouseEvent { + kind: MouseEventKind::Down(MouseButton::Left), + column: 3, + row: 5, + modifiers: KeyModifiers::NONE, + }, + ); + + assert!(events.is_empty()); + assert!(!app.viewport.transcript_scrollbar_dragging); +} + #[test] fn right_click_opens_context_menu() { let mut app = create_test_app();