From e62633f7e857f88dcc869b826b9b4c31f34659dd Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Fri, 17 Feb 2023 12:28:01 +1300 Subject: [PATCH] Remember heights of rendered posts, use for more accurate scrolling --- src/ui/feed/mod.rs | 15 ++++++++++++--- src/ui/mod.rs | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ui/feed/mod.rs b/src/ui/feed/mod.rs index 437dd2d8..1a100212 100644 --- a/src/ui/feed/mod.rs +++ b/src/ui/feed/mod.rs @@ -172,13 +172,16 @@ fn render_post_maybe_fake( // If too far off of the screen, don't actually render the post, just make some space // so the scrollbar isn't messed up - let estimated_height = estimate_height(&event, maybe_person); + let height = match app.height.get(&id) { + Some(h) => *h, + None => estimate_height(&event, maybe_person), + }; let after_the_bottom = pos2.y > screen_rect.max.y; - let before_the_top = pos2.y + estimated_height < 0.0; + let before_the_top = pos2.y + height < 0.0; if after_the_bottom || before_the_top { // Don't actually render, just make space for scrolling purposes - ui.add_space(estimated_height); + ui.add_space(height); // Yes, and we need to fake render threads to get their approx height too. if threaded && !as_reply_to { @@ -234,6 +237,8 @@ fn render_post_actual( } let event = maybe_event.unwrap(); + let top = ui.next_widget_position(); + // Only render TextNote events let enable_reposts = GLOBALS.settings.blocking_read().reposts; if event.kind != EventKind::TextNote && !(enable_reposts && (event.kind == EventKind::Repost)) { @@ -301,6 +306,10 @@ fn render_post_actual( app.viewed.insert(id); } + // Store actual rendered height for future reference + let bottom = ui.next_widget_position(); + app.height.insert(id, bottom.y - top.y); + ui.separator(); if threaded && !as_reply_to { diff --git a/src/ui/mod.rs b/src/ui/mod.rs index a3b10763..8f837c52 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -89,6 +89,7 @@ struct GossipUi { render_raw: Option, render_qr: Option, viewed: HashSet, + height: HashMap, // Person page rendering ('npub', 'nprofile', or 'lud06') person_qr: Option<&'static str>, @@ -231,6 +232,7 @@ impl GossipUi { render_raw: None, render_qr: None, viewed: HashSet::new(), + height: HashMap::new(), person_qr: None, setting_active_person: false, page: start_page,