Hand a redrawn widget the mask it inherited, not its own
`ActiveData::mask` is the mask a widget's drawing is clipped to, which is either one it set itself or the one it inherited. `redraw` passed it back as the *inherited* mask, so a `Masked` widget settled on its own was handed its own mask and `set_mask` asserted -- a panic on any local redraw of one, for as long as there has been a local-redraw path. The two are separate facts, so `parent_mask` keeps the second. That also states the question `remap_subtree` was asking. It compared a widget's mask with the one threaded down from its parent to find out whether the widget owned it; the comparison is now between the two fields on the widget, which is the same question asked where the answer lives, and the parameter goes. Checked: fmt, clippy, 87 suite tests including the new one, which panics without this; 18 core unit tests; the release oracle at 100 seeds; the fifteen shrinker cases at 400 seeds of depth 5; and `tabs` renders byte-identical at 1920x1200. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
32542d0c0b
commit
ea6dbae0dc
3 files changed
+35
-14
No files matched your search
@@ -613,3 +613,18 @@ fn a_stacks_sizing_child_is_drawn_once_where_it_belongs() {
|
||||
assert_ne!(layer(front.id()), layer(background.id()));
|
||||
assert_eq!(draws.get(), 1);
|
||||
}
|
||||
|
||||
/// A widget's own mask is not the one it inherited, and a redraw of it
|
||||
/// inherits the second: handing back the first is handing it its own mask to
|
||||
/// set a second time, which `set_mask` asserts against.
|
||||
#[test]
|
||||
fn a_masked_widget_redrawn_on_its_own_sets_its_mask_again() {
|
||||
let mut h = Harness::new((400, 200));
|
||||
let inner = rect(Color::BLUE).add(&mut h.rsc);
|
||||
let masked = inner.masked().add(&mut h.rsc);
|
||||
let other = rect(Color::RED).width(100).add(&mut h.rsc);
|
||||
h.set_root((other, masked).span(Dir::RIGHT));
|
||||
h.rsc.widgets_mut().get_dyn_mut(masked.id());
|
||||
h.frame();
|
||||
assert_corners!(h, inner, (100, 0), (400, 200));
|
||||
}
|
||||
Reference in new issue
Block a user