From 4fc6e225caacce70042b42fc926429ae96b45736 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Thu, 16 May 2024 10:26:36 -0700 Subject: [PATCH] don't bump timeline when adding notes This is quite different than Damus iOS. The timeline will continually add new items without bumping scroll position, thanks to egui-virtual-list's `items_inserted_at_start` function. Closes: https://github.com/damus-io/notedeck/issues/38 Fixes: https://github.com/damus-io/notedeck/issues/59 Signed-off-by: William Casarin --- src/app.rs | 19 ++++++++++++++++--- src/timeline.rs | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/app.rs b/src/app.rs index 11980b67..42db0886 100644 --- a/src/app.rs +++ b/src/app.rs @@ -135,7 +135,7 @@ fn try_process_event(damus: &mut Damus, ctx: &egui::Context) -> Result<()> { let txn = Transaction::new(&damus.ndb)?; let mut unknown_ids: HashSet = HashSet::new(); for timeline in 0..damus.timelines.len() { - if let Err(err) = poll_notes_for_timeline(damus, &txn, timeline, &mut unknown_ids) { + if let Err(err) = poll_notes_for_timeline(ctx, damus, &txn, timeline, &mut unknown_ids) { error!("{}", err); } } @@ -238,6 +238,7 @@ fn get_unknown_note_ids<'a>( } fn poll_notes_for_timeline<'a>( + ctx: &egui::Context, damus: &mut Damus, txn: &'a Transaction, timeline: usize, @@ -268,8 +269,20 @@ fn poll_notes_for_timeline<'a>( }) .collect(); - damus.timelines[timeline].notes = - timeline::merge_sorted_vecs(&damus.timelines[timeline].notes, &new_refs); + let timeline = &mut damus.timelines[timeline]; + let prev_items = timeline.notes.len(); + timeline.notes = timeline::merge_sorted_vecs(&timeline.notes, &new_refs); + let new_items = timeline.notes.len() - prev_items; + + // TODO: technically items could have been added inbetween + timeline + .list + .clone() + .lock() + .unwrap() + .items_inserted_at_start(new_items); + + ctx.request_repaint(); Ok(()) } diff --git a/src/timeline.rs b/src/timeline.rs index 4398d2c0..459f3c33 100644 --- a/src/timeline.rs +++ b/src/timeline.rs @@ -153,6 +153,7 @@ pub fn timeline_view(ui: &mut egui::Ui, app: &mut Damus, timeline: usize) { ui.add_space(3.0); egui::ScrollArea::vertical() + .animated(false) .scroll_bar_visibility(ScrollBarVisibility::AlwaysVisible) .show(ui, |ui| { let len = app.timelines[timeline].notes.len();