Clip List items that partially overflow

This commit is contained in:
Antonio Scandurra 2024-01-04 15:12:25 +01:00
parent f6af7ab27c
commit b78497bf54

View file

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