Checkpoint

Antonio Scandurra created

Change summary

crates/gpui3/src/active.rs       | 13 +++++++++++++
crates/gpui3/src/elements/div.rs | 31 +++++++++++++++++++++++++------
crates/gpui3/src/elements/img.rs | 25 ++++++++++++++++++++++---
crates/gpui3/src/elements/svg.rs | 27 +++++++++++++++++++++++----
crates/gpui3/src/gpui3.rs        |  4 ++++
crates/gpui3/src/hover.rs        | 13 +++++++++++++
crates/gpui3/src/interactive.rs  |  2 +-
crates/ui2/src/prelude.rs        |  4 ++--
8 files changed, 103 insertions(+), 16 deletions(-)

Detailed changes

crates/gpui3/src/active.rs 🔗

@@ -0,0 +1,13 @@
+use crate::StyleRefinement;
+
+pub trait Active {
+    fn set_active_style(&mut self, style: StyleRefinement);
+
+    fn active(mut self, f: impl FnOnce(StyleRefinement) -> StyleRefinement) -> Self
+    where
+        Self: Sized,
+    {
+        self.set_active_style(f(StyleRefinement::default()));
+        self
+    }
+}

crates/gpui3/src/elements/div.rs 🔗

@@ -1,9 +1,9 @@
 use crate::{
-    AnonymousElement, AnyElement, AppContext, BorrowWindow, Bounds, Clickable, DispatchPhase,
-    Element, ElementId, ElementIdentity, IdentifiedElement, Interactive, IntoAnyElement, LayoutId,
-    MouseClickEvent, MouseDownEvent, MouseEventListeners, MouseMoveEvent, MouseUpEvent, Overflow,
-    ParentElement, Pixels, Point, ScrollWheelEvent, SharedString, Style, StyleRefinement, Styled,
-    ViewContext,
+    Active, AnonymousElement, AnyElement, AppContext, BorrowWindow, Bounds, Click, DispatchPhase,
+    Element, ElementId, ElementIdentity, Hover, IdentifiedElement, Interactive, IntoAnyElement,
+    LayoutId, MouseClickEvent, MouseDownEvent, MouseEventListeners, MouseMoveEvent, MouseUpEvent,
+    Overflow, ParentElement, Pixels, Point, ScrollWheelEvent, SharedString, Style, StyleRefinement,
+    Styled, ViewContext,
 };
 use collections::HashMap;
 use parking_lot::Mutex;
@@ -449,7 +449,26 @@ where
     }
 }
 
-impl<V> Clickable for Div<V, IdentifiedElement> where V: 'static + Send + Sync {}
+impl<V, K> Hover for Div<V, K>
+where
+    V: 'static + Send + Sync,
+    K: ElementIdentity,
+{
+    fn set_hover_style(&mut self, style: StyleRefinement) {
+        self.hover_style = style;
+    }
+}
+
+impl<V> Click for Div<V, IdentifiedElement> where V: 'static + Send + Sync {}
+
+impl<V> Active for Div<V, IdentifiedElement>
+where
+    V: 'static + Send + Sync,
+{
+    fn set_active_style(&mut self, style: StyleRefinement) {
+        self.active_style = style;
+    }
+}
 
 fn paint_hover_listener<V>(bounds: Bounds<Pixels>, cx: &mut ViewContext<V>)
 where

crates/gpui3/src/elements/img.rs 🔗

@@ -1,6 +1,6 @@
 use crate::{
-    div, AnonymousElement, AnyElement, BorrowWindow, Bounds, Clickable, Div, DivState, Element,
-    ElementId, ElementIdentity, IdentifiedElement, Interactive, IntoAnyElement, LayoutId,
+    div, Active, AnonymousElement, AnyElement, BorrowWindow, Bounds, Click, Div, DivState, Element,
+    ElementId, ElementIdentity, Hover, IdentifiedElement, Interactive, IntoAnyElement, LayoutId,
     MouseEventListeners, Pixels, SharedString, StyleRefinement, Styled, ViewContext,
 };
 use futures::FutureExt;
@@ -141,4 +141,23 @@ where
     }
 }
 
-impl<V> Clickable for Img<V, IdentifiedElement> where V: 'static + Send + Sync {}
+impl<V, K> Hover for Img<V, K>
+where
+    V: 'static + Send + Sync,
+    K: ElementIdentity,
+{
+    fn set_hover_style(&mut self, style: StyleRefinement) {
+        self.base.set_hover_style(style);
+    }
+}
+
+impl<V> Click for Img<V, IdentifiedElement> where V: 'static + Send + Sync {}
+
+impl<V> Active for Img<V, IdentifiedElement>
+where
+    V: 'static + Send + Sync,
+{
+    fn set_active_style(&mut self, style: StyleRefinement) {
+        self.base.set_active_style(style)
+    }
+}

crates/gpui3/src/elements/svg.rs 🔗

@@ -1,7 +1,7 @@
 use crate::{
-    div, AnonymousElement, AnyElement, Bounds, Clickable, Div, DivState, Element, ElementId,
-    ElementIdentity, IdentifiedElement, Interactive, IntoAnyElement, LayoutId, MouseEventListeners,
-    Pixels, SharedString, StyleRefinement, Styled,
+    div, Active, AnonymousElement, AnyElement, Bounds, Click, Div, DivState, Element, ElementId,
+    ElementIdentity, Hover, IdentifiedElement, Interactive, IntoAnyElement, LayoutId,
+    MouseEventListeners, Pixels, SharedString, StyleRefinement, Styled,
 };
 use util::ResultExt;
 
@@ -116,4 +116,23 @@ where
     }
 }
 
-impl<V> Clickable for Svg<V, IdentifiedElement> where V: 'static + Send + Sync {}
+impl<V, K> Hover for Svg<V, K>
+where
+    V: 'static + Send + Sync,
+    K: ElementIdentity,
+{
+    fn set_hover_style(&mut self, style: StyleRefinement) {
+        self.base.set_hover_style(style);
+    }
+}
+
+impl<V> Click for Svg<V, IdentifiedElement> where V: 'static + Send + Sync {}
+
+impl<V> Active for Svg<V, IdentifiedElement>
+where
+    V: 'static + Send + Sync,
+{
+    fn set_active_style(&mut self, style: StyleRefinement) {
+        self.base.set_active_style(style)
+    }
+}

crates/gpui3/src/gpui3.rs 🔗

@@ -1,3 +1,4 @@
+mod active;
 mod app;
 mod assets;
 mod color;
@@ -6,6 +7,7 @@ mod elements;
 mod events;
 mod executor;
 mod geometry;
+mod hover;
 mod image_cache;
 mod interactive;
 mod platform;
@@ -20,6 +22,7 @@ mod util;
 mod view;
 mod window;
 
+pub use active::*;
 pub use anyhow::Result;
 pub use app::*;
 pub use assets::*;
@@ -30,6 +33,7 @@ pub use events::*;
 pub use executor::*;
 pub use geometry::*;
 pub use gpui3_macros::*;
+pub use hover::*;
 pub use image_cache::*;
 pub use interactive::*;
 pub use platform::*;

crates/gpui3/src/hover.rs 🔗

@@ -0,0 +1,13 @@
+use crate::StyleRefinement;
+
+pub trait Hover {
+    fn set_hover_style(&mut self, style: StyleRefinement);
+
+    fn hover(mut self, f: impl FnOnce(StyleRefinement) -> StyleRefinement) -> Self
+    where
+        Self: Sized,
+    {
+        self.set_hover_style(f(StyleRefinement::default()));
+        self
+    }
+}

crates/gpui3/src/interactive.rs 🔗

@@ -146,7 +146,7 @@ pub trait Interactive: Element {
     }
 }
 
-pub trait Clickable: Interactive {
+pub trait Click: Interactive {
     fn on_click(
         mut self,
         handler: impl Fn(&mut Self::ViewState, &MouseClickEvent, &mut ViewContext<Self::ViewState>)

crates/ui2/src/prelude.rs 🔗

@@ -1,6 +1,6 @@
 pub use gpui3::{
-    div, Clickable, Element, Hoverable, IntoAnyElement, ParentElement, ScrollState, Styled,
-    ViewContext, WindowContext,
+    div, Click, Element, Hover, IntoAnyElement, ParentElement, ScrollState, Styled, ViewContext,
+    WindowContext,
 };
 
 pub use crate::{theme, ButtonVariant, ElementExt, Theme};