assistant_model_selector.rs

 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        assistant_language_model_selector(
37            self.focus_handle.clone(),
38            Some(self.menu_handle.clone()),
39            cx,
40            {
41                let fs = self.fs.clone();
42                move |model, cx| {
43                    update_settings_file::<AssistantSettings>(
44                        fs.clone(),
45                        cx,
46                        move |settings, _| settings.set_model(model.clone()),
47                    );
48                }
49            },
50        )
51    }
52}