Update model selector (#15665)
Release Notes: - N/A --------- Co-authored-by: Marshall Bowers <elliott.codes@gmail.com>
This commit is contained in:
parent
5e011ab029
commit
b4dcd6d394
15 changed files with 130 additions and 10 deletions
|
@ -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()
|
||||
}
|
||||
},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue