From 48a12be5380cf563efcc869dc0d7287c1bba8973 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 10 Oct 2023 15:03:47 +0200 Subject: [PATCH] WIP --- crates/gpui3/src/elements.rs | 1 + crates/gpui3/src/elements/hoverable.rs | 119 ++++++++++--------------- crates/gpui3/src/styled.rs | 12 +-- 3 files changed, 55 insertions(+), 77 deletions(-) diff --git a/crates/gpui3/src/elements.rs b/crates/gpui3/src/elements.rs index 5bd95ccebb..81d64ea132 100644 --- a/crates/gpui3/src/elements.rs +++ b/crates/gpui3/src/elements.rs @@ -1,4 +1,5 @@ mod div; +mod hoverable; mod img; mod stateless; mod svg; diff --git a/crates/gpui3/src/elements/hoverable.rs b/crates/gpui3/src/elements/hoverable.rs index eec4b4ff61..d6d9e1b1e5 100644 --- a/crates/gpui3/src/elements/hoverable.rs +++ b/crates/gpui3/src/elements/hoverable.rs @@ -1,23 +1,11 @@ use crate::{ - element::{AnyElement, Element, IntoElement, Layout, ParentElement}, - interactive::{InteractionHandlers, Interactive}, - style::{Style, StyleHelpers, Styleable}, - ViewContext, + Bounds, Element, Interactive, MouseEventListeners, Pixels, Style, Styled, ViewContext, }; use anyhow::Result; -use gpui::{geometry::vector::Vector2F, platform::MouseMovedEvent, LayoutId}; -use refineable::{CascadeSlot, Refineable, RefinementCascade}; -use smallvec::SmallVec; +use refineable::{CascadeSlot, RefinementCascade}; use std::{cell::Cell, rc::Rc}; -pub struct Hoverable { - hovered: Rc>, - cascade_slot: CascadeSlot, - hovered_style: ::Refinement, - child: E, -} - -pub fn hoverable(mut child: E) -> Hoverable { +pub fn hoverable(mut child: E) -> Hoverable { Hoverable { hovered: Rc::new(Cell::new(false)), cascade_slot: child.style_cascade().reserve(), @@ -26,80 +14,69 @@ pub fn hoverable(mut child: E) -> Hoverable { } } -impl Styleable for Hoverable { +pub struct Hoverable { + hovered: Rc>, + cascade_slot: CascadeSlot, + hovered_style: RefinementCascade, + child: E, +} + +impl Styled for Hoverable +where + E: Styled, +{ type Style = E::Style; - fn style_cascade(&mut self) -> &mut RefinementCascade { + fn style_cascade(&mut self) -> &mut RefinementCascade { self.child.style_cascade() } - fn declared_style(&mut self) -> &mut ::Refinement { + fn declared_style(&mut self) -> &mut ::Refinement { &mut self.hovered_style } } -impl + Styleable> Element for Hoverable { - type PaintState = E::PaintState; +impl + Styled> Interactive for Hoverable { + fn listeners(&mut self) -> &mut MouseEventListeners { + self.child.listeners() + } +} + +impl Element for Hoverable { + type State = E::State; + type FrameState = E::FrameState; fn layout( &mut self, - view: &mut V, - cx: &mut ViewContext, - ) -> Result<(LayoutId, Self::PaintState)> - where - Self: Sized, - { - Ok(self.child.layout(view, cx)?) + state: &mut Self::State, + cx: &mut ViewContext, + ) -> Result<(crate::LayoutId, Self::FrameState)> { + Ok(self.child.layout(state, cx)?) } fn paint( &mut self, - view: &mut V, - parent_origin: Vector2F, - layout: &Layout, - paint_state: &mut Self::PaintState, - cx: &mut ViewContext, - ) where - Self: Sized, - { - let bounds = layout.bounds + parent_origin; - self.hovered.set(bounds.contains_point(cx.mouse_position())); + bounds: Bounds, + state: &mut Self::State, + frame_state: &mut Self::FrameState, + cx: &mut ViewContext, + ) -> Result<()> { + todo!() + // self.hovered.set(bounds.contains_point(cx.mouse_position())); - let slot = self.cascade_slot; - let style = self.hovered.get().then_some(self.hovered_style.clone()); - self.style_cascade().set(slot, style); + // let slot = self.cascade_slot; + // let style = self.hovered.get().then_some(self.hovered_style.clone()); + // self.style_cascade().set(slot, style); - let hovered = self.hovered.clone(); - cx.on_event(layout.order, move |_view, _: &MouseMovedEvent, cx| { - cx.bubble_event(); - if bounds.contains_point(cx.mouse_position()) != hovered.get() { - cx.repaint(); - } - }); + // let hovered = self.hovered.clone(); + // cx.on_event(layout.order, move |_view, _: &MouseMovedEvent, cx| { + // cx.bubble_event(); + // if bounds.contains_point(cx.mouse_position()) != hovered.get() { + // cx.repaint(); + // } + // }); - self.child - .paint(view, parent_origin, layout, paint_state, cx); - } -} - -impl> StyleHelpers for Hoverable {} - -impl + Styleable> Interactive for Hoverable { - fn interaction_handlers(&mut self) -> &mut InteractionHandlers { - self.child.interaction_handlers() - } -} - -impl + Styleable> ParentElement for Hoverable { - fn children_mut(&mut self) -> &mut SmallVec<[AnyElement; 2]> { - self.child.children_mut() - } -} - -impl + Styleable> IntoElement for Hoverable { - type Element = Self; - - fn into_element(self) -> Self::Element { - self + // self.child + // .paint(view, parent_origin, layout, paint_state, cx); } } diff --git a/crates/gpui3/src/styled.rs b/crates/gpui3/src/styled.rs index b24be2047a..1691cee54a 100644 --- a/crates/gpui3/src/styled.rs +++ b/crates/gpui3/src/styled.rs @@ -10,12 +10,12 @@ pub trait Styled { Self::Style::from_refinement(&self.style_cascade().merged()) } - // fn hover(self) -> Hoverable - // where - // Self: Sized, - // { - // hoverable(self) - // } + fn hover(self) -> Hoverable + where + Self: Sized, + { + hoverable(self) + } // fn active(self) -> Pressable // where