diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 7efb43bd48..53578392e8 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -26,11 +26,11 @@ use git::diff::DiffHunkStatus; use gpui::{ div, fill, outline, overlay, point, px, quad, relative, size, transparent_black, Action, AnchorCorner, AnyElement, AvailableSpace, BorrowWindow, Bounds, ContentMask, Corners, - CursorStyle, DispatchPhase, Edges, Element, ElementInputHandler, Hsla, InteractiveBounds, - InteractiveElement, IntoElement, ModifiersChangedEvent, MouseButton, MouseDownEvent, - MouseMoveEvent, MouseUpEvent, ParentElement, Pixels, ScrollDelta, ScrollWheelEvent, ShapedLine, - SharedString, Size, StackingOrder, StatefulInteractiveElement, Style, Styled, TextRun, - TextStyle, View, ViewContext, WindowContext, + CursorStyle, DispatchPhase, Edges, Element, ElementInputHandler, Entity, Hsla, + InteractiveBounds, InteractiveElement, IntoElement, ModifiersChangedEvent, MouseButton, + MouseDownEvent, MouseMoveEvent, MouseUpEvent, ParentElement, Pixels, ScrollDelta, + ScrollWheelEvent, ShapedLine, SharedString, Size, StackingOrder, StatefulInteractiveElement, + Style, Styled, TextRun, TextStyle, View, ViewContext, WindowContext, }; use itertools::Itertools; use language::language_settings::ShowWhitespaceSetting; diff --git a/crates/gpui/src/scene.rs b/crates/gpui/src/scene.rs index 4b716413f5..4179a1659e 100644 --- a/crates/gpui/src/scene.rs +++ b/crates/gpui/src/scene.rs @@ -13,6 +13,30 @@ pub(crate) type PathVertex_ScaledPixels = PathVertex; pub type LayerId = u32; pub type DrawOrder = u32; +#[derive(Default, Copy, Clone, Debug, Eq, PartialEq, Hash)] +#[repr(C)] +pub struct ViewId { + low_bits: u32, + high_bits: u32, +} + +impl From for ViewId { + fn from(value: EntityId) -> Self { + let value = value.as_u64(); + Self { + low_bits: value as u32, + high_bits: (value >> 32) as u32, + } + } +} + +impl From for EntityId { + fn from(value: ViewId) -> Self { + let value = (value.low_bits as u64) | ((value.high_bits as u64) << 32); + value.into() + } +} + #[derive(Default)] pub struct Scene { layers_by_order: BTreeMap, @@ -127,49 +151,49 @@ impl Scene { pub fn reuse_views(&mut self, views: &FxHashSet, prev_scene: &mut Self) { for shadow in prev_scene.shadows.drain(..) { - if views.contains(&EntityId::from(shadow.view_id as u64)) { + if views.contains(&shadow.view_id.into()) { let order = &prev_scene.orders_by_layer[&shadow.layer_id]; self.insert(&order, shadow); } } for quad in prev_scene.quads.drain(..) { - if views.contains(&EntityId::from(quad.view_id as u64)) { + if views.contains(&quad.view_id.into()) { let order = &prev_scene.orders_by_layer[&quad.layer_id]; self.insert(&order, quad); } } for path in prev_scene.paths.drain(..) { - if views.contains(&EntityId::from(path.view_id as u64)) { + if views.contains(&path.view_id.into()) { let order = &prev_scene.orders_by_layer[&path.layer_id]; self.insert(&order, path); } } for underline in prev_scene.underlines.drain(..) { - if views.contains(&EntityId::from(underline.view_id as u64)) { + if views.contains(&underline.view_id.into()) { let order = &prev_scene.orders_by_layer[&underline.layer_id]; self.insert(&order, underline); } } for sprite in prev_scene.monochrome_sprites.drain(..) { - if views.contains(&EntityId::from(sprite.view_id as u64)) { + if views.contains(&sprite.view_id.into()) { let order = &prev_scene.orders_by_layer[&sprite.layer_id]; self.insert(&order, sprite); } } for sprite in prev_scene.polychrome_sprites.drain(..) { - if views.contains(&EntityId::from(sprite.view_id as u64)) { + if views.contains(&sprite.view_id.into()) { let order = &prev_scene.orders_by_layer[&sprite.layer_id]; self.insert(&order, sprite); } } for surface in prev_scene.surfaces.drain(..) { - if views.contains(&EntityId::from(surface.view_id as u64)) { + if views.contains(&surface.view_id.into()) { let order = &prev_scene.orders_by_layer[&surface.layer_id]; self.insert(&order, surface); } @@ -470,7 +494,7 @@ pub(crate) enum PrimitiveBatch<'a> { #[derive(Default, Debug, Clone, Eq, PartialEq)] #[repr(C)] pub struct Quad { - pub view_id: u32, + pub view_id: ViewId, pub layer_id: LayerId, pub order: DrawOrder, pub bounds: Bounds, @@ -502,7 +526,7 @@ impl From for Primitive { #[derive(Debug, Clone, Eq, PartialEq)] #[repr(C)] pub struct Underline { - pub view_id: u32, + pub view_id: ViewId, pub layer_id: LayerId, pub order: DrawOrder, pub bounds: Bounds, @@ -533,7 +557,7 @@ impl From for Primitive { #[derive(Debug, Clone, Eq, PartialEq)] #[repr(C)] pub struct Shadow { - pub view_id: u32, + pub view_id: ViewId, pub layer_id: LayerId, pub order: DrawOrder, pub bounds: Bounds, @@ -564,7 +588,7 @@ impl From for Primitive { #[derive(Clone, Debug, Eq, PartialEq)] #[repr(C)] pub struct MonochromeSprite { - pub view_id: u32, + pub view_id: ViewId, pub layer_id: LayerId, pub order: DrawOrder, pub bounds: Bounds, @@ -597,7 +621,7 @@ impl From for Primitive { #[derive(Clone, Debug, Eq, PartialEq)] #[repr(C)] pub struct PolychromeSprite { - pub view_id: u32, + pub view_id: ViewId, pub layer_id: LayerId, pub order: DrawOrder, pub bounds: Bounds, @@ -630,7 +654,7 @@ impl From for Primitive { #[derive(Clone, Debug, Eq, PartialEq)] pub struct Surface { - pub view_id: u32, + pub view_id: ViewId, pub layer_id: LayerId, pub order: DrawOrder, pub bounds: Bounds, @@ -662,7 +686,7 @@ pub(crate) struct PathId(pub(crate) usize); #[derive(Debug)] pub struct Path { pub(crate) id: PathId, - pub(crate) view_id: u32, + pub(crate) view_id: ViewId, layer_id: LayerId, order: DrawOrder, pub(crate) bounds: Bounds

, @@ -678,9 +702,9 @@ impl Path { pub fn new(start: Point) -> Self { Self { id: PathId(0), - view_id: 0, - layer_id: 0, - order: 0, + view_id: ViewId::default(), + layer_id: LayerId::default(), + order: DrawOrder::default(), vertices: Vec::new(), start, current: start, diff --git a/crates/gpui/src/window.rs b/crates/gpui/src/window.rs index 2e84260b9e..34df4b2423 100644 --- a/crates/gpui/src/window.rs +++ b/crates/gpui/src/window.rs @@ -1102,7 +1102,7 @@ impl<'a> WindowContext<'a> { window.next_frame.scene.insert( &window.next_frame.z_index_stack, Shadow { - view_id: view_id.as_u64() as u32, + view_id: view_id.into(), layer_id: 0, order: 0, bounds: shadow_bounds.scale(scale_factor), @@ -1127,7 +1127,7 @@ impl<'a> WindowContext<'a> { window.next_frame.scene.insert( &window.next_frame.z_index_stack, Quad { - view_id: view_id.as_u64() as u32, + view_id: view_id.into(), layer_id: 0, order: 0, bounds: quad.bounds.scale(scale_factor), @@ -1148,7 +1148,7 @@ impl<'a> WindowContext<'a> { path.content_mask = content_mask; path.color = color.into(); - path.view_id = view_id.as_u64() as u32; + path.view_id = view_id.into(); let window = &mut *self.window; window .next_frame @@ -1180,7 +1180,7 @@ impl<'a> WindowContext<'a> { window.next_frame.scene.insert( &window.next_frame.z_index_stack, Underline { - view_id: view_id.as_u64() as u32, + view_id: view_id.into(), layer_id: 0, order: 0, bounds: bounds.scale(scale_factor), @@ -1236,7 +1236,7 @@ impl<'a> WindowContext<'a> { window.next_frame.scene.insert( &window.next_frame.z_index_stack, MonochromeSprite { - view_id: view_id.as_u64() as u32, + view_id: view_id.into(), layer_id: 0, order: 0, bounds, @@ -1290,7 +1290,7 @@ impl<'a> WindowContext<'a> { window.next_frame.scene.insert( &window.next_frame.z_index_stack, PolychromeSprite { - view_id: view_id.as_u64() as u32, + view_id: view_id.into(), layer_id: 0, order: 0, bounds, @@ -1335,7 +1335,7 @@ impl<'a> WindowContext<'a> { window.next_frame.scene.insert( &window.next_frame.z_index_stack, MonochromeSprite { - view_id: view_id.as_u64() as u32, + view_id: view_id.into(), layer_id: 0, order: 0, bounds, @@ -1374,7 +1374,7 @@ impl<'a> WindowContext<'a> { window.next_frame.scene.insert( &window.next_frame.z_index_stack, PolychromeSprite { - view_id: view_id.as_u64() as u32, + view_id: view_id.into(), layer_id: 0, order: 0, bounds, @@ -1397,7 +1397,7 @@ impl<'a> WindowContext<'a> { window.next_frame.scene.insert( &window.next_frame.z_index_stack, Surface { - view_id: view_id.as_u64() as u32, + view_id: view_id.into(), layer_id: 0, order: 0, bounds,