diff --git a/gpui/src/elements.rs b/gpui/src/elements.rs index c533b938a3..8b0c338a42 100644 --- a/gpui/src/elements.rs +++ b/gpui/src/elements.rs @@ -9,6 +9,7 @@ mod label; mod line_box; mod list; mod mouse_event_handler; +mod overlay; mod stack; mod svg; mod text; @@ -26,6 +27,7 @@ pub use label::*; pub use line_box::*; pub use list::*; pub use mouse_event_handler::*; +pub use overlay::*; pub use stack::*; pub use svg::*; pub use text::*; diff --git a/gpui/src/elements/overlay.rs b/gpui/src/elements/overlay.rs new file mode 100644 index 0000000000..25d3a8d3da --- /dev/null +++ b/gpui/src/elements/overlay.rs @@ -0,0 +1,57 @@ +use crate::{ + geometry::{rect::RectF, vector::Vector2F}, + DebugContext, Element, ElementBox, Event, EventContext, LayoutContext, PaintContext, + SizeConstraint, +}; + +pub struct Overlay { + child: ElementBox, +} + +impl Overlay { + pub fn new(child: ElementBox) -> Self { + Self { child } + } +} + +impl Element for Overlay { + type LayoutState = Vector2F; + type PaintState = (); + + fn layout( + &mut self, + constraint: SizeConstraint, + cx: &mut LayoutContext, + ) -> (Vector2F, Self::LayoutState) { + let size = self.child.layout(constraint, cx); + (Vector2F::zero(), size) + } + + fn paint(&mut self, bounds: RectF, size: &mut Self::LayoutState, cx: &mut PaintContext) { + let bounds = RectF::new(bounds.origin(), *size); + cx.scene.push_foreground_layer(Some(bounds)); + self.child.paint(bounds.origin(), cx); + cx.scene.pop_layer(); + } + + fn dispatch_event( + &mut self, + event: &Event, + _: RectF, + _: &mut Self::LayoutState, + _: &mut Self::PaintState, + cx: &mut EventContext, + ) -> bool { + self.child.dispatch_event(event, cx) + } + + fn debug( + &self, + _: RectF, + _: &Self::LayoutState, + _: &Self::PaintState, + cx: &DebugContext, + ) -> serde_json::Value { + self.child.debug(cx) + } +}