From 6fba17a5e1ea9481c3f4278953844c9af00a7546 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 30 Sep 2021 10:24:47 -0700 Subject: [PATCH] Add disclosure arrows to the project panel Co-Authored-By: Nathan Sobo --- zed/assets/icons/disclosure-closed.svg | 3 ++ zed/assets/icons/disclosure-open.svg | 3 ++ zed/assets/themes/_base.toml | 5 +++- zed/src/project_panel.rs | 38 ++++++++++++++++++++++++-- zed/src/theme.rs | 16 +++++++++-- 5 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 zed/assets/icons/disclosure-closed.svg create mode 100644 zed/assets/icons/disclosure-open.svg diff --git a/zed/assets/icons/disclosure-closed.svg b/zed/assets/icons/disclosure-closed.svg new file mode 100644 index 0000000000..87a898787e --- /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 0000000000..3a76a74d31 --- /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 a001cf7687..236e308543 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 e7142be0a2..82ae9f1892 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 4fed6e34a2..1153b76dce 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)]