notedeck

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

commit 1244be4481c51e82cda12f302c7c647c1c55dd4b
parent fdde0244e284fc8f8a061f67658bbe2b036c726f
Author: kernelkind <kernelkind@gmail.com>
Date:   Fri, 24 Oct 2025 10:59:32 -0400

feat(composite-cluster): do culling for pfps

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

Diffstat:
Mcrates/notedeck_columns/src/ui/timeline.rs | 34+++++++++++++++++++++++++---------
1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/crates/notedeck_columns/src/ui/timeline.rs b/crates/notedeck_columns/src/ui/timeline.rs @@ -913,14 +913,30 @@ fn render_profiles( .scroll_bar_visibility(ScrollBarVisibility::AlwaysHidden) .show(ui, |ui| { profiling::scope!("scroll area closure"); - let mut last_pfp_resp = None; + let clip_rect = ui.clip_rect(); + let mut last_resp = None; + + let mut rendered = false; for entry in profiles_to_show { + let (rect, _) = ui.allocate_exact_size(vec2(24.0, 24.0), Sense::click()); + let should_render = rect.intersects(clip_rect); + + if !should_render { + if rendered { + break; + } else { + continue; + } + } + profiling::scope!("actual rendering individual pfp"); - let mut resp = ui.add( - &mut ProfilePic::from_profile_or_default(img_cache, entry.record.as_ref()) + + let mut widget = + ProfilePic::from_profile_or_default(img_cache, entry.record.as_ref()) .size(24.0) - .sense(Sense::click()), - ); + .sense(Sense::click()); + let mut resp = ui.put(rect, &mut widget); + rendered = true; if let Some(record) = entry.record.as_ref() { resp = resp.on_hover_ui_at_pointer(|ui| { @@ -929,14 +945,14 @@ fn render_profiles( }); } - last_pfp_resp = Some(resp.clone()); - if resp.clicked() { - action = Some(NoteAction::Profile(*entry.pk)) + action = Some(NoteAction::Profile(*entry.pk)); } + + last_resp = Some(resp); } - last_pfp_resp + last_resp }) .inner });