From ea2a4858b7130d4c833eab00bd62b9b83d57d64c Mon Sep 17 00:00:00 2001
From: Hichem <hichem.f@live.de>
Date: Mon, 8 Apr 2024 17:41:03 +0200
Subject: [PATCH] Fix scrolling to the end within a popup (#10181)

when the available height for the popup is low/small, then it is not
possible to scroll until the end

Signed-off-by: Ben Fekih, Hichem <hichem.f@live.de>
---
 helix-term/src/ui/popup.rs | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/helix-term/src/ui/popup.rs b/helix-term/src/ui/popup.rs
index 4f379b4a..124b4402 100644
--- a/helix-term/src/ui/popup.rs
+++ b/helix-term/src/ui/popup.rs
@@ -283,16 +283,20 @@ impl<T: Component> Component for Popup<T> {
             (height + self.margin.height()).min(max_height),
         );
 
-        // re-clamp scroll offset
-        let max_offset = self.child_size.1.saturating_sub(self.size.1);
-        self.scroll = self.scroll.min(max_offset as usize);
-
         Some(self.size)
     }
 
     fn render(&mut self, viewport: Rect, surface: &mut Surface, cx: &mut Context) {
         let area = self.area(viewport, cx.editor);
         self.area = area;
+
+        // required_size() calculates the popup size without taking account of self.position
+        // so we need to correct the popup height to correctly calculate the scroll
+        self.size.1 = area.height;
+
+        // re-clamp scroll offset
+        let max_offset = self.child_size.1.saturating_sub(self.size.1);
+        self.scroll = self.scroll.min(max_offset as usize);
         cx.scroll = Some(self.scroll);
 
         // clear area