Checkpoint
This commit is contained in:
@@ -236,14 +236,14 @@ where
|
||||
element_state: Option<Self::ElementState>,
|
||||
cx: &mut ViewContext<Self::ViewState>,
|
||||
) -> 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(
|
||||
|
||||
@@ -146,15 +146,16 @@ pub trait ElementFocus<V: 'static + Send + Sync>: 'static + Send + Sync {
|
||||
fn initialize<R>(
|
||||
&self,
|
||||
cx: &mut ViewContext<V>,
|
||||
f: impl FnOnce(&mut ViewContext<V>) -> R,
|
||||
f: impl FnOnce(Option<FocusHandle>, &mut ViewContext<V>) -> 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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -305,11 +305,13 @@ pub trait ElementInteraction<V: 'static + Send + Sync>: 'static + Send + Sync {
|
||||
fn as_stateful(&self) -> Option<&StatefulInteraction<V>>;
|
||||
fn as_stateful_mut(&mut self) -> Option<&mut StatefulInteraction<V>>;
|
||||
|
||||
fn initialize<R>(
|
||||
fn initialize(
|
||||
&mut self,
|
||||
element_state: Option<InteractiveElementState>,
|
||||
focus_handle: Option<FocusHandle>,
|
||||
cx: &mut ViewContext<V>,
|
||||
f: impl FnOnce(&mut ViewContext<V>) -> R,
|
||||
) -> R {
|
||||
f: impl FnOnce(&mut ViewContext<V>),
|
||||
) -> 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<V: 'static + Send + Sync>: '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<FocusHandle>,
|
||||
active_state: Arc<Mutex<ActiveState>>,
|
||||
pending_click: Arc<Mutex<Option<MouseDownEvent>>>,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user