Make pane divider stylable in theme

Max Brunsfeld and Nate Butler created

Co-Authored-By: Nate Butler <nate@zed.dev>

Change summary

zed/assets/themes/_base.toml    |  1 +
zed/src/theme.rs                |  2 ++
zed/src/workspace.rs            |  4 +++-
zed/src/workspace/pane_group.rs | 31 +++++++++++++------------------
4 files changed, 19 insertions(+), 19 deletions(-)

Detailed changes

zed/assets/themes/_base.toml 🔗

@@ -3,6 +3,7 @@ base = { family = "Inconsolata", size = 14 }
 
 [workspace]
 background = "$surface.0"
+pane_divider = { width = 3, color = "$border.0" }
 
 [workspace.titlebar]
 border = { width = 1, bottom = true, color = "$surface.1" }

zed/src/theme.rs 🔗

@@ -6,6 +6,7 @@ use gpui::{
     color::Color,
     elements::{ContainerStyle, LabelStyle},
     fonts::{HighlightStyle, TextStyle},
+    Border,
 };
 use serde::Deserialize;
 use std::collections::HashMap;
@@ -36,6 +37,7 @@ pub struct Workspace {
     pub titlebar: ContainerStyle,
     pub tab: Tab,
     pub active_tab: Tab,
+    pub pane_divider: Border,
     pub left_sidebar: Sidebar,
     pub right_sidebar: Sidebar,
 }

zed/src/workspace.rs 🔗

@@ -972,7 +972,9 @@ impl View for Workspace {
                                 {
                                     content.add_child(Flexible::new(0.8, element).boxed());
                                 }
-                                content.add_child(Expanded::new(1.0, self.center.render()).boxed());
+                                content.add_child(
+                                    Expanded::new(1.0, self.center.render(&settings.theme)).boxed(),
+                                );
                                 if let Some(element) =
                                     self.right_sidebar.render_active_item(&settings, cx)
                                 {

zed/src/workspace/pane_group.rs 🔗

@@ -1,5 +1,6 @@
+use crate::theme::Theme;
 use anyhow::{anyhow, Result};
-use gpui::{color::Color, elements::*, Axis, Border};
+use gpui::{elements::*, Axis};
 
 #[derive(Clone, Debug, Eq, PartialEq)]
 pub struct PaneGroup {
@@ -44,8 +45,8 @@ impl PaneGroup {
         }
     }
 
-    pub fn render<'a>(&self) -> ElementBox {
-        self.root.render()
+    pub fn render<'a>(&self, theme: &Theme) -> ElementBox {
+        self.root.render(theme)
     }
 }
 
@@ -73,10 +74,10 @@ impl Member {
         Member::Axis(PaneAxis { axis, members })
     }
 
-    pub fn render<'a>(&self) -> ElementBox {
+    pub fn render<'a>(&self, theme: &Theme) -> ElementBox {
         match self {
             Member::Pane(view_id) => ChildView::new(*view_id).boxed(),
-            Member::Axis(axis) => axis.render(),
+            Member::Axis(axis) => axis.render(theme),
         }
     }
 }
@@ -164,13 +165,17 @@ impl PaneAxis {
         }
     }
 
-    fn render<'a>(&self) -> ElementBox {
+    fn render<'a>(&self, theme: &Theme) -> ElementBox {
         let last_member_ix = self.members.len() - 1;
         Flex::new(self.axis)
             .with_children(self.members.iter().enumerate().map(|(ix, member)| {
-                let mut member = member.render();
+                let mut member = member.render(theme);
                 if ix < last_member_ix {
-                    let mut border = Border::new(border_width(), border_color());
+                    let mut border = theme.workspace.pane_divider;
+                    border.left = false;
+                    border.right = false;
+                    border.top = false;
+                    border.bottom = false;
                     match self.axis {
                         Axis::Vertical => border.bottom = true,
                         Axis::Horizontal => border.right = true,
@@ -377,13 +382,3 @@ mod tests {
     //     Ok(())
     // }
 }
-
-#[inline(always)]
-fn border_width() -> f32 {
-    2.0
-}
-
-#[inline(always)]
-fn border_color() -> Color {
-    Color::new(0xdb, 0xdb, 0xdc, 0xff)
-}