Ask whether a rule gives the length, not whether there is one

`Painter::ruled` answered "is there a rule beside me on this axis", which is
the same question as "is my report moot" only while `Exact` is the only rule
there is. `Min`, `Max` and `Clamp` are queued, and under one of those the
answer is still the widget's to give and a span across itself still has to
read its children -- so the name would have been true and the meaning wrong,
which is the worst way for a predicate to age.

It is `has_exact_size` now, over `SizeRule::exact` rather than `known`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
iris-aiandClaude Opus 5 committed 2026-09-16 13:40:51 -04:00
1 parent a8898aaa54
commit 490918b789
4 files changed
+24 -17

No files matched your search

+12 -8
View File
@@ -222,7 +222,7 @@ impl<'a> Painter<'a> {
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).known().or_else(|| {
let hint = widgets.size_rules(id.id()).axis(axis).exact().or_else(|| {
widgets
.get_dyn(id.id())
.and_then(|widget| widget.size_hint(axis))
@@ -360,17 +360,21 @@ impl<'a> Painter<'a> {
self.rsc.widgets().alignment(self.id)
}
/// Whether a rule beside this widget settles its length on `axis`, which
/// makes whatever it reports for that axis moot. The widget under a rule
/// does not otherwise learn of it -- this is for a container deciding
/// whether reading its children across an axis is worth anything, since
/// reading one is also what makes its own size depend on it.
pub fn ruled(&self, axis: Axis) -> bool {
/// Whether a rule beside this widget gives its length on `axis` outright,
/// which makes whatever it reports for that axis moot. A rule that only
/// bounds the length is not one of these: the answer is still the
/// widget's to give, and something still has to work it out.
///
/// The widget under a rule does not otherwise learn of it -- this is for
/// a container deciding whether reading its children across an axis is
/// worth anything, since reading one is also what makes its own size
/// depend on it.
pub fn has_exact_size(&self, axis: Axis) -> bool {
self.rsc
.widgets()
.size_rules(self.id)
.axis(axis)
.known()
.exact()
.is_some()
}