Set up editor actions after workspace not on stack (#20445)

Kyle Kelley and Conrad Irwin created

Release Notes:

- N/A

Co-authored-by: Conrad Irwin <conrad@zed.dev>

Change summary

crates/repl/src/repl_sessions_ui.rs | 65 ++++++++++++++++--------------
crates/workspace/src/workspace.rs   |  5 ++
2 files changed, 39 insertions(+), 31 deletions(-)

Detailed changes

crates/repl/src/repl_sessions_ui.rs 🔗

@@ -61,42 +61,45 @@ pub fn init(cx: &mut AppContext) {
             return;
         }
 
-        let is_local_project = editor
-            .workspace()
-            .map(|workspace| workspace.read(cx).project().read(cx).is_local())
-            .unwrap_or(false);
+        cx.defer(|editor, cx| {
+            let workspace = Workspace::for_window(cx);
 
-        if !is_local_project {
-            return;
-        }
+            let is_local_project = workspace
+                .map(|workspace| workspace.read(cx).project().read(cx).is_local())
+                .unwrap_or(false);
 
-        let editor_handle = cx.view().downgrade();
+            if !is_local_project {
+                return;
+            }
 
-        editor
-            .register_action({
-                let editor_handle = editor_handle.clone();
-                move |_: &Run, cx| {
-                    if !JupyterSettings::enabled(cx) {
-                        return;
-                    }
+            let editor_handle = cx.view().downgrade();
 
-                    crate::run(editor_handle.clone(), true, cx).log_err();
-                }
-            })
-            .detach();
-
-        editor
-            .register_action({
-                let editor_handle = editor_handle.clone();
-                move |_: &RunInPlace, cx| {
-                    if !JupyterSettings::enabled(cx) {
-                        return;
-                    }
+            editor
+                .register_action({
+                    let editor_handle = editor_handle.clone();
+                    move |_: &Run, cx| {
+                        if !JupyterSettings::enabled(cx) {
+                            return;
+                        }
 
-                    crate::run(editor_handle.clone(), false, cx).log_err();
-                }
-            })
-            .detach();
+                        crate::run(editor_handle.clone(), true, cx).log_err();
+                    }
+                })
+                .detach();
+
+            editor
+                .register_action({
+                    let editor_handle = editor_handle.clone();
+                    move |_: &RunInPlace, cx| {
+                        if !JupyterSettings::enabled(cx) {
+                            return;
+                        }
+
+                        crate::run(editor_handle.clone(), false, cx).log_err();
+                    }
+                })
+                .detach();
+        });
     })
     .detach();
 }

crates/workspace/src/workspace.rs 🔗

@@ -4547,6 +4547,11 @@ impl Workspace {
                 .children(leader_border),
         )
     }
+
+    pub fn for_window(cx: &mut WindowContext) -> Option<View<Workspace>> {
+        let window = cx.window_handle().downcast::<Workspace>()?;
+        cx.read_window(&window, |workspace, _| workspace).ok()
+    }
 }
 
 fn leader_border_for_pane(