Prevent toggle_dock from opening assistant panel when it is disabled via settings (#27215)

Part of #27171

Follows-up the change in
https://github.com/zed-industries/zed/pull/22346 to consider the case
where the assistant-panel is disabled via settings (as also noted in
[this
comment](https://github.com/zed-industries/zed/pull/22346#issuecomment-2558372412),
Notably, only the explicit case is considered here. Can extend this
change to also cover the implicit case where the button is disabled if
requested.).

Currently, if the user toggles the right dock, the assistant panel will
be shown even if it is disabled via settings, because it has the highest
priority (see
https://github.com/zed-industries/zed/pull/22346#issuecomment-2564890493).
With this change, the assistant panel is no longer activated when
disabled and the dock with the next highest activation order is
activated instead.

I did not opt in to make the priority configurabe, as I agree with
https://github.com/zed-industries/zed/pull/22346#issuecomment-2564890493
that this will most likely rarely be used (the active panel is only none
on the first toggle of the dock, afterwards it remains set for the
remainder of the session).

Release Notes:

- `workspace::ToggleRightDock` will no longer open the assistant panel
when it is disabled via settings.
This commit is contained in:
Finn Evers 2025-03-27 20:19:37 +01:00 committed by GitHub
parent a360365410
commit ca9fb2399e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 81 additions and 49 deletions

View file

@ -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<PanelEvent> + 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<Self>) -> anyhow::Result<usize> {
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))

View file

@ -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() {