From 706c385c24f7cda1b997fd790e744320dbe20186 Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Fri, 8 Nov 2024 06:58:44 -0800 Subject: [PATCH] Register repl actions with editor after session started (#20396) Makes repl actions that are specific to running kernels only come up after a session has been started at least once for the editor. Release Notes: - Only show session oriented `repl::` actions for editors after a session has been created --- crates/repl/src/repl_editor.rs | 58 ++++++++++++++++++++++++++++- crates/repl/src/repl_sessions_ui.rs | 52 -------------------------- crates/repl/src/session.rs | 9 +++++ 3 files changed, 66 insertions(+), 53 deletions(-) diff --git a/crates/repl/src/repl_editor.rs b/crates/repl/src/repl_editor.rs index 33169583b3395e907ce0893fff42d4c6a1b3a5ef..c6ab17320452c5406af6f1ef05e4b2787f462049 100644 --- a/crates/repl/src/repl_editor.rs +++ b/crates/repl/src/repl_editor.rs @@ -10,7 +10,9 @@ use language::{BufferSnapshot, Language, LanguageName, Point}; use crate::repl_store::ReplStore; use crate::session::SessionEvent; -use crate::{KernelSpecification, Session}; +use crate::{ + ClearOutputs, Interrupt, JupyterSettings, KernelSpecification, Restart, Session, Shutdown, +}; pub fn assign_kernelspec( kernel_specification: KernelSpecification, @@ -240,6 +242,60 @@ pub fn restart(editor: WeakView, cx: &mut WindowContext) { }); } +pub fn setup_editor_session_actions(editor: &mut Editor, editor_handle: WeakView) { + editor + .register_action({ + let editor_handle = editor_handle.clone(); + move |_: &ClearOutputs, cx| { + if !JupyterSettings::enabled(cx) { + return; + } + + crate::clear_outputs(editor_handle.clone(), cx); + } + }) + .detach(); + + editor + .register_action({ + let editor_handle = editor_handle.clone(); + move |_: &Interrupt, cx| { + if !JupyterSettings::enabled(cx) { + return; + } + + crate::interrupt(editor_handle.clone(), cx); + } + }) + .detach(); + + editor + .register_action({ + let editor_handle = editor_handle.clone(); + move |_: &Shutdown, cx| { + if !JupyterSettings::enabled(cx) { + return; + } + + crate::shutdown(editor_handle.clone(), cx); + } + }) + .detach(); + + editor + .register_action({ + let editor_handle = editor_handle.clone(); + move |_: &Restart, cx| { + if !JupyterSettings::enabled(cx) { + return; + } + + crate::restart(editor_handle.clone(), cx); + } + }) + .detach(); +} + fn cell_range(buffer: &BufferSnapshot, start_row: u32, end_row: u32) -> Range { let mut snippet_end_row = end_row; while buffer.is_line_blank(snippet_end_row) && snippet_end_row > start_row { diff --git a/crates/repl/src/repl_sessions_ui.rs b/crates/repl/src/repl_sessions_ui.rs index 5f2f9f3bfd41dc58530e8eab5b951290f7311e88..ae30d8cb9b5f1317b7f1c7e2c8bb4c4980c1a4d7 100644 --- a/crates/repl/src/repl_sessions_ui.rs +++ b/crates/repl/src/repl_sessions_ui.rs @@ -97,58 +97,6 @@ pub fn init(cx: &mut AppContext) { } }) .detach(); - - editor - .register_action({ - let editor_handle = editor_handle.clone(); - move |_: &ClearOutputs, cx| { - if !JupyterSettings::enabled(cx) { - return; - } - - crate::clear_outputs(editor_handle.clone(), cx); - } - }) - .detach(); - - editor - .register_action({ - let editor_handle = editor_handle.clone(); - move |_: &Interrupt, cx| { - if !JupyterSettings::enabled(cx) { - return; - } - - crate::interrupt(editor_handle.clone(), cx); - } - }) - .detach(); - - editor - .register_action({ - let editor_handle = editor_handle.clone(); - move |_: &Shutdown, cx| { - if !JupyterSettings::enabled(cx) { - return; - } - - crate::shutdown(editor_handle.clone(), cx); - } - }) - .detach(); - - editor - .register_action({ - let editor_handle = editor_handle.clone(); - move |_: &Restart, cx| { - if !JupyterSettings::enabled(cx) { - return; - } - - crate::restart(editor_handle.clone(), cx); - } - }) - .detach(); }) .detach(); } diff --git a/crates/repl/src/session.rs b/crates/repl/src/session.rs index 0ac6aabbdbd0d39e7cc255f19ecebaa268b009e8..9ad5636dd1422cca5832a35b81df2171326ce207 100644 --- a/crates/repl/src/session.rs +++ b/crates/repl/src/session.rs @@ -1,4 +1,5 @@ use crate::components::KernelListItem; +use crate::setup_editor_session_actions; use crate::{ kernels::{Kernel, KernelSpecification, RunningKernel}, outputs::{ExecutionStatus, ExecutionView}, @@ -207,6 +208,14 @@ impl Session { None => Subscription::new(|| {}), }; + let editor_handle = editor.clone(); + + editor + .update(cx, |editor, _cx| { + setup_editor_session_actions(editor, editor_handle); + }) + .ok(); + let mut session = Self { fs, editor,