Correct the frame-as-length step: Part::of is untouched, movement paths merge

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
iris-aiandClaude Fable 5.1 committed 2026-09-18 19:59:38 -04:00
1 parent e0b4308de4
commit da1807664a
1 file changed
+11 -16
+11 -16
View File
@@ -283,22 +283,19 @@ pub struct Painter<'a> {
... ...
} }
impl Part {
/// Where it lands in the coordinates `extent` is in. A `From` span is in
/// the asking widget's frame lengths, which `frame` says in the node's.
pub(crate) fn of(self, extent: UiSpan, frame: Len) -> UiSpan {
match self {
Self::All => extent,
Self::From(span) => UiSpan::new(
extent.start + span.start.within_len(frame),
extent.start + span.end.within_len(frame),
),
Self::Of(span) => span.within(&extent),
}
}
}
``` ```
`Part::of` does not change: with one unit a `From` span is already a
window-unit length, so a span's cursor, `far`, `room` and slots stay as they
are and only its shares boundary reads `room.to_px(window)`. Two places
resolve through a frame: a reported fraction (`in_parent_frame`, now
`size.within_len(child_frame)`) and a declared one (`narrowed_by`, then a
`Sized` part placed by alignment). A widget's own frame reads convert once,
`Holds::at(frame_px).through(frame)`, the exact preimage of the `to_px` that
made them. `recompose_subtree` and `reposition` become one operation, since
a child's box is always `Part::of(parent box, place)`; `asked_px` is the
window.
A child's frame is `narrow.within_len(parent.frame)` where the caller or a A child's frame is `narrow.within_len(parent.frame)` where the caller or a
rule narrowed it, else the parent's; a declared length also decides the box rule narrowed it, else the parent's; a declared length also decides the box
(`len` placed in the part by alignment, as `frame_and_extent` does today), (`len` placed in the part by alignment, as `frame_and_extent` does today),
@@ -329,8 +326,6 @@ What this changes in the core, and why it is not merely more code:
- `in_parent` no longer maps a child's frame holds through the frame length - `in_parent` no longer maps a child's frame holds through the frame length
per level: every widget holds for the window's pixels, so the holds `and` per level: every widget holds for the window's pixels, so the holds `and`
directly, at region nodes too. directly, at region nodes too.
- `Part::of` gains one `within_len` per `From` end. `Of` and `All` are as
they were.
- `DrawInfo::frame`/`frame_abs`, `ActiveData::frame`/`frame_abs`, `local` - `DrawInfo::frame`/`frame_abs`, `ActiveData::frame`/`frame_abs`, `local`
in `Placing`, `recompose_subtree` and `asked_px` all change meaning: in `Placing`, `recompose_subtree` and `asked_px` all change meaning:
`frame` is a `UiVec2` length, `frame_abs` goes, a node's move entry is a `frame` is a `UiVec2` length, `frame_abs` goes, a node's move entry is a