mirror of
https://github.com/zed-industries/zed.git
synced 2025-02-06 02:37:21 +00:00
Tidy up z-index handling
Co-Authored-By: Antonio Scandurra <antonio@zed.dev>
This commit is contained in:
parent
f6d31917c1
commit
cf12d62fc5
10 changed files with 31 additions and 182 deletions
|
@ -68,7 +68,7 @@ impl Render for CollabTitlebarItem {
|
|||
|
||||
h_stack()
|
||||
.id("titlebar")
|
||||
.z_index(160)
|
||||
.z_index(160) // todo!("z-index")
|
||||
.justify_between()
|
||||
.w_full()
|
||||
.h(rems(1.75))
|
||||
|
|
|
@ -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,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,
|
||||
};
|
||||
|
|
|
@ -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(),
|
||||
// },
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
use editor::{Cursor, HighlightedRange, HighlightedRangeLine};
|
||||
use gpui::{
|
||||
black, div, fill, point, px, red, relative, AnyElement, AsyncWindowContext, AvailableSpace,
|
||||
Bounds, DispatchPhase, Element, ElementId, ExternalPaths, FocusHandle, Font, FontStyle,
|
||||
FontWeight, HighlightStyle, Hsla, InteractiveElement, InteractiveElementState, Interactivity,
|
||||
IntoElement, LayoutId, Model, ModelContext, ModifiersChangedEvent, MouseButton, Pixels,
|
||||
PlatformInputHandler, Point, Rgba, ShapedLine, Size, StatefulInteractiveElement, Styled,
|
||||
TextRun, TextStyle, TextSystem, UnderlineStyle, WhiteSpace, WindowContext,
|
||||
BorrowWindow, Bounds, DispatchPhase, Element, ElementId, ExternalPaths, FocusHandle, Font,
|
||||
FontStyle, FontWeight, HighlightStyle, Hsla, InteractiveElement, InteractiveElementState,
|
||||
Interactivity, IntoElement, LayoutId, Model, ModelContext, ModifiersChangedEvent, MouseButton,
|
||||
Pixels, PlatformInputHandler, Point, Rgba, ShapedLine, Size, StatefulInteractiveElement,
|
||||
Styled, TextRun, TextStyle, TextSystem, UnderlineStyle, WhiteSpace, WindowContext,
|
||||
};
|
||||
use itertools::Itertools;
|
||||
use language::CursorShape;
|
||||
|
|
|
@ -3,8 +3,8 @@ use crate::{
|
|||
ListSeparator, ListSubHeader,
|
||||
};
|
||||
use gpui::{
|
||||
px, Action, AnyElement, AppContext, DismissEvent, Div, EventEmitter, FocusHandle,
|
||||
FocusableView, IntoElement, Render, Subscription, View, VisualContext,
|
||||
px, Action, AppContext, DismissEvent, Div, EventEmitter, FocusHandle, FocusableView,
|
||||
IntoElement, Render, Subscription, View, VisualContext,
|
||||
};
|
||||
use menu::{SelectFirst, SelectLast, SelectNext, SelectPrev};
|
||||
use std::{rc::Rc, time::Duration};
|
||||
|
@ -18,9 +18,6 @@ pub enum ContextMenuItem {
|
|||
handler: Rc<dyn Fn(&mut WindowContext)>,
|
||||
action: Option<Box<dyn Action>>,
|
||||
},
|
||||
CustomEntry {
|
||||
entry_render: Box<dyn Fn(&mut WindowContext) -> AnyElement>,
|
||||
},
|
||||
}
|
||||
|
||||
pub struct ContextMenu {
|
||||
|
@ -86,16 +83,6 @@ impl ContextMenu {
|
|||
self
|
||||
}
|
||||
|
||||
pub fn custom_entry(
|
||||
mut self,
|
||||
entry_render: impl Fn(&mut WindowContext) -> AnyElement + 'static,
|
||||
) -> Self {
|
||||
self.items.push(ContextMenuItem::CustomEntry {
|
||||
entry_render: Box::new(entry_render),
|
||||
});
|
||||
self
|
||||
}
|
||||
|
||||
pub fn action(mut self, label: impl Into<SharedString>, action: Box<dyn Action>) -> Self {
|
||||
self.items.push(ContextMenuItem::Entry {
|
||||
label: label.into(),
|
||||
|
@ -243,9 +230,9 @@ impl Render for ContextMenu {
|
|||
el
|
||||
})
|
||||
.flex_none()
|
||||
.child(List::new().children(self.items.iter_mut().enumerate().map(
|
||||
|(ix, item)| {
|
||||
match item {
|
||||
.child(
|
||||
List::new().children(self.items.iter().enumerate().map(
|
||||
|(ix, item)| match item {
|
||||
ContextMenuItem::Separator => ListSeparator.into_any_element(),
|
||||
ContextMenuItem::Header(header) => {
|
||||
ListSubHeader::new(header.clone()).into_any_element()
|
||||
|
@ -268,7 +255,7 @@ impl Render for ContextMenu {
|
|||
Label::new(label.clone()).into_any_element()
|
||||
};
|
||||
|
||||
ListItem::new(ix)
|
||||
ListItem::new(label.clone())
|
||||
.inset(true)
|
||||
.selected(Some(ix) == self.selected_index)
|
||||
.on_click(move |_, cx| handler(cx))
|
||||
|
@ -284,14 +271,9 @@ impl Render for ContextMenu {
|
|||
)
|
||||
.into_any_element()
|
||||
}
|
||||
ContextMenuItem::CustomEntry { entry_render } => ListItem::new(ix)
|
||||
.inset(true)
|
||||
.selected(Some(ix) == self.selected_index)
|
||||
.child(entry_render(cx))
|
||||
.into_any_element(),
|
||||
}
|
||||
},
|
||||
))),
|
||||
},
|
||||
)),
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -171,8 +171,7 @@ impl RenderOnce for ListItem {
|
|||
})
|
||||
})
|
||||
.when_some(self.on_click, |this, on_click| {
|
||||
this.cursor_pointer()
|
||||
.on_click(move |event, cx| on_click(event, cx))
|
||||
this.cursor_pointer().on_click(on_click)
|
||||
})
|
||||
.when_some(self.on_secondary_mouse_down, |this, on_mouse_down| {
|
||||
this.on_mouse_down(MouseButton::Right, move |event, cx| {
|
||||
|
|
|
@ -96,7 +96,7 @@ impl RenderOnce for TabBar {
|
|||
|
||||
div()
|
||||
.id(self.id)
|
||||
.z_index(120)
|
||||
.z_index(120) // todo!("z-index")
|
||||
.group("tab_bar")
|
||||
.flex()
|
||||
.flex_none()
|
||||
|
|
|
@ -105,8 +105,7 @@ impl Render for Toolbar {
|
|||
v_stack()
|
||||
.p_1()
|
||||
.gap_2()
|
||||
// todo!() use a proper constant here (ask Marshall & Nate)
|
||||
.z_index(80)
|
||||
.z_index(80) // todo!("z-index")
|
||||
.border_b()
|
||||
.border_color(cx.theme().colors().border_variant)
|
||||
.bg(cx.theme().colors().toolbar_background)
|
||||
|
|
Loading…
Reference in a new issue