One argument says where a child goes and what its fractions are of
`Place` was a product written as a sum -- a `Part` and a fill flag -- and `Part` named three operations the geometry already had, under words that did not match them. `Of` was `UiSpan::within`, `From` was `UiSpan::shift`, and `Sized` was `placement`'s own body with the length given rather than reported. Both enums are gone. `PlaceDescAxis` says one axis, named after the operation it performs: `within`, `shifted`, `sized`, and `WHOLE`. What is optional is a builder -- `fills` and `rel_base` -- so a caller writes only what it decided, and the rel base it does not write follows the constructor: a span composed into the caller's box narrows it, a span along a cursor does not, a decided length is it. That was the one rule a caller could get wrong with nothing failing. `PlaceDesc` says both axes with named fields, so `axis`, `axis_mut` and `from_axis` work the way they do on every other pair here, and the joint work -- resolving a region, reading the fill flags -- is written once rather than per axis. `widget_at` and `place_at` take `impl Into<PlaceDesc>`, so a wrapper passes a `UiRegion` and says nothing else. `widget_within` and `ActiveData::narrow_rel_base` are deleted; `asked` and `placed` carry the rel base their ask stated. Cold layout is byte-identical to `84dad21`.
This commit is contained in:
1 parent
c55be21761
commit
58ce74dd7d
12 files changed
+367
-271
No files matched your search
@@ -22,9 +22,7 @@ impl Widget for Stack {
|
||||
// drawing belongs to the layer it was made on.
|
||||
Some((i, child)) => {
|
||||
painter.child_layer_at(i);
|
||||
painter
|
||||
.widget_at(child, [Place::Fill(Part::WHOLE); 2], None)
|
||||
.size()
|
||||
painter.widget_at(child, PlaceDesc::WHOLE.fills()).size()
|
||||
}
|
||||
None => Size::LEFTOVER,
|
||||
};
|
||||
@@ -33,19 +31,20 @@ impl Widget for Stack {
|
||||
// fraction under them is a fraction of it. A share leaves the axis
|
||||
// to whoever gave the stack its box. Where a child sits in a box
|
||||
// bigger than itself is its own business.
|
||||
let place = [Axis::X, Axis::Y].map(|axis| {
|
||||
let on = |axis| {
|
||||
let len = size.axis(axis);
|
||||
match len.leftover == Weight::ZERO {
|
||||
true => Place::Fill(Part::Sized(Len::from_parts(len.rel, len.px))),
|
||||
false => Place::Within(Part::WHOLE),
|
||||
true => PlaceDescAxis::sized(Len::from_parts(len.rel, len.px)).fills(),
|
||||
false => PlaceDescAxis::WHOLE,
|
||||
}
|
||||
});
|
||||
};
|
||||
let place = PlaceDesc::new(on(Axis::X), on(Axis::Y));
|
||||
for (i, child) in self.children.iter().enumerate() {
|
||||
if sizing == Some(i) {
|
||||
continue;
|
||||
}
|
||||
painter.child_layer_at(i);
|
||||
painter.widget_at(child, place, None);
|
||||
painter.widget_at(child, place);
|
||||
}
|
||||
size
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user