Use task icons for all kinds of tasks (#10333)

Kirill Bulatov created

<img width="565" alt="image"
src="https://github.com/zed-industries/zed/assets/2690773/cbb59154-1153-459a-978c-8c125e879d27">
<img width="562" alt="image"
src="https://github.com/zed-industries/zed/assets/2690773/d3f65a09-2f75-4db8-85c2-1abb591e609c">


Release Notes:

- Added more icons to task modal

Change summary

crates/tasks_ui/src/modal.rs     | 40 ++++++++++++++++-----------------
crates/ui/src/components/icon.rs |  2 +
2 files changed, 21 insertions(+), 21 deletions(-)

Detailed changes

crates/tasks_ui/src/modal.rs 🔗

@@ -284,29 +284,27 @@ impl PickerDelegate for TasksModalDelegate {
         let candidates = self.candidates.as_ref()?;
         let hit = &self.matches[ix];
         let (source_kind, _) = &candidates[hit.candidate_id];
-        let language_name = if let TaskSourceKind::Language { name } = source_kind {
-            Some(name)
-        } else {
-            None
-        };
 
         let highlighted_location = HighlightedText {
             text: hit.string.clone(),
             highlight_positions: hit.positions.clone(),
             char_count: hit.string.chars().count(),
         };
-        let language_icon = language_name
-            .and_then(|language| {
-                let language = language.to_lowercase();
-                file_icons::FileIcons::get(cx).get_type_icon(&language)
-            })
-            .map(|icon_path| Icon::from_path(icon_path));
+        let base_item = ListItem::new(SharedString::from(format!("tasks-modal-{ix}")))
+            .inset(true)
+            .spacing(ListItemSpacing::Sparse);
+        let icon = match source_kind {
+            TaskSourceKind::UserInput => Some(Icon::new(IconName::Terminal)),
+            TaskSourceKind::AbsPath { .. } => Some(Icon::new(IconName::Settings)),
+            TaskSourceKind::Worktree { .. } => Some(Icon::new(IconName::FileTree)),
+            TaskSourceKind::Language { name } => file_icons::FileIcons::get(cx)
+                .get_type_icon(&name.to_lowercase())
+                .map(|icon_path| Icon::from_path(icon_path)),
+        };
         Some(
-            ListItem::new(SharedString::from(format!("tasks-modal-{ix}")))
-                .inset(true)
-                .spacing(ListItemSpacing::Sparse)
-                .map(|this| {
-                    let this = if matches!(source_kind, TaskSourceKind::UserInput) {
+            base_item
+                .map(|item| {
+                    let item = if matches!(source_kind, TaskSourceKind::UserInput) {
                         let task_index = hit.candidate_id;
                         let delete_button = div().child(
                             IconButton::new("delete", IconName::Close)
@@ -323,14 +321,14 @@ impl PickerDelegate for TasksModalDelegate {
                                 }))
                                 .tooltip(|cx| Tooltip::text("Delete an one-shot task", cx)),
                         );
-                        this.end_hover_slot(delete_button)
+                        item.end_hover_slot(delete_button)
                     } else {
-                        this
+                        item
                     };
-                    if let Some(icon) = language_icon {
-                        this.end_slot(icon)
+                    if let Some(icon) = icon {
+                        item.end_slot(icon)
                     } else {
-                        this
+                        item
                     }
                 })
                 .selected(selected)

crates/ui/src/components/icon.rs 🔗

@@ -104,6 +104,7 @@ pub enum IconName {
     Return,
     ReplyArrowRight,
     ReplyArrowLeft,
+    Settings,
     Screen,
     SelectAll,
     Shift,
@@ -200,6 +201,7 @@ impl IconName {
             IconName::Return => "icons/return.svg",
             IconName::ReplyArrowRight => "icons/reply_arrow_right.svg",
             IconName::ReplyArrowLeft => "icons/reply_arrow_left.svg",
+            IconName::Settings => "icons/file_icons/settings.svg",
             IconName::Screen => "icons/desktop.svg",
             IconName::SelectAll => "icons/select_all.svg",
             IconName::Shift => "icons/shift.svg",