diff --git a/crates/gpui3/src/element.rs b/crates/gpui3/src/element.rs index 32f7a1c95c..8dec1bacba 100644 --- a/crates/gpui3/src/element.rs +++ b/crates/gpui3/src/element.rs @@ -1,4 +1,4 @@ -use crate::{BorrowWindow, Bounds, ElementId, LayoutId, Pixels, Point, ViewContext}; +use crate::{BorrowWindow, Bounds, ElementId, LayoutId, Pixels, Point, SharedString, ViewContext}; use derive_more::{Deref, DerefMut}; pub(crate) use smallvec::SmallVec; @@ -33,12 +33,11 @@ pub trait IdentifiedElement: Element { #[derive(Deref, DerefMut, Default, Clone, Debug, Eq, PartialEq, Hash)] pub(crate) struct GlobalElementId(SmallVec<[ElementId; 8]>); -pub trait ParentElement { - type State; +pub trait ParentElement: Element { + fn children_mut(&mut self) -> &mut SmallVec<[AnyElement; 2]>; + fn group_mut(&mut self) -> &mut Option; - fn children_mut(&mut self) -> &mut SmallVec<[AnyElement; 2]>; - - fn child(mut self, child: impl IntoAnyElement) -> Self + fn child(mut self, child: impl IntoAnyElement) -> Self where Self: Sized, { @@ -46,7 +45,10 @@ pub trait ParentElement { self } - fn children(mut self, iter: impl IntoIterator>) -> Self + fn children( + mut self, + iter: impl IntoIterator>, + ) -> Self where Self: Sized, { diff --git a/crates/gpui3/src/elements/clickable.rs b/crates/gpui3/src/elements/clickable.rs index 0d98d2cafc..a3ca671d4f 100644 --- a/crates/gpui3/src/elements/clickable.rs +++ b/crates/gpui3/src/elements/clickable.rs @@ -1,7 +1,7 @@ use crate::{ - AnyElement, Bounds, DispatchPhase, Element, ElementId, ElementKind, Hoverable, - IdentifiedElement, IntoAnyElement, LayoutId, LayoutNode, MouseDownEvent, MouseUpEvent, Pixels, - SharedString, StyleRefinement, Styled, ViewContext, + AnyElement, Bounds, DispatchPhase, Element, ElementId, Hoverable, IdentifiedElement, + IntoAnyElement, LayoutId, MouseDownEvent, MouseUpEvent, ParentElement, Pixels, SharedString, + StyleRefinement, Styled, ViewContext, }; use parking_lot::Mutex; use refineable::CascadeSlot; @@ -53,7 +53,17 @@ pub struct ClickableElement { cascade_slot: CascadeSlot, } -impl ClickableElement { +impl ClickableElement { + pub fn new(mut child: E) -> Self { + let cascade_slot = child.style_cascade().reserve(); + ClickableElement { + child, + listeners: Default::default(), + active_style: Default::default(), + cascade_slot, + } + } + pub fn replace_child>( self, replace: impl FnOnce(E) -> E2, @@ -171,12 +181,11 @@ where impl IdentifiedElement for ClickableElement {} -impl LayoutNode for ClickableElement +impl ParentElement for ClickableElement where - E: Element + LayoutNode, - K: ElementKind, + E: Styled + ParentElement, { - fn children_mut(&mut self) -> &mut SmallVec<[AnyElement; 2]> { + fn children_mut(&mut self) -> &mut SmallVec<[AnyElement; 2]> { self.child.children_mut() } diff --git a/crates/gpui3/src/elements/div.rs b/crates/gpui3/src/elements/div.rs index bdd450f7b1..b95ee1be42 100644 --- a/crates/gpui3/src/elements/div.rs +++ b/crates/gpui3/src/elements/div.rs @@ -1,8 +1,9 @@ use crate::{ - AnonymousElementKind, AnyElement, Bounds, Clickable, ClickableElement, ClickableElementState, - Element, ElementId, ElementKind, Hoverable, HoverableElement, IdentifiedElementKind, - IntoAnyElement, LayoutId, LayoutNode, LayoutNodeElement, Overflow, Pixels, Point, SharedString, - Style, StyleCascade, StyleRefinement, Styled, ViewContext, ClickListeners, + AnonymousElementKind, AnyElement, Bounds, ClickListeners, Clickable, ClickableElement, + ClickableElementState, Element, ElementId, ElementKind, Hoverable, HoverableElement, + IdentifiedElement, IdentifiedElementKind, IntoAnyElement, LayoutId, LayoutNodeElement, + Overflow, ParentElement, Pixels, Point, SharedString, Style, StyleCascade, StyleRefinement, + Styled, ViewContext, }; use parking_lot::Mutex; use smallvec::SmallVec; @@ -29,7 +30,16 @@ impl ScrollState { } } -pub struct Div( +pub fn div() -> Div +where + S: 'static + Send + Sync, +{ + Div(ClickableElement::new(HoverableElement::new( + LayoutNodeElement::new(), + ))) +} + +pub struct Div( ClickableElement>>, ); @@ -95,7 +105,13 @@ impl Div { } } -impl LayoutNode for Div { +impl IdentifiedElement for Div { + fn id(&self) -> ElementId { + IdentifiedElement::id(&self.0) + } +} + +impl ParentElement for Div { fn children_mut(&mut self) -> &mut SmallVec<[AnyElement; 2]> { self.0.children_mut() } diff --git a/crates/gpui3/src/elements/hoverable.rs b/crates/gpui3/src/elements/hoverable.rs index 9d89f11a6d..bdc37ad03b 100644 --- a/crates/gpui3/src/elements/hoverable.rs +++ b/crates/gpui3/src/elements/hoverable.rs @@ -1,7 +1,7 @@ use crate::{ - group_bounds, AnyElement, Bounds, DispatchPhase, Element, ElementId, ElementKind, - IdentifiedElement, IntoAnyElement, LayoutId, LayoutNode, MouseMoveEvent, Pixels, SharedString, - Style, StyleCascade, StyleRefinement, Styled, ViewContext, + group_bounds, AnyElement, Bounds, DispatchPhase, Element, ElementId, IdentifiedElement, + IntoAnyElement, LayoutId, MouseMoveEvent, ParentElement, Pixels, SharedString, Style, + StyleCascade, StyleRefinement, Styled, ViewContext, }; use refineable::CascadeSlot; use std::sync::{ @@ -30,6 +30,17 @@ pub struct HoverableElement { } impl HoverableElement { + pub fn new(mut child: E) -> Self { + let cascade_slot = child.style_cascade().reserve(); + HoverableElement { + hover_style: StyleRefinement::default(), + group: None, + cascade_slot, + hovered: Arc::new(AtomicBool::new(false)), + child, + } + } + pub fn replace_child>( self, replace: impl FnOnce(E) -> E2, @@ -106,13 +117,11 @@ where } } -impl LayoutNode for HoverableElement +impl ParentElement for HoverableElement where - E: LayoutNode, - K: ElementKind, - V: 'static + Send + Sync, + E: Styled + ParentElement, { - fn children_mut(&mut self) -> &mut smallvec::SmallVec<[AnyElement; 2]> { + fn children_mut(&mut self) -> &mut smallvec::SmallVec<[AnyElement; 2]> { self.child.children_mut() } diff --git a/crates/gpui3/src/elements/img.rs b/crates/gpui3/src/elements/img.rs index 9bb9d782d8..5efe7afe31 100644 --- a/crates/gpui3/src/elements/img.rs +++ b/crates/gpui3/src/elements/img.rs @@ -1,29 +1,35 @@ use crate::{ - AnyElement, BorrowWindow, Bounds, Element, IntoAnyElement, LayoutId, Pixels, SharedString, - Style, Styled, ViewContext, + AnonymousElementKind, AnyElement, BorrowWindow, Bounds, ClickListeners, Clickable, + ClickableElement, ClickableElementState, Element, ElementId, ElementKind, Hoverable, + HoverableElement, IdentifiedElement, IdentifiedElementKind, IntoAnyElement, LayoutId, + LayoutNodeElement, Pixels, SharedString, Style, StyleRefinement, Styled, ViewContext, }; use futures::FutureExt; use refineable::Cascade; -use std::marker::PhantomData; use util::ResultExt; -pub struct Img { - style: Cascade