Clean up language model selector (#26134)

This PR does some cleanup for the language model selector after
https://github.com/zed-industries/zed/pull/26090.

Release Notes:

- N/A
This commit is contained in:
Marshall Bowers 2025-03-05 11:18:01 -05:00 committed by GitHub
parent 3975d8ea93
commit 728c161e8d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 48 additions and 42 deletions

View file

@ -1567,7 +1567,6 @@ impl Render for PromptEditor {
] ]
} }
}); });
let fs_clone = self.fs.clone();
h_flex() h_flex()
.key_context("PromptEditor") .key_context("PromptEditor")
@ -1590,12 +1589,15 @@ impl Render for PromptEditor {
.w(gutter_dimensions.full_width() + (gutter_dimensions.margin / 2.0)) .w(gutter_dimensions.full_width() + (gutter_dimensions.margin / 2.0))
.justify_center() .justify_center()
.gap_2() .gap_2()
.child(inline_language_model_selector(move |model, cx| { .child(inline_language_model_selector({
update_settings_file::<AssistantSettings>( let fs = self.fs.clone();
fs_clone.clone(), move |model, cx| {
cx, update_settings_file::<AssistantSettings>(
move |settings, _| settings.set_model(model.clone()), fs.clone(),
); cx,
move |settings, _| settings.set_model(model.clone()),
);
}
})) }))
.map(|el| { .map(|el| {
let CodegenStatus::Error(error) = self.codegen.read(cx).status(cx) else { let CodegenStatus::Error(error) = self.codegen.read(cx).status(cx) else {

View file

@ -624,8 +624,6 @@ impl Render for PromptEditor {
} }
}; };
let fs_clone = self.fs.clone();
h_flex() h_flex()
.bg(cx.theme().colors().editor_background) .bg(cx.theme().colors().editor_background)
.border_y_1() .border_y_1()
@ -643,12 +641,15 @@ impl Render for PromptEditor {
.w_12() .w_12()
.justify_center() .justify_center()
.gap_2() .gap_2()
.child(inline_language_model_selector(move |model, cx| { .child(inline_language_model_selector({
update_settings_file::<AssistantSettings>( let fs = self.fs.clone();
fs_clone.clone(), move |model, cx| {
cx, update_settings_file::<AssistantSettings>(
move |settings, _| settings.set_model(model.clone()), fs.clone(),
); cx,
move |settings, _| settings.set_model(model.clone()),
);
}
})) }))
.children( .children(
if let CodegenStatus::Error(error) = &self.codegen.read(cx).status { if let CodegenStatus::Error(error) = &self.codegen.read(cx).status {

View file

@ -33,17 +33,19 @@ impl AssistantModelSelector {
impl Render for AssistantModelSelector { impl Render for AssistantModelSelector {
fn render(&mut self, _: &mut Window, cx: &mut Context<Self>) -> impl IntoElement { fn render(&mut self, _: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
let fs_clone = self.fs.clone();
assistant_language_model_selector( assistant_language_model_selector(
self.focus_handle.clone(), self.focus_handle.clone(),
Some(self.menu_handle.clone()), Some(self.menu_handle.clone()),
cx, cx,
move |model, cx| { {
update_settings_file::<AssistantSettings>( let fs = self.fs.clone();
fs_clone.clone(), move |model, cx| {
cx, update_settings_file::<AssistantSettings>(
move |settings, _| settings.set_model(model.clone()), fs.clone(),
); cx,
move |settings, _| settings.set_model(model.clone()),
);
}
}, },
) )
} }

View file

@ -2818,7 +2818,6 @@ impl Render for ContextEditor {
} else { } else {
None None
}; };
let fs_clone = self.fs.clone();
let language_model_selector = self.language_model_selector.clone(); let language_model_selector = self.language_model_selector.clone();
v_flex() v_flex()
@ -2877,12 +2876,17 @@ impl Render for ContextEditor {
self.editor().focus_handle(cx), self.editor().focus_handle(cx),
Some(self.language_model_selector.clone()), Some(self.language_model_selector.clone()),
cx, cx,
move |model, cx| { {
update_settings_file::<AssistantSettings>( let fs = self.fs.clone();
fs_clone.clone(), move |model, cx| {
cx, update_settings_file::<AssistantSettings>(
move |settings, _| settings.set_model(model.clone()), fs.clone(),
); cx,
move |settings, _| {
settings.set_model(model.clone())
},
);
}
}, },
))), ))),
) )

View file

@ -484,17 +484,17 @@ impl PickerDelegate for LanguageModelPickerDelegate {
} }
pub fn inline_language_model_selector( pub fn inline_language_model_selector(
f: impl Fn(Arc<dyn LanguageModel>, &App) + 'static, on_model_changed: impl Fn(Arc<dyn LanguageModel>, &App) + 'static,
) -> AnyElement { ) -> PopoverMenu<LanguageModelSelector> {
let f = Rc::new(f); let on_model_changed = Rc::new(on_model_changed);
PopoverMenu::new("popover-button") PopoverMenu::new("popover-button")
.menu(move |window, cx| { .menu(move |window, cx| {
Some(cx.new(|cx| { Some(cx.new(|cx| {
LanguageModelSelector::new( LanguageModelSelector::new(
{ {
let f = f.clone(); let on_model_changed = on_model_changed.clone();
move |model, cx| { move |model, cx| {
f(model, cx); on_model_changed(model, cx);
} }
}, },
window, window,
@ -524,36 +524,34 @@ pub fn inline_language_model_selector(
}, },
) )
.anchor(gpui::Corner::TopRight) .anchor(gpui::Corner::TopRight)
// .when_some(menu_handle, |el, handle| el.with_handle(handle))
.offset(gpui::Point { .offset(gpui::Point {
x: px(0.0), x: px(0.0),
y: px(-2.0), y: px(-2.0),
}) })
.into_any_element()
} }
pub fn assistant_language_model_selector( pub fn assistant_language_model_selector(
keybinding_target: FocusHandle, keybinding_target: FocusHandle,
menu_handle: Option<PopoverMenuHandle<LanguageModelSelector>>, menu_handle: Option<PopoverMenuHandle<LanguageModelSelector>>,
cx: &App, cx: &App,
f: impl Fn(Arc<dyn LanguageModel>, &App) + 'static, on_model_changed: impl Fn(Arc<dyn LanguageModel>, &App) + 'static,
) -> AnyElement { ) -> PopoverMenu<LanguageModelSelector> {
let active_model = LanguageModelRegistry::read_global(cx).active_model(); let active_model = LanguageModelRegistry::read_global(cx).active_model();
let model_name = match active_model { let model_name = match active_model {
Some(model) => model.name().0, Some(model) => model.name().0,
_ => SharedString::from("No model selected"), _ => SharedString::from("No model selected"),
}; };
let f = Rc::new(f); let on_model_changed = Rc::new(on_model_changed);
PopoverMenu::new("popover-button") PopoverMenu::new("popover-button")
.menu(move |window, cx| { .menu(move |window, cx| {
Some(cx.new(|cx| { Some(cx.new(|cx| {
LanguageModelSelector::new( LanguageModelSelector::new(
{ {
let f = f.clone(); let on_model_changed = on_model_changed.clone();
move |model, cx| { move |model, cx| {
f(model, cx); on_model_changed(model, cx);
} }
}, },
window, window,
@ -594,5 +592,4 @@ pub fn assistant_language_model_selector(
x: px(0.0), x: px(0.0),
y: px(-2.0), y: px(-2.0),
}) })
.into_any_element()
} }