Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions crates/ui_gpui/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -262,11 +262,15 @@ impl Gpui {
}

/// Notify the MessagesView that the message_queue was fully reset (cleared + reloaded).
/// This resets the ListState, discarding all cached heights.
/// This resets the ListState. Scroll handling is session-aware: switching
/// sessions saves/restores each session's scroll position, while a
/// same-session resync (stream lag, file-watcher refresh, structural edit)
/// freezes the visible offset instead of jumping to the bottom.
fn notify_messages_reset(&self, cx: &mut gpui::AsyncApp) {
let new_len = self.message_queue.lock().unwrap().len();
let session_id = self.current_session_id.lock().unwrap().clone();
self.update_messages_view(cx, |view, cx| {
view.messages_reset(new_len, cx);
view.messages_reset_for_session(session_id, new_len, cx);
cx.notify();
});
}
Expand Down Expand Up @@ -296,9 +300,12 @@ impl Gpui {
drop(queue);

if new_len != old_len {
// Full reset since items may have been removed from arbitrary positions
// Full reset since items may have been removed from arbitrary positions.
// Route through the session-aware reset so the visible offset is
// frozen (same-session change) rather than snapping to the bottom.
let session_id = self.current_session_id.lock().unwrap().clone();
self.update_messages_view(cx, |view, cx| {
view.messages_reset(new_len, cx);
view.messages_reset_for_session(session_id, new_len, cx);
cx.notify();
});
}
Expand Down
6 changes: 5 additions & 1 deletion crates/ui_gpui/src/main_screen/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -658,7 +658,11 @@ impl MainScreen {
// in the SessionDeleted response handler will be a no-op).
self.messages_view.update(cx, |view, cx| {
view.set_current_session_id(None);
view.messages_reset(0, cx);
view.forget_session_scroll(session_id.as_str());
// Disconnect the view: clear to the empty state. Passing `None`
// routes through the session-aware reset (displayed session was
// just cleared above), so no stale scroll is restored.
view.messages_reset_for_session(None, 0, cx);
cx.notify();
});

Expand Down
Loading
Loading