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)]