Respect workspace order in recent projects (#12844)

<img width="1266" alt="Screenshot 2024-06-10 at 14 33 32"
src="https://github.com/zed-industries/zed/assets/1347854/c75de033-f2c8-4500-8b34-46b5f0260d3d">

This changes the recent projects panel to use the order of paths from
the workspace rather than always being alphanumerical.

This follows the work to introduce manual workspace ordering to ensure
the recent projects paths reflect the order of paths in the main project
panel.

Release Notes:

- Improve the recent project panel by ordering paths using the workspace
order
This commit is contained in:
Elliot Thomas 2024-06-20 11:16:23 +01:00 committed by GitHub
parent d8c93e1bfd
commit f5f73efa8a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 17 additions and 10 deletions

View file

@ -224,9 +224,10 @@ impl PickerDelegate for RecentProjectsDelegate {
.filter(|(_, (id, _))| !self.is_current_workspace(*id, cx)) .filter(|(_, (id, _))| !self.is_current_workspace(*id, cx))
.map(|(id, (_, location))| { .map(|(id, (_, location))| {
let combined_string = match location { let combined_string = match location {
SerializedWorkspaceLocation::Local(paths, _) => paths SerializedWorkspaceLocation::Local(paths, order) => order
.paths() .order()
.iter() .iter()
.filter_map(|i| paths.paths().get(*i))
.map(|path| path.compact().to_string_lossy().into_owned()) .map(|path| path.compact().to_string_lossy().into_owned())
.collect::<Vec<_>>() .collect::<Vec<_>>()
.join(""), .join(""),
@ -285,7 +286,7 @@ impl PickerDelegate for RecentProjectsDelegate {
} else { } else {
match candidate_workspace_location { match candidate_workspace_location {
SerializedWorkspaceLocation::Local(paths, _) => { SerializedWorkspaceLocation::Local(paths, _) => {
let paths = paths.paths().as_ref().clone(); let paths = paths.paths().to_vec();
if replace_current_window { if replace_current_window {
cx.spawn(move |workspace, mut cx| async move { cx.spawn(move |workspace, mut cx| async move {
let continue_replacing = workspace let continue_replacing = workspace
@ -389,7 +390,13 @@ impl PickerDelegate for RecentProjectsDelegate {
let mut path_start_offset = 0; let mut path_start_offset = 0;
let paths = match location { let paths = match location {
SerializedWorkspaceLocation::Local(paths, _) => paths.paths(), SerializedWorkspaceLocation::Local(paths, order) => Arc::new(
order
.order()
.iter()
.filter_map(|i| paths.paths().get(*i).cloned())
.collect(),
),
SerializedWorkspaceLocation::DevServer(dev_server_project) => { SerializedWorkspaceLocation::DevServer(dev_server_project) => {
Arc::new(vec![PathBuf::from(format!( Arc::new(vec![PathBuf::from(format!(
"{}:{}", "{}:{}",

View file

@ -667,8 +667,8 @@ impl WorkspaceDb {
} }
query! { query! {
fn recent_workspaces() -> Result<Vec<(WorkspaceId, LocalPaths, Option<u64>)>> { fn recent_workspaces() -> Result<Vec<(WorkspaceId, LocalPaths, LocalPathsOrder, Option<u64>)>> {
SELECT workspace_id, local_paths, dev_server_project_id SELECT workspace_id, local_paths, local_paths_order, dev_server_project_id
FROM workspaces FROM workspaces
WHERE local_paths IS NOT NULL OR dev_server_project_id IS NOT NULL WHERE local_paths IS NOT NULL OR dev_server_project_id IS NOT NULL
ORDER BY timestamp DESC ORDER BY timestamp DESC
@ -732,7 +732,7 @@ impl WorkspaceDb {
let mut delete_tasks = Vec::new(); let mut delete_tasks = Vec::new();
let dev_server_projects = self.dev_server_projects()?; let dev_server_projects = self.dev_server_projects()?;
for (id, location, dev_server_project_id) in self.recent_workspaces()? { for (id, location, order, dev_server_project_id) in self.recent_workspaces()? {
if let Some(dev_server_project_id) = dev_server_project_id.map(DevServerProjectId) { if let Some(dev_server_project_id) = dev_server_project_id.map(DevServerProjectId) {
if let Some(dev_server_project) = dev_server_projects if let Some(dev_server_project) = dev_server_projects
.iter() .iter()
@ -748,7 +748,7 @@ impl WorkspaceDb {
if location.paths().iter().all(|path| path.exists()) if location.paths().iter().all(|path| path.exists())
&& location.paths().iter().any(|path| path.is_dir()) && location.paths().iter().any(|path| path.is_dir())
{ {
result.push((id, location.into())); result.push((id, SerializedWorkspaceLocation::Local(location, order)));
} else { } else {
delete_tasks.push(self.delete_workspace_by_id(id)); delete_tasks.push(self.delete_workspace_by_id(id));
} }

View file

@ -39,8 +39,8 @@ impl LocalPaths {
Self(Arc::new(paths)) Self(Arc::new(paths))
} }
pub fn paths(&self) -> Arc<Vec<PathBuf>> { pub fn paths(&self) -> &Arc<Vec<PathBuf>> {
self.0.clone() &self.0
} }
} }