diff --git a/zed/assets/icons/disclosure-closed.svg b/zed/assets/icons/disclosure-closed.svg
new file mode 100644
index 0000000000000000000000000000000000000000..87a898787e9476a410d4c32cf6fdf659e3189fa6
--- /dev/null
+++ b/zed/assets/icons/disclosure-closed.svg
@@ -0,0 +1,3 @@
+
diff --git a/zed/assets/icons/disclosure-open.svg b/zed/assets/icons/disclosure-open.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3a76a74d3116118a0e84be54a743325d2b9796bf
--- /dev/null
+++ b/zed/assets/icons/disclosure-open.svg
@@ -0,0 +1,3 @@
+
diff --git a/zed/assets/themes/_base.toml b/zed/assets/themes/_base.toml
index a001cf7687dfab6d7e99a1813fe0835859a70f36..236e308543f27cd7b0e4a5102b1840cd9cf2349e 100644
--- a/zed/assets/themes/_base.toml
+++ b/zed/assets/themes/_base.toml
@@ -165,8 +165,11 @@ padding = 0
entry_base_padding = "$panel.padding"
[project_panel.entry]
-extends = "$text.0"
+text = "$text.1"
padding = { top = 3, bottom = 3 }
+icon_color = "$text.3.color"
+icon_size = 8
+icon_spacing = 8
[project_panel.hovered_entry]
extends = "$project_panel.entry"
diff --git a/zed/src/project_panel.rs b/zed/src/project_panel.rs
index e7142be0a2f62a97b0674f058713449fe6b5a964..82ae9f1892291c85883617315cff7de11f09a9b1 100644
--- a/zed/src/project_panel.rs
+++ b/zed/src/project_panel.rs
@@ -7,7 +7,10 @@ use crate::{
};
use gpui::{
action,
- elements::{Label, MouseEventHandler, UniformList, UniformListState},
+ elements::{
+ Align, ConstrainedBox, Empty, Flex, Label, MouseEventHandler, ParentElement, Svg,
+ UniformList, UniformListState,
+ },
keymap::{
self,
menu::{SelectNext, SelectPrev},
@@ -474,7 +477,38 @@ impl ProjectPanel {
} else {
&theme.entry
};
- Label::new(details.filename, style.text.clone())
+ Flex::row()
+ .with_child(
+ ConstrainedBox::new(
+ Align::new(
+ ConstrainedBox::new(if is_dir {
+ if details.is_expanded {
+ Svg::new("icons/disclosure-open.svg")
+ .with_color(style.icon_color)
+ .boxed()
+ } else {
+ Svg::new("icons/disclosure-closed.svg")
+ .with_color(style.icon_color)
+ .boxed()
+ }
+ } else {
+ Empty::new().boxed()
+ })
+ .with_max_width(style.icon_size)
+ .with_max_height(style.icon_size)
+ .boxed(),
+ )
+ .boxed(),
+ )
+ .with_width(style.icon_size)
+ .boxed(),
+ )
+ .with_child(
+ Label::new(details.filename, style.text.clone())
+ .contained()
+ .with_margin_left(style.icon_spacing)
+ .boxed(),
+ )
.contained()
.with_style(style.container)
.with_padding_left(theme.entry_base_padding + details.depth as f32 * 20.)
diff --git a/zed/src/theme.rs b/zed/src/theme.rs
index 4fed6e34a220bc3f65712f7122f513244ba1a16e..1153b76dce054b403d2628c91028a92a298f2835 100644
--- a/zed/src/theme.rs
+++ b/zed/src/theme.rs
@@ -112,9 +112,19 @@ pub struct ProjectPanel {
#[serde(flatten)]
pub container: ContainerStyle,
pub entry_base_padding: f32,
- pub entry: ContainedText,
- pub hovered_entry: ContainedText,
- pub selected_entry: ContainedText,
+ pub entry: ProjectPanelEntry,
+ pub hovered_entry: ProjectPanelEntry,
+ pub selected_entry: ProjectPanelEntry,
+}
+
+#[derive(Deserialize)]
+pub struct ProjectPanelEntry {
+ #[serde(flatten)]
+ pub container: ContainerStyle,
+ pub text: TextStyle,
+ pub icon_color: Color,
+ pub icon_size: f32,
+ pub icon_spacing: f32,
}
#[derive(Deserialize)]