From fb1e7eef6b571a6dfd0d126aa7638572ddb98f50 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 17 Oct 2023 11:08:48 +0200 Subject: [PATCH] Checkpoint --- crates/gpui3/src/element.rs | 8 +- crates/gpui3/src/elements/clickable.rs | 2 +- crates/gpui3/src/elements/div.rs | 4 +- crates/gpui3/src/elements/group.rs | 4 +- crates/gpui3/src/elements/hoverable.rs | 4 +- crates/gpui3/src/elements/identified.rs | 2 +- crates/gpui3/src/elements/img.rs | 2 +- crates/gpui3/src/elements/nested.rs | 276 +++++++++++++++++------- crates/gpui3/src/elements/pressable.rs | 2 +- crates/gpui3/src/elements/svg.rs | 2 +- crates/gpui3/src/elements/text.rs | 2 +- crates/gpui3/src/view.rs | 12 +- crates/gpui3/src/window.rs | 2 +- crates/ui2/src/theme.rs | 2 +- 14 files changed, 218 insertions(+), 106 deletions(-) diff --git a/crates/gpui3/src/element.rs b/crates/gpui3/src/element.rs index ad4cfa97bc036c3cac19ded2e8419e7595315c7f..8585bfdc9f0433bbbdf483a6880f70cf3c841e95 100644 --- a/crates/gpui3/src/element.rs +++ b/crates/gpui3/src/element.rs @@ -11,7 +11,7 @@ pub trait Element: 'static + Send + Sync + IntoAnyElement { type ViewState: 'static + Send + Sync; type ElementState: 'static + Send + Sync; - fn element_id(&self) -> Option; + fn id(&self) -> Option; fn layout( &mut self, @@ -38,7 +38,7 @@ pub trait Element: 'static + Send + Sync + IntoAnyElement { pub trait IdentifiedElement: Element { fn element_id(&self) -> ElementId { - Element::element_id(self).unwrap() + Element::id(self).unwrap() } fn on_click( @@ -126,7 +126,7 @@ impl RenderedElement { frame_state: &mut Option, cx: &mut ViewContext, ) { - if let Some(id) = self.element.element_id() { + if let Some(id) = self.element.id() { cx.with_element_state(id, |element_state, cx| { let mut element_state = element_state.unwrap(); self.element @@ -146,7 +146,7 @@ where S: 'static + Send + Sync, { fn layout(&mut self, state: &mut E::ViewState, cx: &mut ViewContext) -> LayoutId { - let (layout_id, frame_state) = if let Some(id) = self.element.element_id() { + let (layout_id, frame_state) = if let Some(id) = self.element.id() { let layout_id = cx.with_element_state(id, |element_state, cx| { self.element.layout(state, element_state, cx) }); diff --git a/crates/gpui3/src/elements/clickable.rs b/crates/gpui3/src/elements/clickable.rs index 861108a79ac3c08d88d077edc839596d26bfbe25..0b99adcf1e2ebeb2f3811d98fa00fd55f609273d 100644 --- a/crates/gpui3/src/elements/clickable.rs +++ b/crates/gpui3/src/elements/clickable.rs @@ -64,7 +64,7 @@ where type ViewState = E::ViewState; type ElementState = ClickableState; - fn element_id(&self) -> Option { + fn id(&self) -> Option { Some(IdentifiedElement::element_id(&self.child)) } diff --git a/crates/gpui3/src/elements/div.rs b/crates/gpui3/src/elements/div.rs index 444e0956847a5c2252a07151afdff623b0816e1f..41874d9e89f9c25bdcc7e42789161a8c5153c291 100644 --- a/crates/gpui3/src/elements/div.rs +++ b/crates/gpui3/src/elements/div.rs @@ -47,7 +47,7 @@ where type ViewState = S; type ElementState = (); - fn element_id(&self) -> Option { + fn id(&self) -> Option { self.id.clone() } @@ -188,7 +188,7 @@ where cx: &mut ViewContext, f: impl FnOnce(&mut Self, &mut ViewContext) -> R, ) -> R { - if let Some(element_id) = self.element_id() { + if let Some(element_id) = self.id() { cx.with_element_id(element_id, |cx| f(self, cx)) } else { f(self, cx) diff --git a/crates/gpui3/src/elements/group.rs b/crates/gpui3/src/elements/group.rs index 398ac65e1b2449e64f55860fedb5f80bdc482047..ec9475a0d699f07d16be1f50346ff7d87f1961e6 100644 --- a/crates/gpui3/src/elements/group.rs +++ b/crates/gpui3/src/elements/group.rs @@ -37,8 +37,8 @@ impl Element for Group { type ViewState = E::ViewState; type ElementState = E::ElementState; - fn element_id(&self) -> Option { - self.child.element_id() + fn id(&self) -> Option { + self.child.id() } fn layout( diff --git a/crates/gpui3/src/elements/hoverable.rs b/crates/gpui3/src/elements/hoverable.rs index 44d8c123cf17ca3ad6a1aea06a4f1358a4f7cf1c..06450d81145e14508ac34a669878b9fd6730eab0 100644 --- a/crates/gpui3/src/elements/hoverable.rs +++ b/crates/gpui3/src/elements/hoverable.rs @@ -71,8 +71,8 @@ where type ViewState = E::ViewState; type ElementState = E::ElementState; - fn element_id(&self) -> Option { - self.child.element_id() + fn id(&self) -> Option { + self.child.id() } fn layout( diff --git a/crates/gpui3/src/elements/identified.rs b/crates/gpui3/src/elements/identified.rs index 3e6207912a33acb28fe0365b7ce0416836bce635..032afd19a39879a48e36ca70e4384cb7de7c463d 100644 --- a/crates/gpui3/src/elements/identified.rs +++ b/crates/gpui3/src/elements/identified.rs @@ -21,7 +21,7 @@ impl Element for Identified { type ViewState = E::ViewState; type ElementState = E::ElementState; - fn element_id(&self) -> Option { + fn id(&self) -> Option { Some(self.id.clone()) } diff --git a/crates/gpui3/src/elements/img.rs b/crates/gpui3/src/elements/img.rs index 6b8c9b714c527f262c889cb05aafb68f386dea0b..8709707f319e8b947af5f91a5cf1364c94798f9d 100644 --- a/crates/gpui3/src/elements/img.rs +++ b/crates/gpui3/src/elements/img.rs @@ -48,7 +48,7 @@ impl Element for Img { type ViewState = S; type ElementState = (); - fn element_id(&self) -> Option { + fn id(&self) -> Option { None } diff --git a/crates/gpui3/src/elements/nested.rs b/crates/gpui3/src/elements/nested.rs index c1ef373842a1d0f30755a26e211923dbb070c4da..bd1a8008fcac3ca7d81fb05d63b41d7cbb89cf6d 100644 --- a/crates/gpui3/src/elements/nested.rs +++ b/crates/gpui3/src/elements/nested.rs @@ -1,5 +1,5 @@ use crate::{ - group_bounds, AnyElement, DispatchPhase, Element, IdentifiedElement, IntoAnyElement, + group_bounds, AnyElement, DispatchPhase, Element, ElementId, IdentifiedElement, IntoAnyElement, MouseDownEvent, MouseMoveEvent, MouseUpEvent, SharedString, Style, StyleCascade, StyleRefinement, ViewContext, }; @@ -11,8 +11,8 @@ use std::sync::{ Arc, }; -trait LayoutNode { - fn state(&mut self) -> &mut LayoutNodeState; +trait LayoutNode { + fn state(&mut self) -> &mut LayoutNodeElement; fn child(mut self, child: impl IntoAnyElement) -> Self where @@ -35,26 +35,75 @@ trait LayoutNode { } } -struct LayoutNodeState { +pub trait ElementKind: 'static + Send + Sync { + fn id(&self) -> Option; +} + +pub struct Identified(ElementId); +pub struct Anonymous; + +impl ElementKind for Identified { + fn id(&self) -> Option { + Some(self.0.clone()) + } +} + +impl ElementKind for Anonymous { + fn id(&self) -> Option { + None + } +} + +struct LayoutNodeElement { style_cascade: StyleCascade, computed_style: Option