commit e8be471608b725f484b1c4d93aaf7e8508e96b65
parent 97d15e41e7cb9dc2f5d79acb79596f4d920496a5
Author: kernelkind <kernelkind@gmail.com>
Date: Mon, 4 Aug 2025 16:09:27 -0400
set scroll offset when routing to thread
Signed-off-by: kernelkind <kernelkind@gmail.com>
Diffstat:
3 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/crates/notedeck_columns/src/actionbar.rs b/crates/notedeck_columns/src/actionbar.rs
@@ -93,7 +93,15 @@ fn execute_note_action(
};
timeline_res = threads
- .open(ndb, txn, pool, &thread_selection, preview, col)
+ .open(
+ ndb,
+ txn,
+ pool,
+ &thread_selection,
+ preview,
+ col,
+ scroll_offset,
+ )
.map(NotesOpenResult::Thread);
let route = Route::Thread(thread_selection);
diff --git a/crates/notedeck_columns/src/timeline/thread.rs b/crates/notedeck_columns/src/timeline/thread.rs
@@ -154,6 +154,7 @@ pub struct Threads {
impl Threads {
/// Opening a thread.
/// Similar to [[super::cache::TimelineCache::open]]
+ #[allow(clippy::too_many_arguments)]
pub fn open(
&mut self,
ndb: &mut Ndb,
@@ -162,6 +163,7 @@ impl Threads {
thread: &ThreadSelection,
new_scope: bool,
col: usize,
+ scroll_offset: f32,
) -> Option<NewThreadNotes> {
tracing::info!("Opening thread: {:?}", thread);
let local_sub_filter = if let Some(selected) = &thread.selected_note {
@@ -191,7 +193,7 @@ impl Threads {
RawEntryMut::Vacant(entry) => {
let id = NoteId::new(*selected_note_id);
- let node = ThreadNode::new(ParentState::Unknown);
+ let node = ThreadNode::new(ParentState::Unknown).with_offset(scroll_offset);
entry.insert(id, node);
&local_sub_filter
diff --git a/crates/notedeck_columns/src/ui/thread.rs b/crates/notedeck_columns/src/ui/thread.rs
@@ -52,17 +52,26 @@ impl<'a, 'd> ThreadView<'a, 'd> {
.auto_shrink([false, false])
.scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysVisible);
- let offset_id = scroll_id.with(("scroll_offset", self.selected_note_id));
-
- if let Some(offset) = ui.data(|i| i.get_temp::<f32>(offset_id)) {
- scroll_area = scroll_area.vertical_scroll_offset(offset);
+ if let Some(thread) = self.threads.threads.get_mut(&self.selected_note_id) {
+ if let Some(new_offset) = thread.set_scroll_offset.take() {
+ scroll_area = scroll_area.vertical_scroll_offset(new_offset);
+ }
}
let output = scroll_area.show(ui, |ui| self.notes(ui, &txn));
- ui.data_mut(|d| d.insert_temp(offset_id, output.state.offset.y));
+ let mut resp = output.inner;
+
+ if let Some(NoteAction::Note {
+ note_id: _,
+ preview: _,
+ scroll_offset,
+ }) = &mut resp
+ {
+ *scroll_offset = output.state.offset.y;
+ }
- output.inner
+ resp
}
fn notes(&mut self, ui: &mut egui::Ui, txn: &Transaction) -> Option<NoteAction> {