notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 8960b3f052428d0989fbd7b814f425ad14987d56
parent 6db6cf7b7a2c256b30ff1781714c4c22525c70c8
Author: kernelkind <kernelkind@gmail.com>
Date:   Thu, 24 Jul 2025 09:43:53 -0600

add `scroll_id` for all views with vertical scroll

Signed-off-by: kernelkind <kernelkind@gmail.com>

Diffstat:
Mcrates/notedeck_columns/src/ui/accounts.rs | 5+++++
Mcrates/notedeck_columns/src/ui/add_column.rs | 9+++++++--
Mcrates/notedeck_columns/src/ui/configure_deck.rs | 5+++++
Mcrates/notedeck_columns/src/ui/profile/edit.rs | 5+++++
Mcrates/notedeck_columns/src/ui/profile/mod.rs | 6+++++-
Mcrates/notedeck_columns/src/ui/relay.rs | 5+++++
Mcrates/notedeck_columns/src/ui/search/mod.rs | 5+++++
Mcrates/notedeck_columns/src/ui/timeline.rs | 15++++++++++++---
8 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/crates/notedeck_columns/src/ui/accounts.rs b/crates/notedeck_columns/src/ui/accounts.rs @@ -52,6 +52,7 @@ impl<'a> AccountsView<'a> { ui.add_space(8.0); scroll_area() + .id_salt(AccountsView::scroll_id()) .show(ui, |ui| { Self::show_accounts(ui, self.accounts, self.ndb, self.img_cache, self.i18n) }) @@ -59,6 +60,10 @@ impl<'a> AccountsView<'a> { }) } + pub fn scroll_id() -> egui::Id { + egui::Id::new("accounts") + } + fn show_accounts( ui: &mut Ui, accounts: &Accounts, diff --git a/crates/notedeck_columns/src/ui/add_column.rs b/crates/notedeck_columns/src/ui/add_column.rs @@ -64,14 +64,14 @@ enum AddColumnOption { Individual(PubkeySource), } -#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)] +#[derive(Clone, Copy, Eq, PartialEq, Debug, Default, Hash)] pub enum AddAlgoRoute { #[default] Base, LastPerPubkey, } -#[derive(Clone, Copy, Eq, PartialEq, Debug)] +#[derive(Clone, Copy, Eq, PartialEq, Debug, Hash)] pub enum AddColumnRoute { Base, UndecidedNotification, @@ -187,8 +187,13 @@ impl<'a> AddColumnView<'a> { } } + pub fn scroll_id(route: &AddColumnRoute) -> egui::Id { + egui::Id::new(("add_column", route)) + } + pub fn ui(&mut self, ui: &mut Ui) -> Option<AddColumnResponse> { ScrollArea::vertical() + .id_salt(AddColumnView::scroll_id(&AddColumnRoute::Base)) .show(ui, |ui| { let mut selected_option: Option<AddColumnResponse> = None; for column_option_data in self.get_base_options(ui) { diff --git a/crates/notedeck_columns/src/ui/configure_deck.rs b/crates/notedeck_columns/src/ui/configure_deck.rs @@ -33,6 +33,10 @@ impl<'a> ConfigureDeckView<'a> { self } + pub fn scroll_id() -> egui::Id { + egui::Id::new("configure-deck") + } + pub fn ui(&mut self, ui: &mut Ui) -> Option<ConfigureDeckResponse> { let title_font = egui::FontId::new( notedeck::fonts::get_font_size(ui.ctx(), &NotedeckTextStyle::Heading4), @@ -261,6 +265,7 @@ fn glyph_options_ui( ) -> Option<char> { let mut selected_glyph = None; egui::ScrollArea::vertical() + .id_salt(ConfigureDeckView::scroll_id()) .max_height(max_height) .show(ui, |ui| { let max_width = ui.available_width(); diff --git a/crates/notedeck_columns/src/ui/profile/edit.rs b/crates/notedeck_columns/src/ui/profile/edit.rs @@ -24,9 +24,14 @@ impl<'a> EditProfileView<'a> { } } + pub fn scroll_id() -> egui::Id { + egui::Id::new("edit_profile") + } + // return true to save pub fn ui(&mut self, ui: &mut egui::Ui) -> bool { ScrollArea::vertical() + .id_salt(EditProfileView::scroll_id()) .show(ui, |ui| { banner(ui, self.state.banner(), 188.0); diff --git a/crates/notedeck_columns/src/ui/profile/mod.rs b/crates/notedeck_columns/src/ui/profile/mod.rs @@ -59,8 +59,12 @@ impl<'a, 'd> ProfileView<'a, 'd> { } } + pub fn scroll_id(col_id: usize, profile_pubkey: &Pubkey) -> egui::Id { + egui::Id::new(("profile_scroll", col_id, profile_pubkey)) + } + pub fn ui(&mut self, ui: &mut egui::Ui) -> Option<ProfileViewAction> { - let scroll_id = egui::Id::new(("profile_scroll", self.col_id, self.pubkey)); + let scroll_id = ProfileView::scroll_id(self.col_id, self.pubkey); let offset_id = scroll_id.with("scroll_offset"); let mut scroll_area = ScrollArea::vertical().id_salt(scroll_id); diff --git a/crates/notedeck_columns/src/ui/relay.rs b/crates/notedeck_columns/src/ui/relay.rs @@ -36,6 +36,7 @@ impl RelayView<'_> { ui.add_space(8.0); egui::ScrollArea::vertical() + .id_salt(RelayView::scroll_id()) .scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden) .auto_shrink([false; 2]) .show(ui, |ui| { @@ -51,6 +52,10 @@ impl RelayView<'_> { action } + + pub fn scroll_id() -> egui::Id { + egui::Id::new("relay_scroll") + } } impl<'a> RelayView<'a> { diff --git a/crates/notedeck_columns/src/ui/search/mod.rs b/crates/notedeck_columns/src/ui/search/mod.rs @@ -151,6 +151,7 @@ impl<'a, 'd> SearchView<'a, 'd> { fn show_search_results(&mut self, ui: &mut egui::Ui) -> Option<NoteAction> { egui::ScrollArea::vertical() + .id_salt(SearchView::scroll_id()) .show(ui, |ui| { let reversed = false; TimelineTabView::new( @@ -165,6 +166,10 @@ impl<'a, 'd> SearchView<'a, 'd> { }) .inner } + + pub fn scroll_id() -> egui::Id { + egui::Id::new("search_results") + } } fn execute_search( diff --git a/crates/notedeck_columns/src/ui/timeline.rs b/crates/notedeck_columns/src/ui/timeline.rs @@ -74,6 +74,15 @@ impl<'a, 'd> TimelineView<'a, 'd> { self.reverse = true; self } + + pub fn scroll_id( + timeline_cache: &TimelineCache, + timeline_id: &TimelineKind, + col: usize, + ) -> Option<egui::Id> { + let timeline = timeline_cache.get(timeline_id)?; + Some(egui::Id::new(("tlscroll", timeline.view_id(col)))) + } } #[allow(clippy::too_many_arguments)] @@ -95,7 +104,9 @@ fn timeline_ui( */ - let scroll_id = { + let scroll_id = TimelineView::scroll_id(timeline_cache, timeline_id, col)?; + + { let timeline = if let Some(timeline) = timeline_cache.get_mut(timeline_id) { timeline } else { @@ -114,8 +125,6 @@ fn timeline_ui( // need this for some reason?? ui.add_space(3.0); - - egui::Id::new(("tlscroll", timeline.view_id(col))) }; let show_top_button_id = ui.id().with((scroll_id, "at_top"));