Show kernel options in a picker (#20274)
Closes #18341 * [x] Remove "Change Kernel" Doc link from REPL menu * [x] Remove chevron * [x] Set a higher min width * [x] Include the language along with the kernel name Future PRs will address * Add support for Python envs (#18291, #16757, #15563) * Add support for Remote kernels * Project settings support (#16898) Release Notes: - Added kernel picker for repl --------- Co-authored-by: Nate Butler <iamnbutler@gmail.com>
This commit is contained in:
parent
f6d4a73c34
commit
36fe364c05
13 changed files with 492 additions and 63 deletions
|
@ -1,9 +1,9 @@
|
|||
use collections::HashMap;
|
||||
use editor::Editor;
|
||||
use gpui::{
|
||||
actions, prelude::*, AnyElement, AppContext, EventEmitter, FocusHandle, FocusableView,
|
||||
FontWeight, Subscription, View,
|
||||
};
|
||||
use std::collections::HashMap;
|
||||
use ui::{prelude::*, ButtonLike, ElevationIndex, KeyBinding, ListItem, Tooltip};
|
||||
use util::ResultExt as _;
|
||||
use workspace::item::ItemEvent;
|
||||
|
@ -12,7 +12,7 @@ use workspace::{item::Item, Workspace};
|
|||
|
||||
use crate::jupyter_settings::JupyterSettings;
|
||||
use crate::repl_store::ReplStore;
|
||||
use crate::KernelSpecification;
|
||||
use crate::{KernelSpecification, KERNEL_DOCS_URL};
|
||||
|
||||
actions!(
|
||||
repl,
|
||||
|
@ -238,14 +238,24 @@ impl Render for ReplSessionsPage {
|
|||
);
|
||||
}
|
||||
|
||||
let mut kernels_by_language: HashMap<String, Vec<KernelSpecification>> = HashMap::default();
|
||||
for spec in kernel_specifications {
|
||||
kernels_by_language
|
||||
.entry(spec.kernelspec.language.clone())
|
||||
.or_default()
|
||||
.push(spec);
|
||||
let mut kernels_by_language: HashMap<SharedString, Vec<&KernelSpecification>> =
|
||||
kernel_specifications
|
||||
.iter()
|
||||
.map(|spec| (spec.language(), spec))
|
||||
.fold(HashMap::new(), |mut acc, (language, spec)| {
|
||||
acc.entry(language).or_default().push(spec);
|
||||
acc
|
||||
});
|
||||
|
||||
for kernels in kernels_by_language.values_mut() {
|
||||
kernels.sort_by_key(|a| a.name())
|
||||
}
|
||||
|
||||
// Convert to a sorted Vec of tuples
|
||||
let mut sorted_kernels: Vec<(SharedString, Vec<&KernelSpecification>)> =
|
||||
kernels_by_language.into_iter().collect();
|
||||
sorted_kernels.sort_by(|a, b| a.0.cmp(&b.0));
|
||||
|
||||
let kernels_available = v_flex()
|
||||
.child(Label::new("Kernels available").size(LabelSize::Large))
|
||||
.gap_2()
|
||||
|
@ -262,11 +272,11 @@ impl Render for ReplSessionsPage {
|
|||
.child(Label::new("REPL documentation"))
|
||||
.child(Icon::new(IconName::Link))
|
||||
.on_click(move |_, cx| {
|
||||
cx.open_url("https://zed.dev/docs/repl#changing-kernels")
|
||||
cx.open_url(KERNEL_DOCS_URL)
|
||||
}),
|
||||
),
|
||||
)
|
||||
.children(kernels_by_language.into_iter().map(|(language, specs)| {
|
||||
.children(sorted_kernels.into_iter().map(|(language, specs)| {
|
||||
let chosen_kernel = store.read(cx).kernelspec(&language, cx);
|
||||
|
||||
v_flex()
|
||||
|
@ -274,13 +284,12 @@ impl Render for ReplSessionsPage {
|
|||
.child(Label::new(language.clone()).weight(FontWeight::BOLD))
|
||||
.children(specs.into_iter().map(|spec| {
|
||||
let is_choice = if let Some(chosen_kernel) = &chosen_kernel {
|
||||
chosen_kernel.name.to_lowercase() == spec.name.to_lowercase()
|
||||
&& chosen_kernel.path == spec.path
|
||||
chosen_kernel == spec
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
let path = SharedString::from(spec.path.to_string_lossy().to_string());
|
||||
let path = spec.path();
|
||||
|
||||
ListItem::new(path.clone())
|
||||
.selectable(false)
|
||||
|
@ -290,7 +299,7 @@ impl Render for ReplSessionsPage {
|
|||
.child(
|
||||
h_flex()
|
||||
.gap_1()
|
||||
.child(div().id(path.clone()).child(Label::new(spec.name.clone())))
|
||||
.child(div().id(path.clone()).child(Label::new(spec.name())))
|
||||
.when(is_choice, |el| {
|
||||
|
||||
let language = language.clone();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue