Update model selector (#15665)

Release Notes:

- N/A

---------

Co-authored-by: Marshall Bowers <elliott.codes@gmail.com>
This commit is contained in:
Nate Butler 2024-08-01 21:57:51 -04:00 committed by GitHub
parent 5e011ab029
commit b4dcd6d394
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 130 additions and 10 deletions

View file

@ -3,7 +3,8 @@ use std::sync::Arc;
use crate::assistant_settings::AssistantSettings;
use fs::Fs;
use gpui::SharedString;
use language_model::LanguageModelRegistry;
use language_model::{LanguageModelAvailability, LanguageModelRegistry};
use proto::Plan;
use settings::update_settings_file;
use ui::{prelude::*, ContextMenu, PopoverMenu, PopoverMenuHandle, PopoverTrigger};
@ -37,7 +38,7 @@ impl<T: PopoverTrigger> ModelSelector<T> {
}
impl<T: PopoverTrigger> RenderOnce for ModelSelector<T> {
fn render(self, _: &mut WindowContext) -> impl IntoElement {
fn render(self, _cx: &mut WindowContext) -> impl IntoElement {
let mut menu = PopoverMenu::new("model-switcher");
if let Some(handle) = self.handle {
menu = menu.with_handle(handle);
@ -63,10 +64,25 @@ impl<T: PopoverTrigger> RenderOnce for ModelSelector<T> {
.into_iter()
.enumerate()
{
let provider_icon = provider.icon();
let provider_name = provider.name().0.clone();
if index > 0 {
menu = menu.separator();
}
menu = menu.header(provider.name().0);
menu = menu.custom_row(move |_| {
h_flex()
.pb_1()
.gap_1p5()
.w_full()
.child(
Icon::new(provider_icon)
.color(Color::Muted)
.size(IconSize::Small),
)
.child(Label::new(provider_name.clone()))
.into_any_element()
});
let available_models = provider.provided_models(cx);
if available_models.is_empty() {
@ -109,19 +125,44 @@ impl<T: PopoverTrigger> RenderOnce for ModelSelector<T> {
let id = available_model.id();
let provider_id = available_model.provider_id();
let model_name = available_model.name().0.clone();
let _availability = available_model.availability();
let availability = available_model.availability();
let selected_model = selected_model.clone();
let selected_provider = selected_provider.clone();
move |_| {
move |cx| {
h_flex()
.w_full()
.justify_between()
.child(Label::new(model_name.clone()))
.when(
.font_buffer(cx)
.min_w(px(260.))
.child(
h_flex()
.gap_2()
.child(Label::new(model_name.clone()))
.children(match availability {
LanguageModelAvailability::Public => None,
LanguageModelAvailability::RequiresPlan(
Plan::Free,
) => None,
LanguageModelAvailability::RequiresPlan(
Plan::ZedPro,
) => Some(
Label::new("Pro")
.size(LabelSize::XSmall)
.color(Color::Muted),
),
}),
)
.child(div().when(
selected_model.as_ref() == Some(&id)
&& selected_provider.as_ref() == Some(&provider_id),
|this| this.child(Icon::new(IconName::Check)),
)
|this| {
this.child(
Icon::new(IconName::Check)
.color(Color::Accent)
.size(IconSize::Small),
)
},
))
.into_any()
}
},