Stop a scroll asking a question it has already answered
A seventh sweep, over the parts no earlier round named: the tree generator
and the scenario harness, `Fixed`, the headless rig, and once more over the
commit the sixth sweep left, which was itself unreviewed.
`Scroll`'s content box is `answer_px.max(container_len)`, so a scroll whose
content fits has nothing to scroll through and `update_amt` has already put
`amt` at zero. The test choosing between the viewport and a scrolled span
asked `amt != ZERO || content_len != container_len`, where the first
disjunct can never decide it -- the same defect `b7b8d09` removed from the
line above, one operand over. A `debug_assert` of the implication held
across the whole suite, including every scrolling test.
`Fixed::to_scale` and its private `shift_round` arrived on this branch with
no caller and never got one; the only thing that called either was the test
written for them.
`Len::align` wrote `Len` arithmetic out a component at a time, around an
`at.px` that is always zero, where `Len::scale` and the `Add`/`Sub` beside
it say the whole rule in two lines. `LayoutLen::without_leftover` took
`self` where the `apply_leftover` its own doc calls the opposite reading of
the same value takes `&self`.
`run-headless.sh --resize` changed the output's mode but not `out_w`/`out_h`,
which is the extent `replay-touch` scales a recording against -- so
`--resize` with `--replay` put every sample of the gesture somewhere else
and still finished like a run that worked. Both come from one function now.
The generator's plan/build split stranded a comment: "a row takes the height
it is given" describes the size rule `build` derives from `dir`, and it was
left above the `gap` draw, which is the one line it is not about and which
does consume randomness.
Format, clippy with and without layout-diagnostics, and the suite (131 + 19
+ 13 + 4) are clean. The cold dump over 400 depth-5 trees is byte-identical
to b7b8d09 across all 34,492 boxes, and all three seed scans pass: 400 at
depth 5 in 62.75s, 1,000 at depth 6 in 162.37s, 2,000 at depth 4 in 305.25s.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b7b8d09e40
commit
f8aa0c5cdf
6 files changed
+29
-48
No files matched your search
+4
-4
@@ -773,10 +773,6 @@ impl Sow<'_> {
|
||||
self.spans += 1;
|
||||
let edit = self.edits.spans.get(&idx).cloned().unwrap_or_default();
|
||||
let dir = self.rng.below(4);
|
||||
// A row takes the height it is given rather than its tallest child,
|
||||
// which is a rule beside it. Derived from an existing choice and
|
||||
// consuming no randomness: a seed must keep growing the same tree
|
||||
// when the generator gains another configuration.
|
||||
let gap = self.rng.below(3) as i32 * 4;
|
||||
let grown: Vec<usize> = (0..children.len()).collect();
|
||||
let order = span_edited(&grown, children.len(), spares.len(), &edit);
|
||||
@@ -915,6 +911,10 @@ impl<Rsc: UiRsc + 'static> Build<'_, Rsc> {
|
||||
gap: Px::from_int(*gap),
|
||||
}
|
||||
.add(self.rsc);
|
||||
// A row takes the height it is given rather than its tallest
|
||||
// child, which is a rule beside the span rather than anything
|
||||
// it draws. Derived from `dir` rather than stored, so a plan
|
||||
// that says the direction says this too.
|
||||
if dir.axis == Axis::X {
|
||||
self.rsc
|
||||
.widgets_mut()
|
||||
|
||||
@@ -45,13 +45,14 @@ impl Widget for Scroll {
|
||||
painter.holds(self.axis, Px::MIN..=left);
|
||||
}
|
||||
|
||||
// Content that fills the viewport and has not been scrolled is the
|
||||
// viewport, and is handed back as it came. Writing the same box as
|
||||
// its own length in pixels is the same box in another form, and the
|
||||
// two do not round alike: a part centred in `rel 1` lands a step from
|
||||
// one centred in `px 900`, since halving a difference is not halving
|
||||
// each part of it.
|
||||
let content = match self.amt != Px::ZERO || self.content_len != self.container_len {
|
||||
// Content that fills the viewport is the viewport, and is handed back
|
||||
// as it came -- it has nothing to scroll through, so the clamp above
|
||||
// has already put `amt` at zero. Writing the same box as its own
|
||||
// length in pixels is the same box in another form, and the two do
|
||||
// not round alike: a part centred in `rel 1` lands a step from one
|
||||
// centred in `px 900`, since halving a difference is not halving each
|
||||
// part of it.
|
||||
let content = match self.content_len > self.container_len {
|
||||
true => {
|
||||
let start = Len::from_parts(Rel::ZERO, -self.amt);
|
||||
UiSpan::new(start, start.offset(self.content_len)).shifted_desc()
|
||||
|
||||
Reference in new issue
Block a user