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        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}