Keep retained masks and reparented drawings alive, and advance collapsed slots
This commit is contained in:
1 parent
cadfba05dd
commit
add6774980
6 files changed
+229
-9
No files matched your search
+17
-3
@@ -35,6 +35,8 @@ pub struct Painter<'a> {
|
||||
pub(super) textures: Vec<TextureHandle>,
|
||||
pub(super) primitives: Vec<RetainedPrimitive>,
|
||||
pub(super) mask_region: Option<UiRegion>,
|
||||
/// The previous drawing's owned mask, available for this draw to reclaim.
|
||||
pub(super) mask_slot: Option<MaskIdx>,
|
||||
/// Only children whose answers were read constrain this widget's answer.
|
||||
pub(super) answer_under: LayoutHolds,
|
||||
pub(super) children: Vec<WidgetId>,
|
||||
@@ -104,7 +106,6 @@ impl<'a> Painter<'a> {
|
||||
|
||||
fn push_primitive(&mut self, h: RetainedPrimitive) {
|
||||
if self.mask != MaskIdx::NONE {
|
||||
// TODO: I have no clue if this works at all :joy:
|
||||
self.rsc.ui_mut().masks.push_ref(self.mask);
|
||||
}
|
||||
self.primitives.push(h);
|
||||
@@ -129,10 +130,23 @@ impl<'a> Painter<'a> {
|
||||
assert!(self.mask == MaskIdx::NONE);
|
||||
let resolved = self.resolve(region);
|
||||
let move_idx = self.move_idx;
|
||||
self.mask = self.rsc.ui_mut().masks.push(Mask {
|
||||
let mask = Mask {
|
||||
region: resolved,
|
||||
move_idx,
|
||||
});
|
||||
};
|
||||
let masks = &mut self.rsc.ui_mut().masks;
|
||||
self.mask = match self.mask_slot.take() {
|
||||
Some(idx) => {
|
||||
*masks.get_mut(idx) = mask;
|
||||
idx
|
||||
}
|
||||
None => {
|
||||
let idx = masks.push(mask);
|
||||
// The owner keeps the slot alive even with no primitives.
|
||||
masks.push_ref(idx);
|
||||
idx
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/// Draws a widget in the whole of this widget's own box, with the frame
|
||||
|
||||
Reference in new issue
Block a user