diff --git a/crates/gpui3/src/element.rs b/crates/gpui3/src/element.rs index 1c287ed769a26cecd193468a6ed50da3bda3e990..961a22a5f95c189ac31ce351af1e56d2f51272e8 100644 --- a/crates/gpui3/src/element.rs +++ b/crates/gpui3/src/element.rs @@ -1,8 +1,9 @@ use crate::{ - BorrowWindow, Bounds, ElementId, FocusHandle, FocusListeners, LayoutId, Pixels, Point, - StyleRefinement, ViewContext, + BorrowWindow, Bounds, DispatchPhase, ElementId, FocusHandle, FocusListeners, LayoutId, + MouseDownEvent, Pixels, Point, Style, StyleRefinement, ViewContext, WindowContext, }; use derive_more::{Deref, DerefMut}; +use refineable::Refineable; pub(crate) use smallvec::SmallVec; use std::mem; @@ -75,6 +76,36 @@ pub trait ElementFocusability: 'static + Send + Sync { f(cx) } } + + fn refine_style(&self, style: &mut Style, cx: &WindowContext) { + if let Some(focusable) = self.as_focusable() { + if focusable.focus_handle.contains_focused(cx) { + style.refine(&focusable.focus_in_style); + } + + if focusable.focus_handle.within_focused(cx) { + style.refine(&focusable.in_focus_style); + } + + if focusable.focus_handle.is_focused(cx) { + style.refine(&focusable.focus_style); + } + } + } + + fn paint(&self, bounds: Bounds, cx: &mut WindowContext) { + if let Some(focusable) = self.as_focusable() { + let focus_handle = focusable.focus_handle.clone(); + cx.on_mouse_event(move |event: &MouseDownEvent, phase, cx| { + if phase == DispatchPhase::Bubble && bounds.contains_point(&event.position) { + if !cx.default_prevented() { + cx.focus(&focus_handle); + cx.prevent_default(); + } + } + }) + } + } } pub struct Focusable { diff --git a/crates/gpui3/src/elements/div.rs b/crates/gpui3/src/elements/div.rs index 035e0a8a470df91d7e388873bbd1dcb8e815cdc6..27e245bafba1e32518ea3bd90cfe004089fa836b 100644 --- a/crates/gpui3/src/elements/div.rs +++ b/crates/gpui3/src/elements/div.rs @@ -197,19 +197,7 @@ where let mut computed_style = Style::default(); computed_style.refine(&self.base_style); - if let Some(focusable) = self.focusability.as_focusable() { - if focusable.focus_handle.contains_focused(cx) { - computed_style.refine(&focusable.focus_in_style); - } - - if focusable.focus_handle.within_focused(cx) { - computed_style.refine(&focusable.in_focus_style); - } - - if focusable.focus_handle.is_focused(cx) { - computed_style.refine(&focusable.focus_style); - } - } + self.focusability.refine_style(&mut computed_style, cx); let mouse_position = cx.mouse_position(); @@ -312,18 +300,6 @@ where }); } - if let Some(focusable) = self.focusability.as_focusable() { - let focus_handle = focusable.focus_handle.clone(); - cx.on_mouse_event(move |_, event: &MouseDownEvent, phase, cx| { - if phase == DispatchPhase::Bubble && bounds.contains_point(&event.position) { - if !cx.default_prevented() { - cx.focus(&focus_handle); - cx.prevent_default(); - } - } - }) - } - for listener in mem::take(&mut self.interactive_state.mouse_down) { cx.on_mouse_event(move |state, event: &MouseDownEvent, phase, cx| { listener(state, event, &bounds, phase, cx); @@ -508,6 +484,7 @@ where element_state.active_state.clone(), cx, ); + this.focusability.paint(bounds, cx); this.paint_event_listeners(bounds, element_state.pending_click.clone(), cx); });