From 75eefcbf72b15c2efa86534e05712f7d6efce4aa Mon Sep 17 00:00:00 2001 From: kernelkind Date: Mon, 4 Aug 2025 16:03:43 -0400 Subject: [PATCH 1/5] TMP: use new egui-nav to fix scroll offset issues Signed-off-by: kernelkind --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dd54a45f..740cd545 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1554,7 +1554,7 @@ dependencies = [ [[package]] name = "egui_nav" version = "0.2.0" -source = "git+https://github.com/damus-io/egui-nav?rev=3c67eb6298edbff36d46546897cfac33df4f04db#3c67eb6298edbff36d46546897cfac33df4f04db" +source = "git+https://github.com/kernelkind/egui-nav?rev=de6e2d51892478fdd516df166f866e64dedbae07#de6e2d51892478fdd516df166f866e64dedbae07" dependencies = [ "egui", "egui_extras", diff --git a/Cargo.toml b/Cargo.toml index 55d162ad..0b77e993 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ egui = { version = "0.31.1", features = ["serde"] } egui-wgpu = "0.31.1" egui_extras = { version = "0.31.1", features = ["all_loaders"] } egui-winit = { version = "0.31.1", features = ["android-game-activity", "clipboard"] } -egui_nav = { git = "https://github.com/damus-io/egui-nav", rev = "3c67eb6298edbff36d46546897cfac33df4f04db" } +egui_nav = { git = "https://github.com/kernelkind/egui-nav", rev = "de6e2d51892478fdd516df166f866e64dedbae07" } egui_tabs = { git = "https://github.com/damus-io/egui-tabs", rev = "6eb91740577b374a8a6658c09c9a4181299734d0" } #egui_virtual_list = "0.6.0" egui_virtual_list = { git = "https://github.com/jb55/hello_egui", rev = "a66b6794f5e707a2f4109633770e02b02fb722e1" } From ea5c876da63644e1772eac379928d341bd7f7786 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Mon, 4 Aug 2025 16:05:38 -0400 Subject: [PATCH 2/5] add `scroll_offset` to `NoteAction::Note` Signed-off-by: kernelkind --- crates/notedeck/src/note/action.rs | 7 ++++++- crates/notedeck_columns/src/actionbar.rs | 6 +++++- crates/notedeck_columns/src/ui/thread.rs | 1 + crates/notedeck_ui/src/note/contents.rs | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/notedeck/src/note/action.rs b/crates/notedeck/src/note/action.rs index 026ebb47..67d907f9 100644 --- a/crates/notedeck/src/note/action.rs +++ b/crates/notedeck/src/note/action.rs @@ -24,7 +24,11 @@ pub enum NoteAction { Profile(Pubkey), /// User has clicked a note link - Note { note_id: NoteId, preview: bool }, + Note { + note_id: NoteId, + preview: bool, + scroll_offset: f32, + }, /// User has selected some context option Context(ContextSelection), @@ -44,6 +48,7 @@ impl NoteAction { NoteAction::Note { note_id: id, preview: false, + scroll_offset: 0.0, } } } diff --git a/crates/notedeck_columns/src/actionbar.rs b/crates/notedeck_columns/src/actionbar.rs index b156cada..53ff3723 100644 --- a/crates/notedeck_columns/src/actionbar.rs +++ b/crates/notedeck_columns/src/actionbar.rs @@ -81,7 +81,11 @@ fn execute_note_action( .open(ndb, note_cache, txn, pool, &kind) .map(NotesOpenResult::Timeline); } - NoteAction::Note { note_id, preview } => 'ex: { + NoteAction::Note { + note_id, + preview, + scroll_offset, + } => 'ex: { let Ok(thread_selection) = ThreadSelection::from_note_id(ndb, note_cache, txn, note_id) else { tracing::error!("No thread selection for {}?", hex::encode(note_id.bytes())); diff --git a/crates/notedeck_columns/src/ui/thread.rs b/crates/notedeck_columns/src/ui/thread.rs index faa8131b..349df7ce 100644 --- a/crates/notedeck_columns/src/ui/thread.rs +++ b/crates/notedeck_columns/src/ui/thread.rs @@ -195,6 +195,7 @@ fn strip_note_action(action: NoteAction) -> Option { NoteAction::Note { note_id: _, preview: false, + scroll_offset: _, } ) { return None; diff --git a/crates/notedeck_ui/src/note/contents.rs b/crates/notedeck_ui/src/note/contents.rs index db7f5b9b..547aed2c 100644 --- a/crates/notedeck_ui/src/note/contents.rs +++ b/crates/notedeck_ui/src/note/contents.rs @@ -363,6 +363,7 @@ fn render_undecorated_note_contents<'a>( NoteAction::Note { note_id, .. } => NoteAction::Note { note_id, preview: true, + scroll_offset: 0.0, }, other => other, }) From 97d15e41e7cb9dc2f5d79acb79596f4d920496a5 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Mon, 4 Aug 2025 16:07:39 -0400 Subject: [PATCH 3/5] add `ThreadNote::set_scroll_offset` Signed-off-by: kernelkind --- crates/notedeck_columns/src/timeline/thread.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/notedeck_columns/src/timeline/thread.rs b/crates/notedeck_columns/src/timeline/thread.rs index 5cbbede5..1c4e8094 100644 --- a/crates/notedeck_columns/src/timeline/thread.rs +++ b/crates/notedeck_columns/src/timeline/thread.rs @@ -23,6 +23,7 @@ pub struct ThreadNode { pub prev: ParentState, pub have_all_ancestors: bool, pub list: VirtualList, + pub set_scroll_offset: Option, } #[derive(Clone)] @@ -132,8 +133,14 @@ impl ThreadNode { prev: parent, have_all_ancestors: false, list: VirtualList::new(), + set_scroll_offset: None, } } + + pub fn with_offset(mut self, offset: f32) -> Self { + self.set_scroll_offset = Some(offset); + self + } } #[derive(Default)] From e8be471608b725f484b1c4d93aaf7e8508e96b65 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Mon, 4 Aug 2025 16:09:27 -0400 Subject: [PATCH 4/5] set scroll offset when routing to thread Signed-off-by: kernelkind --- crates/notedeck_columns/src/actionbar.rs | 10 ++++++++- .../notedeck_columns/src/timeline/thread.rs | 4 +++- crates/notedeck_columns/src/ui/thread.rs | 21 +++++++++++++------ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/crates/notedeck_columns/src/actionbar.rs b/crates/notedeck_columns/src/actionbar.rs index 53ff3723..4d358cea 100644 --- 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 index 1c4e8094..4fb7a1ab 100644 --- 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 { 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 index 349df7ce..7e864c7f 100644 --- 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::(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; - output.inner + if let Some(NoteAction::Note { + note_id: _, + preview: _, + scroll_offset, + }) = &mut resp + { + *scroll_offset = output.state.offset.y; + } + + resp } fn notes(&mut self, ui: &mut egui::Ui, txn: &Transaction) -> Option { From d12f66e5cdc50d9bc1f05585309d4e04c98f73d6 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Mon, 4 Aug 2025 16:13:53 -0400 Subject: [PATCH 5/5] appease clippy Signed-off-by: kernelkind --- crates/notedeck/src/media/gif.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/notedeck/src/media/gif.rs b/crates/notedeck/src/media/gif.rs index 42fa3e1d..6b7cc5a5 100644 --- a/crates/notedeck/src/media/gif.rs +++ b/crates/notedeck/src/media/gif.rs @@ -22,7 +22,7 @@ pub fn ensure_latest_texture_from_cache( } pub fn ensure_latest_texture( - ui: &egui::Ui, + _ui: &egui::Ui, url: &str, gifs: &mut GifStateMap, img: &mut TexturedImage, @@ -108,7 +108,7 @@ pub fn ensure_latest_texture( gifs.insert(url.to_owned(), new_state); } - if let Some(req) = request_next_repaint { + if let Some(_req) = request_next_repaint { // TODO(jb55): make a continuous gif rendering setting // 24fps for gif is fine /*