Compare commits

...
Sign in to create a new pull request.

3 commits

Author SHA1 Message Date
Mikayla
86b363d7f2
Merge branch 'main' into z-index-with-flicker-fix 2024-01-21 21:23:24 -08:00
Julia
b0aa05ad39 Ignore stacking order entry ids in was_top_layer 2024-01-19 15:26:33 -05:00
Julia
bfa7140034 Store a z-index id per-layer
Co-Authored-By: Nathan Sobo <nathan@zed.dev>
2024-01-19 15:26:27 -05:00
9 changed files with 62 additions and 56 deletions

View file

@ -28,7 +28,7 @@ impl RenderOnce for FacePile {
let isnt_last = ix < player_count - 1;
div()
.z_index((player_count - ix) as u8)
.z_index((player_count - ix) as u16)
.when(isnt_last, |div| div.neg_mr_1())
.child(player)
});

View file

@ -3185,7 +3185,7 @@ pub struct CursorName {
string: SharedString,
color: Hsla,
is_top_row: bool,
z_index: u8,
z_index: u16,
}
impl Cursor {

View file

@ -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,
@ -337,7 +337,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(
@ -350,12 +350,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();

View file

@ -12,7 +12,7 @@ pub trait Styled: Sized {
gpui_macros::style_helpers!();
fn z_index(mut self, z_index: u8) -> Self {
fn z_index(mut self, z_index: u16) -> Self {
self.style().z_index = Some(z_index);
self
}

View file

@ -39,30 +39,23 @@ use util::ResultExt;
mod element_cx;
pub use element_cx::*;
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]>,
pub(crate) 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)
}
}
@ -289,7 +282,7 @@ pub(crate) struct ElementStateBox {
pub(crate) inner: Box<dyn Any>,
pub(crate) parent_view_id: EntityId,
#[cfg(debug_assertions)]
pub(crate) type_name: &'static str,
type_name: &'static str,
}
impl Window {
@ -813,8 +806,16 @@ impl<'a> WindowContext<'a> {
break;
}
if bounds.contains(point) && !opaque_level.starts_with(level) {
return false;
if bounds.contains(point) {
let starts_with = opaque_level
.iter()
.zip(level.iter())
.all(|(a, b)| a.z_index == b.z_index)
&& opaque_level.len() >= level.len();
if !starts_with {
return false;
}
}
}
true
@ -829,7 +830,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;
}

View file

@ -19,9 +19,9 @@ use crate::{
EntityId, FocusHandle, FocusId, FontId, GlobalElementId, GlyphId, Hsla, ImageData,
InputHandler, IsZero, KeyContext, KeyEvent, LayoutId, MonochromeSprite, MouseEvent, PaintQuad,
Path, Pixels, PlatformInputHandler, Point, PolychromeSprite, Quad, RenderGlyphParams,
RenderImageParams, RenderSvgParams, Scene, Shadow, SharedString, Size, StackingOrder, Style,
Surface, TextStyleRefinement, Underline, UnderlineStyle, Window, WindowContext,
SUBPIXEL_VARIANTS,
RenderImageParams, RenderSvgParams, Scene, Shadow, SharedString, Size, StackingContext,
StackingOrder, Style, Surface, TextStyleRefinement, Underline, UnderlineStyle, Window,
WindowContext, SUBPIXEL_VARIANTS,
};
type AnyMouseListener = Box<dyn FnMut(&dyn Any, DispatchPhase, &mut ElementContext) + 'static>;
@ -45,8 +45,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,
pub(crate) next_root_z_index: u8,
pub(crate) next_stacking_order_id: u16,
pub(crate) next_root_z_index: u16,
pub(crate) content_mask_stack: Vec<ContentMask<Pixels>>,
pub(crate) element_offset_stack: Vec<Point<Pixels>>,
pub(crate) requested_input_handler: Option<RequestedInputHandler>,
@ -61,7 +61,7 @@ pub(crate) struct Frame {
}
impl Frame {
pub(crate) fn new(dispatch_tree: DispatchTree) -> Self {
pub fn new(dispatch_tree: DispatchTree) -> Self {
Frame {
focus: None,
window_active: false,
@ -87,7 +87,7 @@ impl Frame {
}
}
pub(crate) fn clear(&mut self) {
pub fn clear(&mut self) {
self.element_states.clear();
self.mouse_listeners.values_mut().for_each(Vec::clear);
self.dispatch_tree.clear();
@ -103,13 +103,13 @@ impl Frame {
debug_assert_eq!(self.view_stack.len(), 0);
}
pub(crate) fn focus_path(&self) -> SmallVec<[FocusId; 8]> {
pub fn focus_path(&self) -> SmallVec<[FocusId; 8]> {
self.focus
.map(|focus_id| self.dispatch_tree.focus_path(focus_id))
.unwrap_or_default()
}
pub(crate) fn finish(&mut self, prev_frame: &mut Self) {
pub fn finish(&mut self, prev_frame: &mut Self) {
// Reuse mouse listeners that didn't change since the last frame.
for (type_id, listeners) in &mut prev_frame.mouse_listeners {
let next_listeners = self.mouse_listeners.entry(*type_id).or_default();
@ -410,15 +410,17 @@ impl<'a> ElementContext<'a> {
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();
@ -428,17 +430,16 @@ impl<'a> ElementContext<'a> {
/// 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 {
pub 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
}

View file

@ -76,7 +76,7 @@ impl Styles for Div {}
#[derive(IntoElement)]
struct ZIndexExample {
z_index: u8,
z_index: u16,
}
impl RenderOnce for ZIndexExample {
@ -166,7 +166,7 @@ impl RenderOnce for ZIndexExample {
}
impl ZIndexExample {
pub fn new(z_index: u8) -> Self {
pub fn new(z_index: u16) -> Self {
Self { z_index }
}
}

View file

@ -20,7 +20,7 @@ pub enum ElevationIndex {
}
impl ElevationIndex {
pub fn z_index(self) -> u8 {
pub fn z_index(self) -> u16 {
match self {
ElevationIndex::Background => 0,
ElevationIndex::Surface => 42,

View file

@ -4326,7 +4326,7 @@ impl Element for DisconnectedOverlay {
overlay: &mut Self::State,
cx: &mut ElementContext,
) {
cx.with_z_index(u8::MAX, |cx| {
cx.with_z_index(u16::MAX, |cx| {
cx.add_opaque_layer(bounds);
overlay.paint(cx);
})