Move LazySpan rows through one retained offset
This commit is contained in:
1 parent
992482414f
commit
f95835593f
8 files changed
+453
-50
No files matched your search
@@ -37,6 +37,67 @@ impl Widget for FixedRect {
|
||||
}
|
||||
}
|
||||
|
||||
struct ChildOffset {
|
||||
child: StrongWidget,
|
||||
offset: Vec2,
|
||||
}
|
||||
|
||||
impl Widget for ChildOffset {
|
||||
fn draw(&mut self, painter: &mut Painter) -> Size {
|
||||
painter.set_child_offset(self.offset);
|
||||
painter.widget(&self.child)
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_child_coordinate_offset_moves_only_the_child_subtree() {
|
||||
let mut rsc = TestRsc {
|
||||
ui: UiData::default(),
|
||||
};
|
||||
let child = rsc.ui.widgets.add_strong(FixedRect(40.0));
|
||||
let child_weak = child.weak();
|
||||
let parent = rsc.ui.widgets.add_strong(ChildOffset {
|
||||
child: child.any(),
|
||||
offset: vec2(0.0, 15.0),
|
||||
});
|
||||
let parent_weak = parent.weak();
|
||||
// Keep the coordinate-owning widget below the root: a nested widget is
|
||||
// normally redrawn when its parent visits it, which takes a different
|
||||
// retained-state path from `UiRenderState::redraw` on the root itself.
|
||||
let outer = rsc.ui.widgets.add_strong(Sized {
|
||||
inner: parent.any(),
|
||||
x: None,
|
||||
y: None,
|
||||
});
|
||||
let outer_weak = outer.weak();
|
||||
let root = outer.any();
|
||||
let mut render = UiRenderState::new();
|
||||
render.resize((100.0, 100.0));
|
||||
render.update(&root, &mut rsc);
|
||||
render.take_counters();
|
||||
|
||||
let parent_before = render.window_region(&parent_weak, &rsc).unwrap();
|
||||
let child_before = render.window_region(&child_weak, &rsc).unwrap();
|
||||
assert!((parent_before.top_left.y - 0.0).abs() < 0.01);
|
||||
assert!((child_before.top_left.y - 15.0).abs() < 0.01);
|
||||
|
||||
rsc.ui.widgets.get_mut(&parent_weak).unwrap().offset.y = 35.0;
|
||||
// Force the ordinary ancestor-redraw path rather than letting the
|
||||
// renderer visit only the dirty descendant directly.
|
||||
rsc.ui.widgets.get_mut(&outer_weak).unwrap().x = None;
|
||||
render.update(&root, &mut rsc);
|
||||
let (draws, rewrites, moves, _shapes) = render.take_counters();
|
||||
let parent_after = render.window_region(&parent_weak, &rsc).unwrap();
|
||||
let child_after = render.window_region(&child_weak, &rsc).unwrap();
|
||||
|
||||
assert_eq!((draws, rewrites, moves), (2, 0, 1));
|
||||
assert_eq!(
|
||||
parent_after, parent_before,
|
||||
"the container itself stays put"
|
||||
);
|
||||
assert!((child_after.top_left.y - 35.0).abs() < 0.01);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_hinted_rest_draws_once_and_only_moves_the_fixed_child_after_it() {
|
||||
let mut rsc = TestRsc {
|
||||
|
||||
Reference in new issue
Block a user