Clip List items that partially overflow

Antonio Scandurra created

Change summary

crates/gpui/src/elements/list.rs | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)

Detailed changes

crates/gpui/src/elements/list.rs 🔗

@@ -1,7 +1,7 @@
 use crate::{
-    point, px, AnyElement, AvailableSpace, BorrowAppContext, Bounds, DispatchPhase, Element,
-    IntoElement, Pixels, Point, ScrollWheelEvent, Size, Style, StyleRefinement, Styled,
-    WindowContext,
+    point, px, AnyElement, AvailableSpace, BorrowAppContext, BorrowWindow, Bounds, ContentMask,
+    DispatchPhase, Element, IntoElement, Pixels, Point, ScrollWheelEvent, Size, Style,
+    StyleRefinement, Styled, WindowContext,
 };
 use collections::VecDeque;
 use refineable::Refineable as _;
@@ -317,7 +317,7 @@ impl Element for List {
 
     fn paint(
         &mut self,
-        bounds: crate::Bounds<crate::Pixels>,
+        bounds: Bounds<crate::Pixels>,
         _state: &mut Self::State,
         cx: &mut crate::WindowContext,
     ) {
@@ -444,13 +444,15 @@ impl Element for List {
         new_items.append(cursor.suffix(&()), &());
 
         // Paint the visible items
-        let mut item_origin = bounds.origin;
-        item_origin.y -= scroll_top.offset_in_item;
-        for item_element in &mut item_elements {
-            let item_height = item_element.measure(available_item_space, cx).height;
-            item_element.draw(item_origin, available_item_space, cx);
-            item_origin.y += item_height;
-        }
+        cx.with_content_mask(Some(ContentMask { bounds }), |cx| {
+            let mut item_origin = bounds.origin;
+            item_origin.y -= scroll_top.offset_in_item;
+            for item_element in &mut item_elements {
+                let item_height = item_element.measure(available_item_space, cx).height;
+                item_element.draw(item_origin, available_item_space, cx);
+                item_origin.y += item_height;
+            }
+        });
 
         state.items = new_items;
         state.last_layout_bounds = Some(bounds);