Add settings

Mikayla Maki created

Change summary

assets/settings/default.json                       |  2 
crates/language/src/language.rs                    | 16 +----
crates/project/src/project.rs                      |  3 
crates/project_panel/src/project_panel.rs          | 41 ++++++++++-----
crates/project_panel/src/project_panel_settings.rs |  2 
5 files changed, 36 insertions(+), 28 deletions(-)

Detailed changes

assets/settings/default.json 🔗

@@ -99,6 +99,8 @@
   "project_panel": {
     // Whether to show the git status in the project panel.
     "git_status": true,
+    // Whether to show file icons in the project panel.
+    "file_icons": true,
     // Where to dock project panel. Can be 'left' or 'right'.
     "dock": "left",
     // Default width of the project panel.

crates/language/src/language.rs 🔗

@@ -755,19 +755,13 @@ impl LanguageRegistry {
         self.get_or_load_language(|config| UniCase::new(config.name.as_ref()) == name)
     }
 
-    pub fn icon_for_suffix(
-        self: &Arc<Self>,
-        suffix: &str,
-    ) -> Option<Arc<str>> {
+    pub fn icon_for_suffix(self: &Arc<Self>, suffix: &str) -> Option<Arc<str>> {
         let state = self.state.read();
-        state.available_languages
+        state
+            .available_languages
             .iter()
-            .find(|langauge| {
-                langauge.config.path_suffixes.iter().any(|s| s == suffix)
-            })
-            .map(|language| {
-                language.config.icon_path.clone()
-            })
+            .find(|langauge| langauge.config.path_suffixes.iter().any(|s| s == suffix))
+            .map(|language| language.config.icon_path.clone())
             .flatten()
     }
 

crates/project/src/project.rs 🔗

@@ -2475,8 +2475,7 @@ impl Project {
     }
 
     pub fn icon_for_path(&self, path: &Path) -> Option<Arc<str>> {
-        self.languages
-            .icon_for_suffix(path.extension()?.to_str()?)
+        self.languages.icon_for_suffix(path.extension()?.to_str()?)
     }
 
     fn detect_language_for_buffer(

crates/project_panel/src/project_panel.rs 🔗

@@ -1168,7 +1168,10 @@ impl ProjectPanel {
             }
 
             let end_ix = range.end.min(ix + visible_worktree_entries.len());
-            let git_status_setting = settings::get::<ProjectPanelSettings>(cx).git_status;
+            let (git_status_setting, show_file_icons) = {
+                let settings = settings::get::<ProjectPanelSettings>(cx);
+                (settings.git_status, settings.file_icons)
+            };
             if let Some(worktree) = self.project.read(cx).worktree_for_id(*worktree_id, cx) {
                 let snapshot = worktree.read(cx).snapshot();
                 let root_name = OsStr::new(snapshot.root_name());
@@ -1182,14 +1185,16 @@ impl ProjectPanel {
                 for entry in visible_worktree_entries[entry_range].iter() {
                     let status = git_status_setting.then(|| entry.git_status).flatten();
 
-                    let icon = match entry.kind {
-                        EntryKind::File(_) => self
-                            .project
-                            .read(cx)
-                            .icon_for_path(&entry.path)
-                            .or_else(|| Some(TEXT_FILE_ASSET.into())),
-                        _ => None,
-                    };
+                    let icon = show_file_icons
+                        .then(|| match entry.kind {
+                            EntryKind::File(_) => self
+                                .project
+                                .read(cx)
+                                .icon_for_path(&entry.path)
+                                .or_else(|| Some(TEXT_FILE_ASSET.into())),
+                            _ => None,
+                        })
+                        .flatten();
 
                     let mut details = EntryDetails {
                         filename: entry
@@ -1283,14 +1288,20 @@ impl ProjectPanel {
                     Svg::new(icon.to_string())
                         .with_color(style.icon_color)
                         .constrained()
+                        .with_max_width(style.file_icon_size)
+                        .with_max_height(style.file_icon_size)
+                        .aligned()
+                        .constrained()
+                        .with_width(style.file_icon_size)
                 } else {
-                    Empty::new().constrained()
+                    Empty::new()
+                        .constrained()
+                        .with_max_width(style.directory_icon_size)
+                        .with_max_height(style.directory_icon_size)
+                        .aligned()
+                        .constrained()
+                        .with_width(style.directory_icon_size)
                 }
-                .with_max_width(style.file_icon_size)
-                .with_max_height(style.file_icon_size)
-                .aligned()
-                .constrained()
-                .with_width(style.file_icon_size)
             })
             .with_child(if show_editor && editor.is_some() {
                 ChildView::new(editor.as_ref().unwrap(), cx)

crates/project_panel/src/project_panel_settings.rs 🔗

@@ -13,6 +13,7 @@ pub enum ProjectPanelDockPosition {
 #[derive(Deserialize, Debug)]
 pub struct ProjectPanelSettings {
     pub git_status: bool,
+    pub file_icons: bool,
     pub dock: ProjectPanelDockPosition,
     pub default_width: f32,
 }
@@ -20,6 +21,7 @@ pub struct ProjectPanelSettings {
 #[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug)]
 pub struct ProjectPanelSettingsContent {
     pub git_status: Option<bool>,
+    pub file_icons: Option<bool>,
     pub dock: Option<ProjectPanelDockPosition>,
     pub default_width: Option<f32>,
 }