From fd94f2a5b591aa2f91d5ee894670ba61fa8415ca Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 20 Oct 2023 12:59:02 +0200 Subject: [PATCH] Checkpoint --- crates/gpui3/src/elements/div.rs | 16 ++++++++-------- crates/gpui3/src/focusable.rs | 7 ++++--- crates/gpui3/src/interactive.rs | 19 +++++++++++++------ 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/crates/gpui3/src/elements/div.rs b/crates/gpui3/src/elements/div.rs index 2e5fc1670ab78914f6587f841ed79c8de65f3a8e..b534812b9933023154510b00c8fec9807b523abf 100644 --- a/crates/gpui3/src/elements/div.rs +++ b/crates/gpui3/src/elements/div.rs @@ -236,14 +236,14 @@ where element_state: Option, cx: &mut ViewContext, ) -> Self::ElementState { - self.interaction.initialize(cx, |cx| { - self.focus.initialize(cx, |cx| { - for child in &mut self.children { - child.initialize(view_state, cx); - } - }); - }); - element_state.unwrap_or_default() + self.focus.initialize(cx, |focus_handle, cx| { + self.interaction + .initialize(element_state, focus_handle, cx, |cx| { + for child in &mut self.children { + child.initialize(view_state, cx); + } + }) + }) } fn layout( diff --git a/crates/gpui3/src/focusable.rs b/crates/gpui3/src/focusable.rs index 3fcc9b330acaceeff90ead1bda488b344a557438..6b6646a6d300782b3b40019666ba6e9dab88d0ff 100644 --- a/crates/gpui3/src/focusable.rs +++ b/crates/gpui3/src/focusable.rs @@ -146,15 +146,16 @@ pub trait ElementFocus: 'static + Send + Sync { fn initialize( &self, cx: &mut ViewContext, - f: impl FnOnce(&mut ViewContext) -> R, + f: impl FnOnce(Option, &mut ViewContext) -> R, ) -> R { if let Some(focusable) = self.as_focusable() { for listener in focusable.focus_listeners.iter().cloned() { cx.on_focus_changed(move |view, event, cx| listener(view, event, cx)); } - cx.with_focus(focusable.focus_handle.clone(), |cx| f(cx)) + let focus_handle = focusable.focus_handle.clone(); + cx.with_focus(focus_handle.clone(), |cx| f(Some(focus_handle), cx)) } else { - f(cx) + f(None, cx) } } diff --git a/crates/gpui3/src/interactive.rs b/crates/gpui3/src/interactive.rs index dd50082bae7a2e35d7708b20b561113d648d4e74..54e08e0fe39422a4ccc4de673dfb6d8b8be7887e 100644 --- a/crates/gpui3/src/interactive.rs +++ b/crates/gpui3/src/interactive.rs @@ -305,11 +305,13 @@ pub trait ElementInteraction: 'static + Send + Sync { fn as_stateful(&self) -> Option<&StatefulInteraction>; fn as_stateful_mut(&mut self) -> Option<&mut StatefulInteraction>; - fn initialize( + fn initialize( &mut self, + element_state: Option, + focus_handle: Option, cx: &mut ViewContext, - f: impl FnOnce(&mut ViewContext) -> R, - ) -> R { + f: impl FnOnce(&mut ViewContext), + ) -> InteractiveElementState { if let Some(stateful) = self.as_stateful_mut() { cx.with_element_id(stateful.id.clone(), |global_id, cx| { stateful.key_listeners.push(( @@ -327,15 +329,19 @@ pub trait ElementInteraction: 'static + Send + Sync { None }), )); - let result = stateful.stateless.initialize(cx, f); + let mut element_state = stateful.stateless.initialize(element_state, None, cx, f); + element_state.focus_handle = focus_handle + .or(element_state.focus_handle.take()) + .or_else(|| cx.focused()); stateful.key_listeners.pop(); - result + element_state }) } else { let stateless = self.as_stateless(); cx.with_key_dispatch_context(stateless.dispatch_context.clone(), |cx| { cx.with_key_listeners(&stateless.key_listeners, f) - }) + }); + element_state.unwrap_or_default() } } @@ -607,6 +613,7 @@ impl ActiveState { #[derive(Default)] pub struct InteractiveElementState { + focus_handle: Option, active_state: Arc>, pending_click: Arc>>, }