diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index 280bf17a385db09c10c2844ac7126b3aac7adafb..8c081205444fbc13fb1d94c297946261fcab7fb3 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() }), ) }