Discover available python environments with Jupyter kernel support (#20467)

![image](https://github.com/user-attachments/assets/7c042bc9-88be-4d7b-b63d-e5b555d54b18)

Closes #18291
Closes #16757
Closes #15563

Release Notes:

- Added support for kernelspecs based on python environments
This commit is contained in:
Kyle Kelley 2024-11-11 10:19:05 -08:00 committed by GitHub
parent 6152230152
commit 97b542b22a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 269 additions and 148 deletions

View file

@ -4,8 +4,10 @@ use crate::KERNEL_DOCS_URL;
use gpui::DismissEvent;
use gpui::FontWeight;
use picker::Picker;
use picker::PickerDelegate;
use project::WorktreeId;
use std::sync::Arc;
use ui::ListItemSpacing;
@ -22,7 +24,7 @@ pub struct KernelSelector<T: PopoverTrigger> {
on_select: OnSelect,
trigger: T,
info_text: Option<SharedString>,
current_kernelspec: Option<KernelSpecification>,
worktree_id: WorktreeId,
}
pub struct KernelPickerDelegate {
@ -33,17 +35,13 @@ pub struct KernelPickerDelegate {
}
impl<T: PopoverTrigger> KernelSelector<T> {
pub fn new(
on_select: OnSelect,
current_kernelspec: Option<KernelSpecification>,
trigger: T,
) -> Self {
pub fn new(on_select: OnSelect, worktree_id: WorktreeId, trigger: T) -> Self {
KernelSelector {
on_select,
handle: None,
trigger,
info_text: None,
current_kernelspec,
worktree_id,
}
}
@ -130,24 +128,34 @@ impl PickerDelegate for KernelPickerDelegate {
.spacing(ListItemSpacing::Sparse)
.selected(selected)
.child(
h_flex().w_full().justify_between().min_w(px(200.)).child(
h_flex()
.gap_1p5()
.child(Label::new(kernelspec.name()))
.child(
Label::new(kernelspec.type_name())
.size(LabelSize::XSmall)
.color(Color::Muted),
),
),
v_flex()
.min_w(px(600.))
.w_full()
.gap_0p5()
.child(
h_flex()
.w_full()
.gap_1()
.child(Label::new(kernelspec.name()).weight(FontWeight::MEDIUM))
.child(
Label::new(kernelspec.language())
.size(LabelSize::Small)
.color(Color::Muted),
),
)
.child(
Label::new(kernelspec.path())
.size(LabelSize::XSmall)
.color(Color::Muted),
),
)
.end_slot(div().when(is_selected, |this| {
this.child(
.when(is_selected, |item| {
item.end_slot(
Icon::new(IconName::Check)
.color(Color::Accent)
.size(IconSize::Small),
)
})),
}),
)
}
@ -175,10 +183,13 @@ impl PickerDelegate for KernelPickerDelegate {
impl<T: PopoverTrigger> RenderOnce for KernelSelector<T> {
fn render(self, cx: &mut WindowContext) -> impl IntoElement {
let store = ReplStore::global(cx).read(cx);
let all_kernels: Vec<KernelSpecification> =
store.kernel_specifications().cloned().collect();
let selected_kernelspec = self.current_kernelspec;
let all_kernels: Vec<KernelSpecification> = store
.kernel_specifications_for_worktree(self.worktree_id)
.cloned()
.collect();
let selected_kernelspec = store.active_kernelspec(self.worktree_id, None, cx);
let delegate = KernelPickerDelegate {
on_select: self.on_select,