Move dispatch_action_any_action_at to AsyncAppContext

This commit is contained in:
Antonio Scandurra 2023-05-01 16:40:57 +02:00
parent c4472b0786
commit eb2cce98a7
3 changed files with 37 additions and 49 deletions

View file

@ -167,9 +167,11 @@ impl PickerDelegate for CommandPaletteDelegate {
let focused_view_id = self.focused_view_id; let focused_view_id = self.focused_view_id;
let action_ix = self.matches[self.selected_ix].candidate_id; let action_ix = self.matches[self.selected_ix].candidate_id;
let action = self.actions.remove(action_ix).action; let action = self.actions.remove(action_ix).action;
cx.defer(move |_, cx| { cx.app_context()
cx.dispatch_any_action_at(window_id, focused_view_id, action); .spawn(move |mut cx| async move {
}); cx.dispatch_action(window_id, focused_view_id, action.as_ref())
})
.detach_and_log_err(cx);
} }
cx.emit(PickerEvent::Dismiss); cx.emit(PickerEvent::Dismiss);
} }

View file

@ -227,11 +227,13 @@ impl ContextMenu {
match action { match action {
ContextMenuItemAction::Action(action) => { ContextMenuItemAction::Action(action) => {
let window_id = cx.window_id(); let window_id = cx.window_id();
cx.dispatch_any_action_at( let view_id = self.parent_view_id;
window_id, let action = action.boxed_clone();
self.parent_view_id, cx.app_context()
action.boxed_clone(), .spawn(|mut cx| async move {
); cx.dispatch_action(window_id, view_id, action.as_ref())
})
.detach_and_log_err(cx);
} }
ContextMenuItemAction::Handler(handler) => handler(cx), ContextMenuItemAction::Handler(handler) => handler(cx),
} }
@ -459,11 +461,16 @@ impl ContextMenu {
let window_id = cx.window_id(); let window_id = cx.window_id();
match &action { match &action {
ContextMenuItemAction::Action(action) => { ContextMenuItemAction::Action(action) => {
cx.dispatch_any_action_at( let action = action.boxed_clone();
window_id, cx.app_context()
view_id, .spawn(|mut cx| async move {
action.boxed_clone(), cx.dispatch_action(
); window_id,
view_id,
action.as_ref(),
)
})
.detach_and_log_err(cx);
} }
ContextMenuItemAction::Handler(handler) => handler(cx), ContextMenuItemAction::Handler(handler) => handler(cx),
} }

View file

@ -309,6 +309,20 @@ impl AsyncAppContext {
self.0.borrow_mut().update_window(window_id, callback) self.0.borrow_mut().update_window(window_id, callback)
} }
pub fn dispatch_action(
&mut self,
window_id: usize,
view_id: usize,
action: &dyn Action,
) -> Result<()> {
self.0
.borrow_mut()
.update_window(window_id, |window| {
window.handle_dispatch_action_from_effect(Some(view_id), action);
})
.ok_or_else(|| anyhow!("window not found"))
}
pub fn add_model<T, F>(&mut self, build_model: F) -> ModelHandle<T> pub fn add_model<T, F>(&mut self, build_model: F) -> ModelHandle<T>
where where
T: Entity, T: Entity,
@ -1619,17 +1633,7 @@ impl AppContext {
Effect::RefreshWindows => { Effect::RefreshWindows => {
refreshing = true; refreshing = true;
} }
Effect::DispatchActionFrom {
window_id,
view_id,
action,
} => {
self.handle_dispatch_action_from_effect(
window_id,
Some(view_id),
action.as_ref(),
);
}
Effect::ActionDispatchNotification { action_id } => { Effect::ActionDispatchNotification { action_id } => {
self.handle_action_dispatch_notification_effect(action_id) self.handle_action_dispatch_notification_effect(action_id)
} }
@ -1745,19 +1749,6 @@ impl AppContext {
self.pending_effects.push_back(Effect::RefreshWindows); self.pending_effects.push_back(Effect::RefreshWindows);
} }
pub fn dispatch_any_action_at(
&mut self,
window_id: usize,
view_id: usize,
action: Box<dyn Action>,
) {
self.pending_effects.push_back(Effect::DispatchActionFrom {
window_id,
view_id,
action,
});
}
fn perform_window_refresh(&mut self) { fn perform_window_refresh(&mut self) {
let window_ids = self.windows.keys().cloned().collect::<Vec<_>>(); let window_ids = self.windows.keys().cloned().collect::<Vec<_>>();
for window_id in window_ids { for window_id in window_ids {
@ -2155,11 +2146,6 @@ pub enum Effect {
result: MatchResult, result: MatchResult,
}, },
RefreshWindows, RefreshWindows,
DispatchActionFrom {
window_id: usize,
view_id: usize,
action: Box<dyn Action>,
},
ActionDispatchNotification { ActionDispatchNotification {
action_id: TypeId, action_id: TypeId,
}, },
@ -2248,13 +2234,6 @@ impl Debug for Effect {
.field("view_id", view_id) .field("view_id", view_id)
.field("subscription_id", subscription_id) .field("subscription_id", subscription_id)
.finish(), .finish(),
Effect::DispatchActionFrom {
window_id, view_id, ..
} => f
.debug_struct("Effect::DispatchActionFrom")
.field("window_id", window_id)
.field("view_id", view_id)
.finish(),
Effect::ActionDispatchNotification { action_id, .. } => f Effect::ActionDispatchNotification { action_id, .. } => f
.debug_struct("Effect::ActionDispatchNotification") .debug_struct("Effect::ActionDispatchNotification")
.field("action_id", action_id) .field("action_id", action_id)