From a1284396992d1d11b62ad47c5d456026c8929b33 Mon Sep 17 00:00:00 2001 From: Petros Amoiridis Date: Tue, 28 Mar 2023 19:23:52 +0300 Subject: [PATCH] Move code into the platform Co-Authored-By: Joseph T. Lyons <19867440+JosephTLyons@users.noreply.github.com> --- crates/gpui/src/platform.rs | 1 + crates/gpui/src/platform/mac/platform.rs | 31 +++++++++++++++++++ crates/gpui/src/platform/test.rs | 4 +++ .../src/highlighted_workspace_location.rs | 17 +++++----- crates/recent_projects/src/recent_projects.rs | 1 + 5 files changed, 44 insertions(+), 10 deletions(-) diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 538b46ee7779a9f2bb3331230483fadfa20398f5..482de941628b10a0957a35cd24e6d0441d6942a0 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -68,6 +68,7 @@ pub trait Platform: Send + Sync { fn write_to_clipboard(&self, item: ClipboardItem); fn read_from_clipboard(&self) -> Option; fn open_url(&self, url: &str); + fn convert_to_shortened_path(&self, path: &Path) -> PathBuf; fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Result<()>; fn read_credentials(&self, url: &str) -> Result)>>; diff --git a/crates/gpui/src/platform/mac/platform.rs b/crates/gpui/src/platform/mac/platform.rs index ab4fd873c641391f76afc793186442aed452dbd1..d9ac7237cefe7e1cd71bbfba788f6b681421aa56 100644 --- a/crates/gpui/src/platform/mac/platform.rs +++ b/crates/gpui/src/platform/mac/platform.rs @@ -674,6 +674,18 @@ impl platform::Platform for MacPlatform { } } + fn convert_to_shortened_path(&self, path: &Path) -> PathBuf { + match path.strip_prefix(util::paths::HOME.as_path()) { + Ok(relative_path) => { + let mut shortened_path = PathBuf::new(); + shortened_path.push("~"); + shortened_path.push(relative_path); + shortened_path + } + Err(_) => path.to_path_buf(), + } + } + fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Result<()> { let url = CFString::from(url); let username = CFString::from(username); @@ -1113,4 +1125,23 @@ mod tests { platform.pasteboard = unsafe { NSPasteboard::pasteboardWithUniqueName(nil) }; platform } + + #[test] + fn test_convert_to_shortened_path() { + let platform = build_platform(); + + let full_path: PathBuf = [ + util::paths::HOME.to_string_lossy().to_string(), + "a".to_string(), + "b".to_string(), + "c".to_string(), + ] + .iter() + .collect(); + + let shortened_path_actual = platform.convert_to_shortened_path(&full_path); + let shortened_path_expected = PathBuf::from("~/a/b/c"); + + assert_eq!(shortened_path_actual, shortened_path_expected); + } } diff --git a/crates/gpui/src/platform/test.rs b/crates/gpui/src/platform/test.rs index a3532dd96e1298fedaa6ffea2214a026cc46e085..6b1cdf5e054d3f2673fa05df3218e82a943fa7b7 100644 --- a/crates/gpui/src/platform/test.rs +++ b/crates/gpui/src/platform/test.rs @@ -175,6 +175,10 @@ impl super::Platform for Platform { fn open_url(&self, _: &str) {} + fn convert_to_shortened_path(&self, _path: &Path) -> PathBuf { + PathBuf::new() + } + fn write_credentials(&self, _: &str, _: &str, _: &[u8]) -> Result<()> { Ok(()) } diff --git a/crates/recent_projects/src/highlighted_workspace_location.rs b/crates/recent_projects/src/highlighted_workspace_location.rs index b414b84f4ab2bc84887c93393c7908a413d7ada1..bee7594d336179e196bb52d7edf38c6aebc149e6 100644 --- a/crates/recent_projects/src/highlighted_workspace_location.rs +++ b/crates/recent_projects/src/highlighted_workspace_location.rs @@ -1,4 +1,4 @@ -use std::path::{Path, PathBuf}; +use std::path::Path; use fuzzy::StringMatch; use gpui::{ @@ -55,20 +55,17 @@ pub struct HighlightedWorkspaceLocation { } impl HighlightedWorkspaceLocation { - pub fn new(string_match: &StringMatch, location: &WorkspaceLocation) -> Self { + pub fn new( + string_match: &StringMatch, + location: &WorkspaceLocation, + cx: &gpui::AppContext, + ) -> Self { let mut path_start_offset = 0; let (names, paths): (Vec<_>, Vec<_>) = location .paths() .iter() .map(|path| { - let mut full_path = PathBuf::new(); - if path.starts_with(util::paths::HOME.as_path()) { - full_path.push("~"); - full_path.push(path.strip_prefix(util::paths::HOME.as_path()).unwrap()); - } else { - full_path.push(path) - } - + let full_path = cx.platform().convert_to_shortened_path(&path); let highlighted_text = Self::highlights_for_path( full_path.as_ref(), &string_match.positions, diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index e73d0b4fb51a5d4f94391fc15ed4f4ed23699ca7..81afd694d02b02dbdb57c79c8541442c2916f403 100644 --- a/crates/recent_projects/src/recent_projects.rs +++ b/crates/recent_projects/src/recent_projects.rs @@ -192,6 +192,7 @@ impl PickerDelegate for RecentProjectsView { let highlighted_location = HighlightedWorkspaceLocation::new( &string_match, &self.workspace_locations[string_match.candidate_id], + &cx, ); Flex::column()