diff --git a/crates/recent_projects/src/remote_servers.rs b/crates/recent_projects/src/remote_servers.rs index 7581267228..fdf40ecae3 100644 --- a/crates/recent_projects/src/remote_servers.rs +++ b/crates/recent_projects/src/remote_servers.rs @@ -1,3 +1,4 @@ +use std::collections::BTreeSet; use std::path::PathBuf; use std::sync::Arc; @@ -173,7 +174,7 @@ impl ProjectPicker { .as_mut() .and_then(|connections| connections.get_mut(ix)) { - server.projects.push(SshProject { paths }) + server.projects.insert(SshProject { paths }); } } }); @@ -784,7 +785,8 @@ impl RemoteServerProjects { .end_hover_slot::(Some( div() .mr_2() - .child( + .child({ + let project = project.clone(); // Right-margin to offset it from the Scrollbar IconButton::new("remove-remote-project", IconName::TrashAlt) .icon_size(IconSize::Small) @@ -792,9 +794,9 @@ impl RemoteServerProjects { .size(ButtonSize::Large) .tooltip(|cx| Tooltip::text("Delete Remote Project", cx)) .on_click(cx.listener(move |this, _, cx| { - this.delete_ssh_project(server_ix, ix, cx) - })), - ) + this.delete_ssh_project(server_ix, &project, cx) + })) + }) .into_any_element(), )), ) @@ -823,14 +825,20 @@ impl RemoteServerProjects { }); } - fn delete_ssh_project(&mut self, server: usize, project: usize, cx: &mut ViewContext) { + fn delete_ssh_project( + &mut self, + server: usize, + project: &SshProject, + cx: &mut ViewContext, + ) { + let project = project.clone(); self.update_settings_file(cx, move |setting, _| { if let Some(server) = setting .ssh_connections .as_mut() .and_then(|connections| connections.get_mut(server)) { - server.projects.remove(project); + server.projects.remove(&project); } }); } @@ -848,7 +856,7 @@ impl RemoteServerProjects { host: SharedString::from(connection_options.host), username: connection_options.username, port: connection_options.port, - projects: vec![], + projects: BTreeSet::::new(), nickname: None, args: connection_options.args.unwrap_or_default(), upload_binary_over_ssh: None, diff --git a/crates/recent_projects/src/ssh_connections.rs b/crates/recent_projects/src/ssh_connections.rs index 3b268d8398..b094313eee 100644 --- a/crates/recent_projects/src/ssh_connections.rs +++ b/crates/recent_projects/src/ssh_connections.rs @@ -1,3 +1,4 @@ +use std::collections::BTreeSet; use std::{path::PathBuf, sync::Arc, time::Duration}; use anyhow::{anyhow, Result}; @@ -75,7 +76,7 @@ pub struct SshConnection { #[serde(default)] pub args: Vec, #[serde(default)] - pub projects: Vec, + pub projects: BTreeSet, /// Name to use for this server in UI. #[serde(skip_serializing_if = "Option::is_none")] pub nickname: Option, @@ -101,7 +102,7 @@ impl From for SshConnectionOptions { } } -#[derive(Clone, Default, Serialize, PartialEq, Deserialize, JsonSchema)] +#[derive(Clone, Default, Serialize, PartialEq, Eq, PartialOrd, Ord, Deserialize, JsonSchema)] pub struct SshProject { pub paths: Vec, }