assistant2: Persist model selector changes (#22116)

Marshall Bowers created

This PR makes the language model selector in the Assistant2 panel
persist the model changes to the settings.

Release Notes:

- N/A

Change summary

crates/assistant2/src/assistant_panel.rs | 12 ++++++++++--
crates/assistant2/src/message_editor.rs  | 16 +++++++++++++---
2 files changed, 23 insertions(+), 5 deletions(-)

Detailed changes

crates/assistant2/src/assistant_panel.rs 🔗

@@ -90,7 +90,7 @@ impl AssistantPanel {
         Self {
             active_view: ActiveView::Thread,
             workspace: workspace.clone(),
-            fs,
+            fs: fs.clone(),
             language_registry: language_registry.clone(),
             thread_store: thread_store.clone(),
             thread: cx.new_view(|cx| {
@@ -103,7 +103,13 @@ impl AssistantPanel {
                 )
             }),
             message_editor: cx.new_view(|cx| {
-                MessageEditor::new(workspace, thread_store.downgrade(), thread.clone(), cx)
+                MessageEditor::new(
+                    fs.clone(),
+                    workspace,
+                    thread_store.downgrade(),
+                    thread.clone(),
+                    cx,
+                )
             }),
             tools,
             local_timezone: UtcOffset::from_whole_seconds(
@@ -141,6 +147,7 @@ impl AssistantPanel {
         });
         self.message_editor = cx.new_view(|cx| {
             MessageEditor::new(
+                self.fs.clone(),
                 self.workspace.clone(),
                 self.thread_store.downgrade(),
                 thread,
@@ -170,6 +177,7 @@ impl AssistantPanel {
         });
         self.message_editor = cx.new_view(|cx| {
             MessageEditor::new(
+                self.fs.clone(),
                 self.workspace.clone(),
                 self.thread_store.downgrade(),
                 thread,

crates/assistant2/src/message_editor.rs 🔗

@@ -1,12 +1,16 @@
+use std::sync::Arc;
+
 use editor::{Editor, EditorElement, EditorStyle};
+use fs::Fs;
 use gpui::{AppContext, FocusableView, Model, TextStyle, View, WeakModel, WeakView};
 use language_model::{LanguageModelRegistry, LanguageModelRequestTool};
 use language_model_selector::{LanguageModelSelector, LanguageModelSelectorPopoverMenu};
-use settings::Settings;
+use settings::{update_settings_file, Settings};
 use theme::ThemeSettings;
 use ui::{prelude::*, ButtonLike, CheckboxWithLabel, ElevationIndex, KeyBinding, Tooltip};
 use workspace::Workspace;
 
+use crate::assistant_settings::AssistantSettings;
 use crate::context_store::ContextStore;
 use crate::context_strip::ContextStrip;
 use crate::thread::{RequestKind, Thread};
@@ -24,6 +28,7 @@ pub struct MessageEditor {
 
 impl MessageEditor {
     pub fn new(
+        fs: Arc<dyn Fs>,
         workspace: WeakView<Workspace>,
         thread_store: WeakModel<ThreadStore>,
         thread: Model<Thread>,
@@ -50,9 +55,14 @@ impl MessageEditor {
                 )
             }),
             language_model_selector: cx.new_view(|cx| {
+                let fs = fs.clone();
                 LanguageModelSelector::new(
-                    |model, _cx| {
-                        println!("Selected {:?}", model.name());
+                    move |model, cx| {
+                        update_settings_file::<AssistantSettings>(
+                            fs.clone(),
+                            cx,
+                            move |settings, _cx| settings.set_model(model.clone()),
+                        );
                     },
                     cx,
                 )