sidebar: Fix space not working in the search editor (#52444)

We were using space as an alternative to `enter` for selecting thread
items even while the search editor was focused. The solution here was to
create a dynamic key context based on the search editor focus state.

Release Notes:

- N/A
This commit is contained in:
Danilo Leal 2026-03-25 19:23:45 -03:00 committed by GitHub
parent 8315950982
commit 0a4dfe327a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 39 additions and 6 deletions

View file

@ -698,12 +698,18 @@
"left": "menu::SelectParent", "left": "menu::SelectParent",
"right": "menu::SelectChild", "right": "menu::SelectChild",
"enter": "menu::Confirm", "enter": "menu::Confirm",
"space": "menu::Confirm",
"ctrl-f": "agents_sidebar::FocusSidebarFilter", "ctrl-f": "agents_sidebar::FocusSidebarFilter",
"ctrl-g": "agents_sidebar::ToggleArchive", "ctrl-g": "agents_sidebar::ToggleArchive",
"shift-backspace": "agent::RemoveSelectedThread", "shift-backspace": "agent::RemoveSelectedThread",
}, },
}, },
{
"context": "ThreadsSidebar && not_searching",
"use_key_equivalents": true,
"bindings": {
"space": "menu::Confirm",
},
},
{ {
"context": "Workspace && debugger_running", "context": "Workspace && debugger_running",
"bindings": { "bindings": {

View file

@ -764,12 +764,18 @@
"left": "menu::SelectParent", "left": "menu::SelectParent",
"right": "menu::SelectChild", "right": "menu::SelectChild",
"enter": "menu::Confirm", "enter": "menu::Confirm",
"space": "menu::Confirm",
"cmd-f": "agents_sidebar::FocusSidebarFilter", "cmd-f": "agents_sidebar::FocusSidebarFilter",
"cmd-g": "agents_sidebar::ToggleArchive", "cmd-g": "agents_sidebar::ToggleArchive",
"shift-backspace": "agent::RemoveSelectedThread", "shift-backspace": "agent::RemoveSelectedThread",
}, },
}, },
{
"context": "ThreadsSidebar && not_searching",
"use_key_equivalents": true,
"bindings": {
"space": "menu::Confirm",
},
},
{ {
"context": "Workspace && debugger_running", "context": "Workspace && debugger_running",
"use_key_equivalents": true, "use_key_equivalents": true,

View file

@ -700,12 +700,18 @@
"left": "menu::SelectParent", "left": "menu::SelectParent",
"right": "menu::SelectChild", "right": "menu::SelectChild",
"enter": "menu::Confirm", "enter": "menu::Confirm",
"space": "menu::Confirm",
"ctrl-f": "agents_sidebar::FocusSidebarFilter", "ctrl-f": "agents_sidebar::FocusSidebarFilter",
"ctrl-g": "agents_sidebar::ToggleArchive", "ctrl-g": "agents_sidebar::ToggleArchive",
"shift-backspace": "agent::RemoveSelectedThread", "shift-backspace": "agent::RemoveSelectedThread",
}, },
}, },
{
"context": "ThreadsSidebar && not_searching",
"use_key_equivalents": true,
"bindings": {
"space": "menu::Confirm",
},
},
{ {
"context": "ApplicationMenu", "context": "ApplicationMenu",
"use_key_equivalents": true, "use_key_equivalents": true,

View file

@ -12,8 +12,8 @@ use chrono::Utc;
use editor::Editor; use editor::Editor;
use feature_flags::{AgentV2FeatureFlag, FeatureFlagViewExt as _}; use feature_flags::{AgentV2FeatureFlag, FeatureFlagViewExt as _};
use gpui::{ use gpui::{
Action as _, AnyElement, App, Context, Entity, FocusHandle, Focusable, ListState, Pixels, Action as _, AnyElement, App, Context, Entity, FocusHandle, Focusable, KeyContext, ListState,
Render, SharedString, WeakEntity, Window, WindowHandle, list, prelude::*, px, Pixels, Render, SharedString, WeakEntity, Window, WindowHandle, list, prelude::*, px,
}; };
use menu::{ use menu::{
Cancel, Confirm, SelectChild, SelectFirst, SelectLast, SelectNext, SelectParent, SelectPrevious, Cancel, Confirm, SelectChild, SelectFirst, SelectLast, SelectNext, SelectParent, SelectPrevious,
@ -1732,6 +1732,21 @@ impl Sidebar {
self.update_entries(cx); self.update_entries(cx);
} }
fn dispatch_context(&self, window: &Window, cx: &Context<Self>) -> KeyContext {
let mut dispatch_context = KeyContext::new_with_defaults();
dispatch_context.add("ThreadsSidebar");
dispatch_context.add("menu");
let identifier = if self.filter_editor.focus_handle(cx).is_focused(window) {
"searching"
} else {
"not_searching"
};
dispatch_context.add(identifier);
dispatch_context
}
fn focus_in(&mut self, window: &mut Window, cx: &mut Context<Self>) { fn focus_in(&mut self, window: &mut Window, cx: &mut Context<Self>) {
if !self.focus_handle.is_focused(window) { if !self.focus_handle.is_focused(window) {
return; return;
@ -3067,7 +3082,7 @@ impl Render for Sidebar {
v_flex() v_flex()
.id("workspace-sidebar") .id("workspace-sidebar")
.key_context("ThreadsSidebar") .key_context(self.dispatch_context(window, cx))
.track_focus(&self.focus_handle) .track_focus(&self.focus_handle)
.on_action(cx.listener(Self::select_next)) .on_action(cx.listener(Self::select_next))
.on_action(cx.listener(Self::select_previous)) .on_action(cx.listener(Self::select_previous))