mod(element/scrollable): ensure minSize returns correct dimensions
Some checks failed
Zig Project Action / Lint, Spell-check and test zig project (push) Failing after 56s

Enforce that `minSize` returns a `Point` with corresponding minimal
dimensions with respect to the provided available size. This means that
an `Element` implementation that provides a `minSize` function may even
return a too small dimension, which would automatically be resized to be
at least as big as the provided size.
This commit is contained in:
2025-11-01 14:37:14 +01:00
parent f70ea05244
commit 7cd1fb139f

View File

@@ -23,15 +23,26 @@ pub fn Element(Model: type, Event: type) type {
}; };
/// Request the minimal size required for this `Element` the provided /// Request the minimal size required for this `Element` the provided
/// available *size* can be used as a fallback. This is currently only /// available *size* can be used as a fallback. This function ensures
/// used for `Scrollable` elements, such that the nested element in /// that the minimal size returned has at least the dimensions of the
/// the `Scrollable`'s `Container` can request a minimal size for its /// available *size*.
/// contents. ///
/// If the associated `Container`'s size is known at compile time (and
/// does not change) the size can be directly provided through the
/// `.size` Property for the `Container` instead. In this case you
/// should not implement / use this function.
///
/// Currently only used for `Scrollable` elements, such that the
/// directly nested element in the `Scrollable`'s `Container` can
/// request a minimal size for its contents.
pub inline fn minSize(this: @This(), size: Point) Point { pub inline fn minSize(this: @This(), size: Point) Point {
return if (this.vtable.minSize) |minSize_fn| if (this.vtable.minSize) |minSize_fn| {
minSize_fn(this.ptr, size) const min_size = minSize_fn(this.ptr, size);
else return .{
size; .x = @max(size.x, min_size.x),
.y = @max(size.y, min_size.y),
};
} else return size;
} }
/// Resize the corresponding `Element` with the given *size*. /// Resize the corresponding `Element` with the given *size*.