Skip to content

Feature/messages scroll persistence - #178

Merged
stippi merged 6 commits into
mainfrom
feature/messages-scroll-persistence
Aug 4, 2026
Merged

Feature/messages scroll persistence#178
stippi merged 6 commits into
mainfrom
feature/messages-scroll-persistence

Conversation

@stippi

@stippi stippi commented Aug 1, 2026

Copy link
Copy Markdown
Owner

No description provided.

stippi added 6 commits August 1, 2026 13:26
Add SavedScroll state and messages_reset_for_session to MessagesView so
that switching sessions saves/restores the logical scroll anchor and
follow-tail flag, and a same-session resync freezes the visible offset
instead of jumping to the bottom.
Route notify_messages_reset and remove_empty_containers through
MessagesView::messages_reset_for_session with the current session id, so
that:
 - switching sessions restores each session's remembered scroll position
   and follow-tail state,
 - a same-session resync (stream lag, file-watcher refresh, structural
   edit) freezes the visible offset instead of snapping to the bottom.

Session deletion forgets the remembered scroll for that session.
The instant jump-to-bottom used ListState::scroll_to_reveal_item, which
computes a pixel target from item heights. Right after reset() the list
items are unmeasured (zero height), so it landed at the TOP — visible
when returning to a long session that was scrolled to the end.

Use ListState::scroll_to_end instead: it anchors past the last item so
the layout pass walks backwards from the end and reveals the true bottom
regardless of measurement state. Also keep a following session pinned to
the end across the height-cache remeasures.

Adds a regression test asserting a follow-tail restore anchors past the
last item.
Store the scroll anchor + follow-tail flag in the existing per-session
UiSessionState (the same <session>.ui_state.json that already holds tool
collapse/diff overrides), so a session is shown as it was left across app
restarts.

Writes are throttled through the existing debounced PersistUiState flush:
persist_current_scroll records the current position on real user scroll
(wheel handler), on the edge-drag follow-tail transition, on the
scroll-to-bottom button, and on session switch. A no-op guard in
UiStateStore::set_scroll avoids re-dirtying on unchanged positions.

Restore prefers the in-memory per-run position and falls back to the
on-disk position (load_persisted_scroll). Adds UiStateStore scroll
get/set + serialization tests.
Remove the standalone MessagesView::messages_reset — its reset-to-bottom
logic overlapped with the session-aware path. The delete/disconnect call
site and the two unit tests now use messages_reset_for_session(None, ...),
which clears to the empty state via the same-session branch (the displayed
session is cleared first, so no stale scroll is restored).
@stippi
stippi merged commit d993621 into main Aug 4, 2026
5 checks passed
@stippi
stippi deleted the feature/messages-scroll-persistence branch August 4, 2026 09:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant