diff --git a/crates/agent/src/context_picker.rs b/crates/agent/src/context_picker.rs index 6d82ea60d8..cd7288c311 100644 --- a/crates/agent/src/context_picker.rs +++ b/crates/agent/src/context_picker.rs @@ -381,6 +381,16 @@ impl ContextPicker { cx.focus_self(window); } + pub fn select_first(&mut self, window: &mut Window, cx: &mut Context) { + match &self.mode { + ContextPickerState::Default(entity) => entity.update(cx, |entity, cx| { + entity.select_first(&Default::default(), window, cx) + }), + // Other variants already select their first entry on open automatically + _ => {} + } + } + fn recent_menu_item( &self, context_picker: Entity, diff --git a/crates/agent/src/context_strip.rs b/crates/agent/src/context_strip.rs index 54a967b9b6..f9d9ff2781 100644 --- a/crates/agent/src/context_strip.rs +++ b/crates/agent/src/context_strip.rs @@ -420,12 +420,25 @@ impl Render for ContextStrip { }) .child( PopoverMenu::new("context-picker") - .menu(move |window, cx| { - context_picker.update(cx, |this, cx| { - this.init(window, cx); - }); + .menu({ + let context_picker = context_picker.clone(); + move |window, cx| { + context_picker.update(cx, |this, cx| { + this.init(window, cx); + }); - Some(context_picker.clone()) + Some(context_picker.clone()) + } + }) + .on_open({ + let context_picker = context_picker.downgrade(); + Rc::new(move |window, cx| { + context_picker + .update(cx, |context_picker, cx| { + context_picker.select_first(window, cx); + }) + .ok(); + }) }) .trigger_with_tooltip( IconButton::new("add-context", IconName::Plus) diff --git a/crates/picker/src/picker.rs b/crates/picker/src/picker.rs index 978d6f04b5..7f2d0185fd 100644 --- a/crates/picker/src/picker.rs +++ b/crates/picker/src/picker.rs @@ -1,5 +1,9 @@ use anyhow::Result; -use editor::{Editor, scroll::Autoscroll}; +use editor::{ + Editor, + actions::{MoveDown, MoveUp}, + scroll::Autoscroll, +}; use gpui::{ AnyElement, App, ClickEvent, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Length, ListSizingBehavior, ListState, MouseButton, MouseUpEvent, Render, @@ -451,6 +455,10 @@ impl Picker { } } + pub fn editor_move_up(&mut self, _: &MoveUp, window: &mut Window, cx: &mut Context) { + self.select_previous(&Default::default(), window, cx); + } + fn select_previous( &mut self, _: &menu::SelectPrevious, @@ -466,7 +474,16 @@ impl Picker { } } - fn select_first(&mut self, _: &menu::SelectFirst, window: &mut Window, cx: &mut Context) { + pub fn editor_move_down(&mut self, _: &MoveDown, window: &mut Window, cx: &mut Context) { + self.select_next(&Default::default(), window, cx); + } + + pub fn select_first( + &mut self, + _: &menu::SelectFirst, + window: &mut Window, + cx: &mut Context, + ) { let count = self.delegate.match_count(); if count > 0 { self.set_selected_index(0, Some(Direction::Down), true, window, cx); @@ -857,6 +874,8 @@ impl Render for Picker { .when(self.is_modal, |this| this.elevation_3(cx)) .on_action(cx.listener(Self::select_next)) .on_action(cx.listener(Self::select_previous)) + .on_action(cx.listener(Self::editor_move_down)) + .on_action(cx.listener(Self::editor_move_up)) .on_action(cx.listener(Self::select_first)) .on_action(cx.listener(Self::select_last)) .on_action(cx.listener(Self::cancel)) diff --git a/crates/ui/src/components/context_menu.rs b/crates/ui/src/components/context_menu.rs index aed9507b7b..814ce06777 100644 --- a/crates/ui/src/components/context_menu.rs +++ b/crates/ui/src/components/context_menu.rs @@ -673,7 +673,7 @@ impl ContextMenu { self.selected_index = None; } - fn select_first(&mut self, _: &SelectFirst, window: &mut Window, cx: &mut Context) { + pub fn select_first(&mut self, _: &SelectFirst, window: &mut Window, cx: &mut Context) { if let Some(ix) = self.items.iter().position(|item| item.is_selectable()) { self.select_index(ix, window, cx); }