diff --git a/crates/copilot/src/copilot.rs b/crates/copilot/src/copilot.rs index d3a47c6068..bcf3188482 100644 --- a/crates/copilot/src/copilot.rs +++ b/crates/copilot/src/copilot.rs @@ -176,13 +176,6 @@ impl Entity for Copilot { } impl Copilot { - pub fn starting_task(&self) -> Option>> { - match self.server { - CopilotServer::Starting { ref task } => Some(task.clone()), - _ => None, - } - } - pub fn global(cx: &AppContext) -> Option> { if cx.has_global::>() { Some(cx.global::>().clone()) diff --git a/crates/copilot_button/src/copilot_button.rs b/crates/copilot_button/src/copilot_button.rs index 62305553a3..589d65476f 100644 --- a/crates/copilot_button/src/copilot_button.rs +++ b/crates/copilot_button/src/copilot_button.rs @@ -228,13 +228,8 @@ impl CopilotButton { Copilot::global(cx).map(|copilot| cx.observe(&copilot, |_, _, cx| cx.notify()).detach()); - let this_handle = cx.handle().downgrade(); - cx.observe_global::(move |cx| { - if let Some(handle) = this_handle.upgrade(cx) { - handle.update(cx, |_, cx| cx.notify()) - } - }) - .detach(); + cx.observe_global::(move |_, cx| cx.notify()) + .detach(); Self { popup_menu: menu, diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 898e94d82a..5ce8c66563 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -509,7 +509,7 @@ pub struct Editor { hover_state: HoverState, gutter_hovered: bool, link_go_to_definition_state: LinkGoToDefinitionState, - pub copilot_state: CopilotState, + copilot_state: CopilotState, _subscriptions: Vec, } @@ -1255,6 +1255,7 @@ impl Editor { cx.subscribe(&buffer, Self::on_buffer_event), cx.observe(&display_map, Self::on_display_map_changed), cx.observe(&blink_manager, |_, _, cx| cx.notify()), + cx.observe_global::(Self::on_settings_changed), ], }; this.end_selection(cx); @@ -2772,8 +2773,8 @@ impl Editor { fn refresh_copilot_suggestions(&mut self, cx: &mut ViewContext) -> Option<()> { let copilot = Copilot::global(cx)?; - - if self.mode != EditorMode::Full { + if self.mode != EditorMode::Full || !copilot.read(cx).status().is_authorized() { + self.clear_copilot_suggestions(cx); return None; } @@ -2789,19 +2790,12 @@ impl Editor { let language_name = snapshot .language_at(selection.start) .map(|language| language.name()); - - let copilot_enabled = cx.global::().copilot_on(language_name.as_deref()); - - if !copilot_enabled { + if !cx.global::().copilot_on(language_name.as_deref()) { + self.clear_copilot_suggestions(cx); return None; } self.refresh_active_copilot_suggestion(cx); - - if !copilot.read(cx).status().is_authorized() { - return None; - } - let (buffer, buffer_position) = self.buffer.read(cx).text_anchor_for_position(cursor, cx)?; self.copilot_state.pending_refresh = cx.spawn_weak(|this, mut cx| async move { @@ -6444,6 +6438,10 @@ impl Editor { cx.notify(); } + fn on_settings_changed(&mut self, cx: &mut ViewContext) { + self.refresh_copilot_suggestions(cx); + } + pub fn set_searchable(&mut self, searchable: bool) { self.searchable = searchable; } diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 4f14d4e9d6..0923c6993e 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -3952,6 +3952,19 @@ impl<'a, T: View> ViewContext<'a, T> { }) } + pub fn observe_global(&mut self, mut callback: F) -> Subscription + where + G: Any, + F: 'static + FnMut(&mut T, &mut ViewContext), + { + let observer = self.weak_handle(); + self.app.observe_global::(move |cx| { + if let Some(observer) = observer.upgrade(cx) { + observer.update(cx, |observer, cx| callback(observer, cx)); + } + }) + } + pub fn observe_focus(&mut self, handle: &ViewHandle, mut callback: F) -> Subscription where F: 'static + FnMut(&mut T, ViewHandle, bool, &mut ViewContext), diff --git a/crates/welcome/src/welcome.rs b/crates/welcome/src/welcome.rs index fa057fdafd..33d93dcd87 100644 --- a/crates/welcome/src/welcome.rs +++ b/crates/welcome/src/welcome.rs @@ -191,16 +191,8 @@ impl View for WelcomePage { impl WelcomePage { pub fn new(cx: &mut ViewContext) -> Self { - let handle = cx.weak_handle(); - - let settings_subscription = cx.observe_global::(move |cx| { - if let Some(handle) = handle.upgrade(cx) { - handle.update(cx, |_, cx| cx.notify()) - } - }); - WelcomePage { - _settings_subscription: settings_subscription, + _settings_subscription: cx.observe_global::(move |_, cx| cx.notify()), } } }