diff --git a/gpui/src/app.rs b/gpui/src/app.rs index 9a8c00788d55603363bf27daa2a1b6d5772c7d18..3c84da64ddf354651b113c09e9f87ea094dcb8c4 100644 --- a/gpui/src/app.rs +++ b/gpui/src/app.rs @@ -77,7 +77,7 @@ pub enum MenuItem<'a> { name: &'a str, keystroke: Option<&'a str>, action: &'a str, - arg: Option>, + arg: Option>, }, Separator, } @@ -172,7 +172,7 @@ impl App { pub fn on_menu_command(self, mut callback: F) -> Self where - F: 'static + FnMut(&str, Option<&dyn Any>, &mut MutableAppContext), + F: 'static + FnMut(&str, Option<&(dyn Any + 'static)>, &mut MutableAppContext), { let ctx = self.0.clone(); self.0 @@ -646,7 +646,7 @@ impl MutableAppContext { self.dispatch_global_action_with_dyn_arg(name, Box::new(arg).as_ref()); } - fn dispatch_global_action_with_dyn_arg(&mut self, name: &str, arg: &dyn Any) { + pub fn dispatch_global_action_with_dyn_arg(&mut self, name: &str, arg: &dyn Any) { if let Some((name, mut handlers)) = self.global_actions.remove_entry(name) { self.pending_flushes += 1; for handler in handlers.iter_mut().rev() { diff --git a/zed/src/main.rs b/zed/src/main.rs index 980262d197862d491c0af2753291e5a91d910c9b..b5fc625eec3e810cf3f0859315f0e592ebd5fd9b 100644 --- a/zed/src/main.rs +++ b/zed/src/main.rs @@ -16,27 +16,9 @@ fn main() { let app = gpui::App::new(assets::Assets).unwrap(); let (_, settings_rx) = settings::channel(&app.font_cache()).unwrap(); app.set_menus(menus::menus(settings_rx.clone())); - app.on_menu_command(move |command, arg, ctx| match command { - "app:open" => { - if let Some(paths) = ctx.platform().prompt_for_paths(PathPromptOptions { - files: true, - directories: true, - multiple: true, - }) { - ctx.dispatch_global_action( - "workspace:open_paths", - OpenParams { - paths, - settings: arg - .unwrap() - .downcast_ref::>() - .unwrap() - .clone(), - }, - ); - } - } - _ => ctx.dispatch_global_action(command, ()), + app.on_menu_command(move |command, arg, ctx| { + eprintln!("command: {:?} {:?}", command, arg); + ctx.dispatch_global_action_with_dyn_arg(command, arg.unwrap_or(&())) }) .run(move |ctx| { workspace::init(ctx); diff --git a/zed/src/menus.rs b/zed/src/menus.rs index 7da690972e8889a9d892c49f29337f7ca44e2884..03681f4dd2cc4f37e8ab3fa106385a651a4b1b1c 100644 --- a/zed/src/menus.rs +++ b/zed/src/menus.rs @@ -27,7 +27,7 @@ pub fn menus(settings: Receiver) -> Vec> { items: vec![MenuItem::Action { name: "Open…", keystroke: Some("cmd-o"), - action: "app:open", + action: "workspace:open", arg: Some(Box::new(settings)), }], }, diff --git a/zed/src/workspace/mod.rs b/zed/src/workspace/mod.rs index a441eb8b8b1c06baf299c05e6f65088c933430bb..4cf765b0aa18f65d57b21174d2f3c82e5cfb45ba 100644 --- a/zed/src/workspace/mod.rs +++ b/zed/src/workspace/mod.rs @@ -8,11 +8,15 @@ pub use pane_group::*; pub use workspace::*; pub use workspace_view::*; -use crate::{settings::Settings, watch}; -use gpui::MutableAppContext; +use crate::{ + settings::Settings, + watch::{self, Receiver}, +}; +use gpui::{MutableAppContext, PathPromptOptions}; use std::path::PathBuf; pub fn init(app: &mut MutableAppContext) { + app.add_global_action("workspace:open", open); app.add_global_action("workspace:open_paths", open_paths); app.add_global_action("app:quit", quit); pane::init(app); @@ -24,6 +28,22 @@ pub struct OpenParams { pub settings: watch::Receiver, } +fn open(settings: &Receiver, ctx: &mut MutableAppContext) { + if let Some(paths) = ctx.platform().prompt_for_paths(PathPromptOptions { + files: true, + directories: true, + multiple: true, + }) { + ctx.dispatch_global_action( + "workspace:open_paths", + OpenParams { + paths, + settings: settings.clone(), + }, + ); + } +} + fn open_paths(params: &OpenParams, app: &mut MutableAppContext) { log::info!("open paths {:?}", params.paths);