1use assistant_settings::AssistantSettings;
2use fs::Fs;
3use gpui::FocusHandle;
4use language_model_selector::{assistant_language_model_selector, LanguageModelSelector};
5use settings::update_settings_file;
6use std::sync::Arc;
7use ui::{prelude::*, PopoverMenuHandle};
8
9pub struct AssistantModelSelector {
10 menu_handle: PopoverMenuHandle<LanguageModelSelector>,
11 focus_handle: FocusHandle,
12 fs: Arc<dyn Fs>,
13}
14
15impl AssistantModelSelector {
16 pub(crate) fn new(
17 fs: Arc<dyn Fs>,
18 focus_handle: FocusHandle,
19 _window: &mut Window,
20 _cx: &mut App,
21 ) -> Self {
22 Self {
23 fs,
24 focus_handle,
25 menu_handle: PopoverMenuHandle::default(),
26 }
27 }
28
29 pub fn toggle(&self, window: &mut Window, cx: &mut Context<Self>) {
30 self.menu_handle.toggle(window, cx);
31 }
32}
33
34impl Render for AssistantModelSelector {
35 fn render(&mut self, _: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
36 let fs_clone = self.fs.clone();
37 assistant_language_model_selector(
38 self.focus_handle.clone(),
39 Some(self.menu_handle.clone()),
40 cx,
41 move |model, cx| {
42 update_settings_file::<AssistantSettings>(
43 fs_clone.clone(),
44 cx,
45 move |settings, _| settings.set_model(model.clone()),
46 );
47 },
48 )
49 }
50}