Tidy up z-index handling

Co-Authored-By: Antonio Scandurra <antonio@zed.dev>
This commit is contained in:
Kirill Bulatov
2023-12-19 23:50:42 +02:00
co-authored by Antonio Scandurra
parent f6d31917c1
commit cf12d62fc5
10 changed files with 31 additions and 182 deletions
+9 -8
View File
@@ -1448,14 +1448,15 @@ impl Interactivity {
}
cx.with_z_index(style.z_index.unwrap_or(0), |cx| {
if style.background.as_ref().is_some_and(|fill| {
fill.color().is_some_and(|color| !color.is_transparent())
}) {
cx.add_opaque_layer(bounds)
}f(style, scroll_offset.unwrap_or_default(), cx)
})
},
);
if style.background.as_ref().is_some_and(|fill| {
fill.color().is_some_and(|color| !color.is_transparent())
}) {
cx.add_opaque_layer(bounds)
}
f(style, scroll_offset.unwrap_or_default(), cx)
})
},
);
if let Some(group) = self.group.as_ref() {
GroupBounds::pop(group, cx);
+1 -1
View File
@@ -1,7 +1,7 @@
use std::sync::Arc;
use crate::{
point, size, Bounds, DevicePixels, Element, ImageData, InteractiveElement,
point, size, BorrowWindow, Bounds, DevicePixels, Element, ImageData, InteractiveElement,
InteractiveElementState, Interactivity, IntoElement, LayoutId, Pixels, SharedString, Size,
StyleRefinement, Styled, WindowContext,
};
-114
View File
@@ -856,117 +856,3 @@ impl Bounds<ScaledPixels> {
.expect("Polygon should not be empty")
}
}
// todo!()
// #[cfg(test)]
// mod tests {
// use super::*;
// use crate::{point, px, size, Size};
// use smallvec::smallvec;
// #[test]
// fn test_scene() {
// let mut scene = SceneBuilder::default();
// assert_eq!(scene.layers_by_order.len(), 0);
// // div with z_index(1)
// // glyph with z_index(1)
// // div with z_index(1)
// // glyph with z_index(1)
// scene.insert(
// &smallvec![1].into(),
// quad(
// point(px(0.), px(0.)),
// size(px(100.), px(100.)),
// crate::black(),
// ),
// );
// scene.insert(
// &smallvec![1, 1].into(),
// sprite(
// point(px(0.), px(0.)),
// size(px(10.), px(10.)),
// crate::white(),
// ),
// );
// scene.insert(
// &smallvec![1].into(),
// quad(
// point(px(10.), px(10.)),
// size(px(20.), px(20.)),
// crate::green(),
// ),
// );
// scene.insert(
// &smallvec![1, 1].into(),
// sprite(point(px(15.), px(15.)), size(px(5.), px(5.)), crate::blue()),
// );
// assert!(!scene.layers_by_order.is_empty());
// for batch in scene.build().batches() {
// println!("new batch");
// match batch {
// PrimitiveBatch::Quads(quads) => {
// for quad in quads {
// if quad.background == crate::black() {
// println!(" black quad");
// } else if quad.background == crate::green() {
// println!(" green quad");
// } else {
// todo!(" ((( bad quad");
// }
// }
// }
// PrimitiveBatch::MonochromeSprites { sprites, .. } => {
// for sprite in sprites {
// if sprite.color == crate::white() {
// println!(" white sprite");
// } else if sprite.color == crate::blue() {
// println!(" blue sprite");
// } else {
// todo!(" ((( bad sprite")
// }
// }
// }
// _ => todo!(),
// }
// }
// }
// fn quad(origin: Point<Pixels>, size: Size<Pixels>, background: Hsla) -> Quad {
// Quad {
// order: 0,
// bounds: Bounds { origin, size }.scale(1.),
// background,
// content_mask: ContentMask {
// bounds: Bounds { origin, size },
// }
// .scale(1.),
// border_color: Default::default(),
// corner_radii: Default::default(),
// border_widths: Default::default(),
// }
// }
// fn sprite(origin: Point<Pixels>, size: Size<Pixels>, color: Hsla) -> MonochromeSprite {
// MonochromeSprite {
// order: 0,
// bounds: Bounds { origin, size }.scale(1.),
// content_mask: ContentMask {
// bounds: Bounds { origin, size },
// }
// .scale(1.),
// color,
// tile: AtlasTile {
// texture_id: AtlasTextureId {
// index: 0,
// kind: crate::AtlasTextureKind::Monochrome,
// },
// tile_id: crate::TileId(0),
// bounds: Default::default(),
// },
// }
// }
// }
+3 -21
View File
@@ -39,7 +39,7 @@ use std::{
Arc,
},
};
use util::ResultExt;
use util::{post_inc, ResultExt};
const ACTIVE_DRAG_Z_INDEX: u8 = 1;
@@ -939,21 +939,6 @@ impl<'a> WindowContext<'a> {
self.window.requested_cursor_style = Some(style)
}
/// Called during painting to invoke the given closure in a new stacking context. The given
/// z-index is interpreted relative to the previous call to `stack`.
pub fn with_z_index<R>(&mut self, z_index: u8, f: impl FnOnce(&mut Self) -> R) -> R {
let new_stacking_order_id = self.window.next_frame.next_stacking_order_id;
let new_next_stacking_order_id = new_stacking_order_id + 1;
self.window.next_frame.next_stacking_order_id = 0;
self.window.next_frame.z_index_stack.id = new_stacking_order_id;
self.window.next_frame.z_index_stack.push(z_index);
let result = f(self);
self.window.next_frame.next_stacking_order_id = new_next_stacking_order_id;
self.window.next_frame.z_index_stack.pop();
result
}
/// Called during painting to track which z-index is on top at each pixel position
pub fn add_opaque_layer(&mut self, bounds: Bounds<Pixels>) {
let stacking_order = self.window.next_frame.z_index_stack.clone();
@@ -2066,14 +2051,11 @@ pub trait BorrowWindow: BorrowMut<Window> + BorrowMut<AppContext> {
/// Called during painting to invoke the given closure in a new stacking context. The given
/// z-index is interpreted relative to the previous call to `stack`.
fn with_z_index<R>(&mut self, z_index: u8, f: impl FnOnce(&mut Self) -> R) -> R {
let new_stacking_order_id = self.window_mut().next_frame.next_stacking_order_id;
let new_next_stacking_order_id = new_stacking_order_id + 1;
self.window_mut().next_frame.next_stacking_order_id = 0;
let new_stacking_order_id =
post_inc(&mut self.window_mut().next_frame.next_stacking_order_id);
self.window_mut().next_frame.z_index_stack.id = new_stacking_order_id;
self.window_mut().next_frame.z_index_stack.push(z_index);
let result = f(self);
self.window_mut().next_frame.next_stacking_order_id = new_next_stacking_order_id;
self.window_mut().next_frame.z_index_stack.pop();
result
}