diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 1807275cbcd4d465ea417ff392bc0b46772cd7de..a5fbfed689ff5190ca72e86642cc36034e33671f 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -2257,24 +2257,45 @@ impl ProjectPanel { cx: &mut Context, ) { if let Some((worktree, entry)) = self.selected_sub_entry(cx) { - if entry.is_dir() { - let include_root = self.project.read(cx).visible_worktrees(cx).count() > 1; - let dir_path = if include_root { - let mut full_path = PathBuf::from(worktree.read(cx).root_name()); - full_path.push(&entry.path); - Arc::from(full_path) - } else { - entry.path.clone() - }; + let dir_path = if entry.is_dir() { + entry.path.clone() + } else { + // entry is a file, use its parent directory + match entry.path.parent() { + Some(parent) => Arc::from(parent), + None => { + // File at root, open search with empty filter + self.workspace + .update(cx, |workspace, cx| { + search::ProjectSearchView::new_search_in_directory( + workspace, + Path::new(""), + window, + cx, + ); + }) + .ok(); + return; + } + } + }; - self.workspace - .update(cx, |workspace, cx| { - search::ProjectSearchView::new_search_in_directory( - workspace, &dir_path, window, cx, - ); - }) - .ok(); - } + let include_root = self.project.read(cx).visible_worktrees(cx).count() > 1; + let dir_path = if include_root { + let mut full_path = PathBuf::from(worktree.read(cx).root_name()); + full_path.push(&dir_path); + Arc::from(full_path) + } else { + dir_path + }; + + self.workspace + .update(cx, |workspace, cx| { + search::ProjectSearchView::new_search_in_directory( + workspace, &dir_path, window, cx, + ); + }) + .ok(); } }