Retain frame and extent dependencies independently
Keep the original measurement placement separate from the assigned slot.
Validate frame and extent lengths before reusing an answer or drawing, and
represent hint-only records as having no measured answer.
Retain primitive and mask coordinates with their frame/extent reference.
Forwarded children follow a reused wrapper's placement without rerunning
valid draw bodies. Keep the single Widget::draw API.
Restore the eight failing suite cases from the region/placement prototype,
with regressions for mixed coordinate references, a changed inherited
extent, the sizing-stack fraction, and an undrawn share becoming visible.
This remains experimental: nested container updates do substantially more
work than e44dea3 despite restoring the leaf and wrapper reuse guarantees.
Do not merge it as a performance improvement.
This commit is contained in:
1 parent
5fcace1bfa
commit
efb416bbc3
14 files changed
+548
-166
No files matched your search
@@ -0,0 +1,33 @@
|
||||
use crate::{Axis, Holds, PxVec2, UiRegion};
|
||||
|
||||
/// Dependencies of one evaluation, before the frame and extent are composed.
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
pub struct LayoutHolds {
|
||||
pub frame: [Holds; 2],
|
||||
pub extent: [Holds; 2],
|
||||
pub placement: Option<UiRegion>,
|
||||
}
|
||||
|
||||
impl LayoutHolds {
|
||||
pub const ANY: Self = Self {
|
||||
frame: [Holds::ANY; 2],
|
||||
extent: [Holds::ANY; 2],
|
||||
placement: None,
|
||||
};
|
||||
|
||||
pub fn contains(self, px: PxVec2, placement: UiRegion) -> bool {
|
||||
self.placement.is_none_or(|old| old == placement)
|
||||
&& [Axis::X, Axis::Y].into_iter().all(|axis| {
|
||||
self.frame[axis as usize].contains(px.axis(axis))
|
||||
&& self.extent[axis as usize]
|
||||
.contains(placement.axis(axis).len().to_px(px.axis(axis)))
|
||||
})
|
||||
}
|
||||
|
||||
pub fn in_frame(self, placement: UiRegion) -> [Holds; 2] {
|
||||
[Axis::X, Axis::Y].map(|axis| {
|
||||
self.frame[axis as usize]
|
||||
.and(self.extent[axis as usize].through(placement.axis(axis).len()))
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user