repl: Replace REPL panel with sessions view (#14981)

This PR removes the REPL panel and replaces it with a new sessions view
that gets displayed in its own pane.

The sessions view can be opened with the `repl: sessions` command (we
can adjust the name, as needed).

There was a rather in-depth refactoring needed to extricate the various
REPL functionality on the editor from the `RuntimePanel`.

<img width="1136" alt="Screenshot 2024-07-22 at 4 12 12 PM"
src="https://github.com/user-attachments/assets/ac0da351-778e-4200-b08c-39f9e77d78bf">

<img width="1136" alt="Screenshot 2024-07-22 at 4 12 17 PM"
src="https://github.com/user-attachments/assets/6ca53476-6ac4-4f8b-afc8-f7863f7065c7">

Release Notes:

- N/A
This commit is contained in:
Marshall Bowers 2024-07-22 16:22:50 -04:00 committed by GitHub
parent 8f20ea1093
commit d8a42bbf63
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 474 additions and 637 deletions

View file

@ -2,8 +2,8 @@ use std::time::Duration;
use gpui::{percentage, Animation, AnimationExt, AnyElement, Transformation, View};
use repl::{
ExecutionState, JupyterSettings, Kernel, KernelSpecification, KernelStatus, RuntimePanel,
Session, SessionSupport,
ExecutionState, JupyterSettings, Kernel, KernelSpecification, KernelStatus, Session,
SessionSupport,
};
use ui::{
prelude::*, ButtonLike, ContextMenu, IconWithIndicator, Indicator, IntoElement, PopoverMenu,
@ -39,15 +39,7 @@ impl QuickActionBar {
return None;
}
let workspace = self.workspace.upgrade()?.read(cx);
let (editor, repl_panel) = if let (Some(editor), Some(repl_panel)) =
(self.active_editor(), workspace.panel::<RuntimePanel>(cx))
{
(editor, repl_panel)
} else {
return None;
};
let editor = self.active_editor()?;
let has_nonempty_selection = {
editor.update(cx, |this, cx| {
@ -62,10 +54,7 @@ impl QuickActionBar {
})
};
let session = repl_panel.update(cx, |repl_panel, cx| {
repl_panel.session(editor.downgrade(), cx)
});
let session = repl::session(editor.downgrade(), cx);
let session = match session {
SessionSupport::ActiveSession(session) => session,
SessionSupport::Inactive(spec) => {
@ -84,18 +73,15 @@ impl QuickActionBar {
let element_id = |suffix| ElementId::Name(format!("{}-{}", id, suffix).into());
let panel_clone = repl_panel.clone();
let editor_clone = editor.downgrade();
let editor = editor.downgrade();
let dropdown_menu = PopoverMenu::new(element_id("menu"))
.menu(move |cx| {
let panel_clone = panel_clone.clone();
let editor_clone = editor_clone.clone();
let editor = editor.clone();
let session = session.clone();
ContextMenu::build(cx, move |menu, cx| {
let menu_state = session_state(session, cx);
let status = menu_state.status;
let editor_clone = editor_clone.clone();
let panel_clone = panel_clone.clone();
let editor = editor.clone();
menu.when_else(
status.is_connected(),
@ -139,7 +125,6 @@ impl QuickActionBar {
},
)
.separator()
// Run
.custom_entry(
move |_cx| {
Label::new(if has_nonempty_selection {
@ -150,17 +135,12 @@ impl QuickActionBar {
.into_any_element()
},
{
let panel_clone = panel_clone.clone();
let editor_clone = editor_clone.clone();
let editor = editor.clone();
move |cx| {
let editor_clone = editor_clone.clone();
panel_clone.update(cx, |this, cx| {
this.run(editor_clone.clone(), cx).log_err();
});
repl::run(editor.clone(), cx).log_err();
}
},
)
// Interrupt
.custom_entry(
move |_cx| {
Label::new("Interrupt")
@ -169,17 +149,12 @@ impl QuickActionBar {
.into_any_element()
},
{
let panel_clone = panel_clone.clone();
let editor_clone = editor_clone.clone();
let editor = editor.clone();
move |cx| {
let editor_clone = editor_clone.clone();
panel_clone.update(cx, |this, cx| {
this.interrupt(editor_clone, cx);
});
repl::interrupt(editor.clone(), cx);
}
},
)
// Clear Outputs
.custom_entry(
move |_cx| {
Label::new("Clear Outputs")
@ -188,13 +163,9 @@ impl QuickActionBar {
.into_any_element()
},
{
let panel_clone = panel_clone.clone();
let editor_clone = editor_clone.clone();
let editor = editor.clone();
move |cx| {
let editor_clone = editor_clone.clone();
panel_clone.update(cx, |this, cx| {
this.clear_outputs(editor_clone, cx);
});
repl::clear_outputs(editor.clone(), cx);
}
},
)
@ -207,7 +178,6 @@ impl QuickActionBar {
)
// TODO: Add Restart action
// .action("Restart", Box::new(gpui::NoAction))
// Shut down kernel
.custom_entry(
move |_cx| {
Label::new("Shut Down Kernel")
@ -216,13 +186,9 @@ impl QuickActionBar {
.into_any_element()
},
{
let panel_clone = panel_clone.clone();
let editor_clone = editor_clone.clone();
let editor = editor.clone();
move |cx| {
let editor_clone = editor_clone.clone();
panel_clone.update(cx, |this, cx| {
this.shutdown(editor_clone, cx);
});
repl::shutdown(editor.clone(), cx);
}
},
)