From 0565992d7a0bb53ad9b620196ad23ae0ed02ebab Mon Sep 17 00:00:00 2001 From: Danilo Leal <67129314+danilo-leal@users.noreply.github.com> Date: Sat, 6 Dec 2025 09:06:51 -0300 Subject: [PATCH] project picker: Improve tooltip on secondary actions (#44264) This PR adds the keybinding for the "open in project window" button on the project picker as well as makes the tooltip for the content bit on the active list item only show up for the content container. https://github.com/user-attachments/assets/42944cf7-e4e7-4bf8-8695-48df8b3a35eb Release Notes: - N/A --- crates/recent_projects/src/recent_projects.rs | 45 ++++++++++++++----- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index 280bf17a38..8c08120544 100644 --- a/crates/recent_projects/src/recent_projects.rs +++ b/crates/recent_projects/src/recent_projects.rs @@ -132,7 +132,8 @@ pub fn init(cx: &mut App) { let create_new_window = open_recent.create_new_window; with_active_or_new_workspace(cx, move |workspace, window, cx| { let Some(recent_projects) = workspace.active_modal::(cx) else { - RecentProjects::open(workspace, create_new_window, window, cx); + let focus_handle = workspace.focus_handle(cx); + RecentProjects::open(workspace, create_new_window, window, focus_handle, cx); return; }; @@ -246,11 +247,12 @@ impl RecentProjects { workspace: &mut Workspace, create_new_window: bool, window: &mut Window, + focus_handle: FocusHandle, cx: &mut Context, ) { let weak = cx.entity().downgrade(); workspace.toggle_modal(window, cx, |window, cx| { - let delegate = RecentProjectsDelegate::new(weak, create_new_window, true); + let delegate = RecentProjectsDelegate::new(weak, create_new_window, true, focus_handle); Self::new(delegate, 34., window, cx) }) @@ -289,10 +291,16 @@ pub struct RecentProjectsDelegate { // Flag to reset index when there is a new query vs not reset index when user delete an item reset_selected_match_index: bool, has_any_non_local_projects: bool, + focus_handle: FocusHandle, } impl RecentProjectsDelegate { - fn new(workspace: WeakEntity, create_new_window: bool, render_paths: bool) -> Self { + fn new( + workspace: WeakEntity, + create_new_window: bool, + render_paths: bool, + focus_handle: FocusHandle, + ) -> Self { Self { workspace, workspaces: Vec::new(), @@ -302,6 +310,7 @@ impl RecentProjectsDelegate { render_paths, reset_selected_match_index: true, has_any_non_local_projects: false, + focus_handle, } } @@ -544,12 +553,23 @@ impl PickerDelegate for RecentProjectsDelegate { paths, }; + let focus_handle = self.focus_handle.clone(); + let secondary_actions = h_flex() .gap_px() .child( IconButton::new("open_new_window", IconName::ArrowUpRight) .icon_size(IconSize::XSmall) - .tooltip(Tooltip::text("Open Project in New Window")) + .tooltip({ + move |_, cx| { + Tooltip::for_action_in( + "Open Project in New Window", + &menu::SecondaryConfirm, + &focus_handle, + cx, + ) + } + }) .on_click(cx.listener(move |this, _event, window, cx| { cx.stop_propagation(); window.prevent_default(); @@ -577,8 +597,9 @@ impl PickerDelegate for RecentProjectsDelegate { .spacing(ListItemSpacing::Sparse) .child( h_flex() - .flex_grow() + .id("projecy_info_container") .gap_3() + .flex_grow() .when(self.has_any_non_local_projects, |this| { this.child(match location { SerializedWorkspaceLocation::Local => Icon::new(IconName::Screen) @@ -600,6 +621,13 @@ impl PickerDelegate for RecentProjectsDelegate { highlighted.paths.clear(); } highlighted.render(window, cx) + }) + .tooltip(move |_, cx| { + let tooltip_highlighted_location = highlighted_match.clone(); + cx.new(|_| MatchTooltip { + highlighted_location: tooltip_highlighted_location, + }) + .into() }), ) .map(|el| { @@ -608,13 +636,6 @@ impl PickerDelegate for RecentProjectsDelegate { } else { el.end_hover_slot(secondary_actions) } - }) - .tooltip(move |_, cx| { - let tooltip_highlighted_location = highlighted_match.clone(); - cx.new(|_| MatchTooltip { - highlighted_location: tooltip_highlighted_location, - }) - .into() }), ) }