@@ -110,7 +110,7 @@ pub struct Style {
/// The mouse cursor style shown when the mouse pointer is over an element.
pub mouse_cursor: Option<CursorStyle>,
- pub z_index: Option<u8>,
+ pub z_index: Option<u16>,
#[cfg(debug_assertions)]
pub debug: bool,
@@ -386,7 +386,7 @@ impl Style {
let background_color = self.background.as_ref().and_then(Fill::color);
if background_color.map_or(false, |color| !color.is_transparent()) {
- cx.with_z_index(0, |cx| {
+ cx.with_z_index(1, |cx| {
let mut border_color = background_color.unwrap_or_default();
border_color.a = 0.;
cx.paint_quad(quad(
@@ -399,12 +399,12 @@ impl Style {
});
}
- cx.with_z_index(0, |cx| {
+ cx.with_z_index(2, |cx| {
continuation(cx);
});
if self.is_border_visible() {
- cx.with_z_index(0, |cx| {
+ cx.with_z_index(3, |cx| {
let corner_radii = self.corner_radii.to_pixels(bounds.size, rem_size);
let border_widths = self.border_widths.to_pixels(rem_size);
let max_border_width = border_widths.max();
@@ -43,30 +43,23 @@ use std::{
};
use util::{post_inc, ResultExt};
-const ACTIVE_DRAG_Z_INDEX: u8 = 1;
+const ACTIVE_DRAG_Z_INDEX: u16 = 1;
/// A global stacking order, which is created by stacking successive z-index values.
/// Each z-index will always be interpreted in the context of its parent z-index.
-#[derive(Deref, DerefMut, Clone, Ord, PartialOrd, PartialEq, Eq, Default)]
-pub struct StackingOrder {
- #[deref]
- #[deref_mut]
- context_stack: SmallVec<[u8; 64]>,
- id: u32,
+#[derive(Debug, Deref, DerefMut, Clone, Ord, PartialOrd, PartialEq, Eq, Default)]
+pub struct StackingOrder(SmallVec<[StackingContext; 64]>);
+
+/// A single entry in a primitive's z-index stacking order
+#[derive(Clone, Ord, PartialOrd, PartialEq, Eq, Default)]
+pub struct StackingContext {
+ z_index: u16,
+ id: u16,
}
-impl std::fmt::Debug for StackingOrder {
+impl std::fmt::Debug for StackingContext {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- let mut stacks = self.context_stack.iter().peekable();
- write!(f, "[({}): ", self.id)?;
- while let Some(z_index) = stacks.next() {
- write!(f, "{z_index}")?;
- if stacks.peek().is_some() {
- write!(f, "->")?;
- }
- }
- write!(f, "]")?;
- Ok(())
+ write!(f, "{{{}.{}}} ", self.z_index, self.id)
}
}
@@ -315,8 +308,8 @@ pub(crate) struct Frame {
pub(crate) scene: Scene,
pub(crate) depth_map: Vec<(StackingOrder, EntityId, Bounds<Pixels>)>,
pub(crate) z_index_stack: StackingOrder,
- pub(crate) next_stacking_order_id: u32,
- next_root_z_index: u8,
+ next_stacking_order_id: u16,
+ next_root_z_index: u16,
content_mask_stack: Vec<ContentMask<Pixels>>,
element_offset_stack: Vec<Point<Pixels>>,
requested_input_handler: Option<RequestedInputHandler>,
@@ -1105,7 +1098,11 @@ impl<'a> WindowContext<'a> {
if level >= opaque_level {
break;
}
- if opaque_level.starts_with(&[ACTIVE_DRAG_Z_INDEX]) {
+ if opaque_level
+ .first()
+ .map(|c| c.z_index == ACTIVE_DRAG_Z_INDEX)
+ .unwrap_or(false)
+ {
continue;
}
@@ -2452,36 +2449,40 @@ pub trait BorrowWindow: BorrowMut<Window> + BorrowMut<AppContext> {
size: self.window().viewport_size,
},
};
+
+ let new_root_z_index = post_inc(&mut self.window_mut().next_frame.next_root_z_index);
let new_stacking_order_id =
post_inc(&mut self.window_mut().next_frame.next_stacking_order_id);
- let new_root_z_index = post_inc(&mut self.window_mut().next_frame.next_root_z_index);
+ let new_context = StackingContext {
+ z_index: new_root_z_index,
+ id: new_stacking_order_id,
+ };
+
let old_stacking_order = mem::take(&mut self.window_mut().next_frame.z_index_stack);
- self.window_mut().next_frame.z_index_stack.id = new_stacking_order_id;
- self.window_mut()
- .next_frame
- .z_index_stack
- .push(new_root_z_index);
+
+ self.window_mut().next_frame.z_index_stack.push(new_context);
self.window_mut().next_frame.content_mask_stack.push(mask);
let result = f(self);
self.window_mut().next_frame.content_mask_stack.pop();
self.window_mut().next_frame.z_index_stack = old_stacking_order;
+
result
}
/// 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 {
+ fn with_z_index<R>(&mut self, z_index: u16, f: impl FnOnce(&mut Self) -> R) -> R {
let new_stacking_order_id =
post_inc(&mut self.window_mut().next_frame.next_stacking_order_id);
- let old_stacking_order_id = mem::replace(
- &mut self.window_mut().next_frame.z_index_stack.id,
- new_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 new_context = StackingContext {
+ z_index,
+ id: new_stacking_order_id,
+ };
+
+ self.window_mut().next_frame.z_index_stack.push(new_context);
let result = f(self);
- self.window_mut().next_frame.z_index_stack.id = old_stacking_order_id;
self.window_mut().next_frame.z_index_stack.pop();
+
result
}