diff --git a/crates/assistant/src/assistant.rs b/crates/assistant/src/assistant.rs index 4e53f225f3..a62564c55d 100644 --- a/crates/assistant/src/assistant.rs +++ b/crates/assistant/src/assistant.rs @@ -15,7 +15,7 @@ use client::Client; use command_palette_hooks::CommandPaletteFilter; use feature_flags::FeatureFlagAppExt; use fs::Fs; -use gpui::{actions, App, Global, UpdateGlobal}; +use gpui::{actions, App, Global, ReadGlobal, UpdateGlobal}; use language_model::{ LanguageModelId, LanguageModelProviderId, LanguageModelRegistry, LanguageModelResponseMessage, }; @@ -86,6 +86,10 @@ impl Assistant { filter.show_namespace(Self::NAMESPACE); }); } + + pub fn enabled(cx: &App) -> bool { + Self::global(cx).enabled + } } pub fn init( diff --git a/crates/assistant/src/assistant_panel.rs b/crates/assistant/src/assistant_panel.rs index 6621899b7c..520d6f850a 100644 --- a/crates/assistant/src/assistant_panel.rs +++ b/crates/assistant/src/assistant_panel.rs @@ -1,4 +1,5 @@ use crate::assistant_configuration::{ConfigurationView, ConfigurationViewEvent}; +use crate::Assistant; use crate::{ terminal_inline_assistant::TerminalInlineAssistant, DeployHistory, InlineAssistant, NewChat, }; @@ -58,8 +59,7 @@ pub fn init(cx: &mut App) { cx.observe_new( |terminal_panel: &mut TerminalPanel, _, cx: &mut Context| { - let settings = AssistantSettings::get_global(cx); - terminal_panel.set_assistant_enabled(settings.enabled, cx); + terminal_panel.set_assistant_enabled(Assistant::enabled(cx), cx); }, ) .detach(); @@ -342,12 +342,12 @@ impl AssistantPanel { window: &mut Window, cx: &mut Context, ) { - let settings = AssistantSettings::get_global(cx); - if !settings.enabled { - return; + if workspace + .panel::(cx) + .is_some_and(|panel| panel.read(cx).enabled(cx)) + { + workspace.toggle_panel_focus::(window, cx); } - - workspace.toggle_panel_focus::(window, cx); } fn watch_client_status( @@ -595,12 +595,10 @@ impl AssistantPanel { window: &mut Window, cx: &mut Context, ) { - let settings = AssistantSettings::get_global(cx); - if !settings.enabled { - return; - } - - let Some(assistant_panel) = workspace.panel::(cx) else { + let Some(assistant_panel) = workspace + .panel::(cx) + .filter(|panel| panel.read(cx).enabled(cx)) + else { return; }; @@ -1298,12 +1296,8 @@ impl Panel for AssistantPanel { } fn icon(&self, _: &Window, cx: &App) -> Option { - let settings = AssistantSettings::get_global(cx); - if !settings.enabled || !settings.button { - return None; - } - - Some(IconName::ZedAssistant) + (self.enabled(cx) && AssistantSettings::get_global(cx).button) + .then_some(IconName::ZedAssistant) } fn icon_tooltip(&self, _: &Window, _: &App) -> Option<&'static str> { @@ -1317,6 +1311,10 @@ impl Panel for AssistantPanel { fn activation_priority(&self) -> u32 { 4 } + + fn enabled(&self, cx: &App) -> bool { + Assistant::enabled(cx) + } } impl EventEmitter for AssistantPanel {} diff --git a/crates/assistant/src/inline_assistant.rs b/crates/assistant/src/inline_assistant.rs index db48b4e3f2..da6fd986cd 100644 --- a/crates/assistant/src/inline_assistant.rs +++ b/crates/assistant/src/inline_assistant.rs @@ -1,5 +1,6 @@ use crate::{ - AssistantPanel, AssistantPanelEvent, CycleNextInlineAssist, CyclePreviousInlineAssist, + Assistant, AssistantPanel, AssistantPanelEvent, CycleNextInlineAssist, + CyclePreviousInlineAssist, }; use anyhow::{anyhow, Context as _, Result}; use assistant_context_editor::{humanize_token_count, RequestType}; @@ -3555,7 +3556,7 @@ impl CodeActionProvider for AssistantCodeActionProvider { _: &mut Window, cx: &mut App, ) -> Task>> { - if !AssistantSettings::get_global(cx).enabled { + if !Assistant::enabled(cx) { return Task::ready(Ok(Vec::new())); } diff --git a/crates/assistant2/src/assistant_panel.rs b/crates/assistant2/src/assistant_panel.rs index 3c08bb60b4..74b5d47cf3 100644 --- a/crates/assistant2/src/assistant_panel.rs +++ b/crates/assistant2/src/assistant_panel.rs @@ -225,12 +225,12 @@ impl AssistantPanel { window: &mut Window, cx: &mut Context, ) { - let settings = AssistantSettings::get_global(cx); - if !settings.enabled { - return; + if workspace + .panel::(cx) + .is_some_and(|panel| panel.read(cx).enabled(cx)) + { + workspace.toggle_panel_focus::(window, cx); } - - workspace.toggle_panel_focus::(window, cx); } pub(crate) fn local_timezone(&self) -> UtcOffset { @@ -637,12 +637,8 @@ impl Panel for AssistantPanel { } fn icon(&self, _window: &Window, cx: &App) -> Option { - let settings = AssistantSettings::get_global(cx); - if !settings.enabled || !settings.button { - return None; - } - - Some(IconName::ZedAssistant) + (self.enabled(cx) && AssistantSettings::get_global(cx).button) + .then_some(IconName::ZedAssistant) } fn icon_tooltip(&self, _window: &Window, _cx: &App) -> Option<&'static str> { @@ -656,6 +652,10 @@ impl Panel for AssistantPanel { fn activation_priority(&self) -> u32 { 3 } + + fn enabled(&self, cx: &App) -> bool { + AssistantSettings::get_global(cx).enabled + } } impl AssistantPanel { diff --git a/crates/collab_ui/src/chat_panel.rs b/crates/collab_ui/src/chat_panel.rs index c480fe55a6..627fa55249 100644 --- a/crates/collab_ui/src/chat_panel.rs +++ b/crates/collab_ui/src/chat_panel.rs @@ -1156,20 +1156,7 @@ impl Panel for ChatPanel { } fn icon(&self, _window: &Window, cx: &App) -> Option { - let show_icon = match ChatPanelSettings::get_global(cx).button { - ChatPanelButton::Never => false, - ChatPanelButton::Always => true, - ChatPanelButton::WhenInCall => { - let is_in_call = ActiveCall::global(cx) - .read(cx) - .room() - .map_or(false, |room| room.read(cx).contains_guests()); - - self.active || is_in_call - } - }; - - show_icon.then(|| ui::IconName::MessageBubbles) + self.enabled(cx).then(|| ui::IconName::MessageBubbles) } fn icon_tooltip(&self, _: &Window, _: &App) -> Option<&'static str> { @@ -1190,6 +1177,21 @@ impl Panel for ChatPanel { fn activation_priority(&self) -> u32 { 7 } + + fn enabled(&self, cx: &App) -> bool { + match ChatPanelSettings::get_global(cx).button { + ChatPanelButton::Never => false, + ChatPanelButton::Always => true, + ChatPanelButton::WhenInCall => { + let is_in_call = ActiveCall::global(cx) + .read(cx) + .room() + .map_or(false, |room| room.read(cx).contains_guests()); + + self.active || is_in_call + } + } + } } impl EventEmitter for ChatPanel {} diff --git a/crates/workspace/src/dock.rs b/crates/workspace/src/dock.rs index 77d47ec562..a7696777eb 100644 --- a/crates/workspace/src/dock.rs +++ b/crates/workspace/src/dock.rs @@ -1,6 +1,7 @@ use crate::persistence::model::DockData; use crate::{status_bar::StatusItemView, Workspace}; use crate::{DraggedDock, Event, ModalLayer, Pane}; +use anyhow::Context as _; use client::proto; use gpui::{ deferred, div, px, Action, AnyView, App, Axis, Context, Corner, Entity, EntityId, EventEmitter, @@ -53,6 +54,9 @@ pub trait Panel: Focusable + EventEmitter + Render + Sized { None } fn activation_priority(&self) -> u32; + fn enabled(&self, _cx: &App) -> bool { + true + } } pub trait PanelHandle: Send + Sync { @@ -75,6 +79,7 @@ pub trait PanelHandle: Send + Sync { fn panel_focus_handle(&self, cx: &App) -> FocusHandle; fn to_any(&self) -> AnyView; fn activation_priority(&self, cx: &App) -> u32; + fn enabled(&self, cx: &App) -> bool; fn move_to_next_position(&self, window: &mut Window, cx: &mut App) { let current_position = self.position(window, cx); let next_position = [ @@ -171,6 +176,10 @@ where fn activation_priority(&self, cx: &App) -> u32 { self.read(cx).activation_priority() } + + fn enabled(&self, cx: &App) -> bool { + self.read(cx).enabled(cx) + } } impl From<&dyn PanelHandle> for AnyView { @@ -351,6 +360,18 @@ impl Dock { .position(|entry| entry.panel.remote_id() == Some(panel_id)) } + pub fn first_enabled_panel_idx(&mut self, cx: &mut Context) -> anyhow::Result { + self.panel_entries + .iter() + .position(|entry| entry.panel.enabled(cx)) + .with_context(|| { + format!( + "Couldn't find any enabled panel for the {} dock.", + self.position.label() + ) + }) + } + fn active_panel_entry(&self) -> Option<&PanelEntry> { self.active_panel_index .and_then(|index| self.panel_entries.get(index)) diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 80c76efed3..b4ef0ea1f1 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -2522,8 +2522,14 @@ impl Workspace { let was_visible = dock.is_open() && !other_is_zoomed; dock.set_open(!was_visible, window, cx); - if dock.active_panel().is_none() && dock.panels_len() > 0 { - dock.activate_panel(0, window, cx); + if dock.active_panel().is_none() { + let Some(panel_ix) = dock + .first_enabled_panel_idx(cx) + .log_with_level(log::Level::Info) + else { + return; + }; + dock.activate_panel(panel_ix, window, cx); } if let Some(active_panel) = dock.active_panel() {