Ask each child once and place its answer by re-expression
A widget draws in the box it is asked in and its answer is placed inside that box by re-expressing the drawing; nothing is drawn again in a box an answer chose. The offer machinery, whose job was to tell a measuring draw from a placing one, goes with the placing draw. A span measures each child from its cursor and moves fixed children to their slots with place_at; a share child is asked once more in its decided slot with its frame narrowed to it. A stack asks non-sizing children in the box its sizing child decided. A scroll asks its content once and moves it to the scrolled offset. A local redraw asks the retained question again and puts the answer back where the parent placed it. A symbolic length a child pinned composes through Part::Of exactly where the part is the whole box less pixels, and pins the parent's own length otherwise; dropping it let a pad reuse a drawing across a narrowed frame of the same pixel length (shrinker seeds 60, 248 and 384 at depth 5). Suite 114/114 including the two decided-box pins, fast oracle 11/11, shrinker 400 seeds at depth 5 over all fifteen cases. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
4328eac756
commit
3091fb86df
12 files changed
+353
-354
No files matched your search
@@ -23,19 +23,26 @@ impl Widget for Stack {
|
||||
Some((i, child)) => {
|
||||
painter.child_layer_at(i);
|
||||
painter
|
||||
.widget_at(child, UiRegion::FULL, [Place::Fill(Part::All); 2])
|
||||
.widget_at(child, [None; 2], [Place::Fill(Part::All); 2])
|
||||
.size()
|
||||
}
|
||||
None => Size::LEFTOVER,
|
||||
};
|
||||
// Every other child gets the box the sizing child decided: the
|
||||
// stack is that length, so that is the box they are asked in, and a
|
||||
// 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 narrow = [Axis::X, Axis::Y].map(|axis| {
|
||||
let len = size.axis(axis);
|
||||
(len.leftover == Weight::ZERO).then(|| Len::from_parts(len.rel, len.px))
|
||||
});
|
||||
for (i, child) in self.children.iter().enumerate() {
|
||||
if sizing == Some(i) {
|
||||
continue;
|
||||
}
|
||||
painter.child_layer_at(i);
|
||||
// Every other child is drawn in the stack's own box, and where it
|
||||
// sits in one bigger than itself is its own business.
|
||||
painter.widget(child);
|
||||
painter.widget_at(child, narrow, [Place::Within(Part::All); 2]);
|
||||
}
|
||||
size
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user