ui: Fix scrollbar content size calculation for non-uniform lists with single element (#20237)

Previously we were always adding the origin coordinate of last item to
the content size, which is incorrect when the list has just one item; in
that case, we should just use the size of that item as the content size
of a list.

Closes #ISSUE

Release Notes:

- N/A
This commit is contained in:
Piotr Osiewicz 2024-11-05 14:32:13 +01:00 committed by GitHub
parent a26c0a8537
commit 4097118070
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 5 deletions

View file

@ -37,13 +37,14 @@ impl ScrollableHandle {
}),
ScrollableHandle::NonUniform(handle) => {
let last_children_index = handle.children_count().checked_sub(1)?;
// todo: PO: this is slightly wrong for horizontal scrollbar, as the last item is not necessarily the longest one.
let mut last_item = handle.bounds_for_item(last_children_index)?;
last_item.size.height += last_item.origin.y;
last_item.size.width += last_item.origin.x;
let mut scroll_adjustment = None;
if last_children_index != 0 {
// todo: PO: this is slightly wrong for horizontal scrollbar, as the last item is not necessarily the longest one.
let first_item = handle.bounds_for_item(0)?;
last_item.size.height += last_item.origin.y;
last_item.size.width += last_item.origin.x;
scroll_adjustment = Some(first_item.origin);
last_item.size.height -= first_item.origin.y;
@ -140,6 +141,7 @@ impl ScrollbarState {
}) {
current_offset -= adjustment;
}
let mut percentage = current_offset / main_dimension_size;
let viewport_size = self.scroll_handle.viewport().size;
let end_offset = (current_offset + viewport_size.along(axis).0) / main_dimension_size;