Suppress agent popup notification when status is already visible (#49044)
If you have Zed open and the sidebar open, don't show a notification when a thread finishes. Closes AI-18 (No release notes because multi-agent is still feature-flagged.) Release Notes: - N/A
This commit is contained in:
1 parent
8f9d25ec12
commit
abc65e8086
1 file changed
+29
-19
@@ -2151,30 +2151,40 @@ impl AcpServerView {
|
||||
self.show_notification(caption, icon, window, cx);
|
||||
}
|
||||
|
||||
fn agent_is_visible(&self, window: &Window, cx: &App) -> bool {
|
||||
if window.is_window_active() {
|
||||
let workspace_is_foreground = window
|
||||
.root::<MultiWorkspace>()
|
||||
.flatten()
|
||||
.and_then(|mw| {
|
||||
let mw = mw.read(cx);
|
||||
self.workspace.upgrade().map(|ws| mw.workspace() == &ws)
|
||||
})
|
||||
.unwrap_or(true);
|
||||
fn agent_panel_visible(&self, multi_workspace: &Entity<MultiWorkspace>, cx: &App) -> bool {
|
||||
let Some(workspace) = self.workspace.upgrade() else {
|
||||
return false;
|
||||
};
|
||||
|
||||
if workspace_is_foreground {
|
||||
if let Some(workspace) = self.workspace.upgrade() {
|
||||
return AgentPanel::is_visible(&workspace, cx);
|
||||
}
|
||||
}
|
||||
multi_workspace.read(cx).workspace() == &workspace && AgentPanel::is_visible(&workspace, cx)
|
||||
}
|
||||
|
||||
fn agent_status_visible(&self, window: &Window, cx: &App) -> bool {
|
||||
if !window.is_window_active() {
|
||||
return false;
|
||||
}
|
||||
|
||||
false
|
||||
if let Some(multi_workspace) = window.root::<MultiWorkspace>().flatten() {
|
||||
multi_workspace.read(cx).is_sidebar_open()
|
||||
|| self.agent_panel_visible(&multi_workspace, cx)
|
||||
} else {
|
||||
self.workspace
|
||||
.upgrade()
|
||||
.is_some_and(|workspace| AgentPanel::is_visible(&workspace, cx))
|
||||
}
|
||||
}
|
||||
|
||||
fn play_notification_sound(&self, window: &Window, cx: &mut App) {
|
||||
let settings = AgentSettings::get_global(cx);
|
||||
if settings.play_sound_when_agent_done && !self.agent_is_visible(window, cx) {
|
||||
let visible = window.is_window_active()
|
||||
&& if let Some(mw) = window.root::<MultiWorkspace>().flatten() {
|
||||
self.agent_panel_visible(&mw, cx)
|
||||
} else {
|
||||
self.workspace
|
||||
.upgrade()
|
||||
.is_some_and(|workspace| AgentPanel::is_visible(&workspace, cx))
|
||||
};
|
||||
if settings.play_sound_when_agent_done && !visible {
|
||||
Audio::play_sound(Sound::AgentDone, cx);
|
||||
}
|
||||
}
|
||||
@@ -2192,7 +2202,7 @@ impl AcpServerView {
|
||||
|
||||
let settings = AgentSettings::get_global(cx);
|
||||
|
||||
let should_notify = !self.agent_is_visible(window, cx);
|
||||
let should_notify = !self.agent_status_visible(window, cx);
|
||||
|
||||
if !should_notify {
|
||||
return;
|
||||
@@ -2296,7 +2306,7 @@ impl AcpServerView {
|
||||
let pop_up_weak = pop_up.downgrade();
|
||||
|
||||
cx.observe_window_activation(window, move |this, window, cx| {
|
||||
if this.agent_is_visible(window, cx)
|
||||
if this.agent_status_visible(window, cx)
|
||||
&& let Some(pop_up) = pop_up_weak.upgrade()
|
||||
{
|
||||
pop_up.update(cx, |notification, cx| {
|
||||
|
||||
Reference in new issue
Block a user