Take a span child's length from its hint, and ask it once in its slot
A share child was drawn in the measuring room and again in its slot, and one record holding two questions made every local change under it defer to the span. Where a rule or a hint gives the length along the span, the first ask answers nothing the rule does not, so the child is asked once, in its slot; the widgets that always report the whole of their box now say so. A hint with a fraction resolves against the frame and pins it. The dump rig prints every cold layout so a change to it shows in a diff.
This commit is contained in:
1 parent
a888717ee9
commit
f6242aa33c
7 files changed
+120
-33
No files matched your search
+19
-7
@@ -259,17 +259,24 @@ impl<'a> Painter<'a> {
|
||||
declared_lens(self.rsc.widgets(), id.id())
|
||||
}
|
||||
|
||||
/// What a child says its length is without being drawn, if it can say.
|
||||
/// Asking counts as reading its size.
|
||||
/// What a child says its length is without being drawn, if it can say,
|
||||
/// as the length its draw would report: a fraction in it is resolved
|
||||
/// against this widget's frame, which is the frame a child asked with
|
||||
/// nothing narrowed gets. Asking counts as reading its size.
|
||||
pub fn size_hint<W: ?Sized>(&mut self, id: &StrongWidget<W>, axis: Axis) -> Option<LayoutLen> {
|
||||
let widgets = self.rsc.widgets();
|
||||
// A rule is the answer where there is one: it wins over whatever the
|
||||
// widget would draw, so it has to win over what the widget says too.
|
||||
let hint = widgets.size_rules(id.id()).axis(axis).exact().or_else(|| {
|
||||
widgets
|
||||
.get_dyn(id.id())
|
||||
.and_then(|widget| widget.size_hint(axis))
|
||||
});
|
||||
let hint = widgets
|
||||
.size_rules(id.id())
|
||||
.axis(axis)
|
||||
.exact()
|
||||
.or_else(|| {
|
||||
widgets
|
||||
.get_dyn(id.id())
|
||||
.and_then(|widget| widget.size_hint(axis))
|
||||
})
|
||||
.map(|hint| hint.within_len(self.frame.axis(axis)));
|
||||
#[cfg(feature = "layout-diagnostics")]
|
||||
diag::hint_read(id.id(), self.id, axis, hint);
|
||||
match hint {
|
||||
@@ -277,6 +284,11 @@ impl<'a> Painter<'a> {
|
||||
#[cfg(feature = "layout-diagnostics")]
|
||||
diag::bump(Counter::HintHits);
|
||||
self.depend_on(id);
|
||||
// A fraction was just resolved against this frame, so what
|
||||
// this draw does with it is a function of the frame's length.
|
||||
if hint.rel != Rel::ZERO {
|
||||
self.frame_own_len[axis as usize] = Some(self.frame.axis(axis));
|
||||
}
|
||||
Some(hint)
|
||||
}
|
||||
None => {
|
||||
|
||||
Reference in new issue
Block a user