diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index c95c0a6105..6b3cd03e8f 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -684,23 +684,41 @@ impl AppContext { ); }, ); + fn inner( + this: &mut AppContext, + name: &'static str, + deserializer: fn(serde_json::Value) -> anyhow::Result>, + action_id: TypeId, + view_id: TypeId, + handler: Box, + capture: bool, + ) { + this.action_deserializers + .entry(name) + .or_insert((action_id.clone(), deserializer)); - self.action_deserializers - .entry(A::qualified_name()) - .or_insert((TypeId::of::(), A::from_json_str)); + let actions = if capture { + &mut this.capture_actions + } else { + &mut this.actions + }; - let actions = if capture { - &mut self.capture_actions - } else { - &mut self.actions - }; - - actions - .entry(TypeId::of::()) - .or_default() - .entry(TypeId::of::()) - .or_default() - .push(handler); + actions + .entry(view_id) + .or_default() + .entry(action_id) + .or_default() + .push(handler); + } + inner( + self, + A::qualified_name(), + A::from_json_str, + TypeId::of::(), + TypeId::of::(), + handler, + capture, + ); } pub fn add_async_action(&mut self, mut handler: F)