Get left, right, and bottom docks rendering in the right places in the workspace

Max Brunsfeld , Julia , and Marshall created

Co-authored-by: Julia <julia@zed.dev>
Co-authored-by: Marshall <marshall@zed.dev>

Change summary

crates/gpui2/src/color.rs                  | 18 +++++++
crates/project_panel2/src/project_panel.rs |  6 +
crates/workspace2/src/dock.rs              |  8 ++
crates/workspace2/src/workspace2.rs        | 61 +++++++++--------------
4 files changed, 51 insertions(+), 42 deletions(-)

Detailed changes

crates/gpui2/src/color.rs 🔗

@@ -238,6 +238,24 @@ pub fn blue() -> Hsla {
     }
 }
 
+pub fn green() -> Hsla {
+    Hsla {
+        h: 0.33,
+        s: 1.,
+        l: 0.5,
+        a: 1.,
+    }
+}
+
+pub fn yellow() -> Hsla {
+    Hsla {
+        h: 0.16,
+        s: 1.,
+        l: 0.5,
+        a: 1.,
+    }
+}
+
 impl Hsla {
     /// Returns true if the HSLA color is fully transparent, false otherwise.
     pub fn is_transparent(&self) -> bool {

crates/project_panel2/src/project_panel.rs 🔗

@@ -31,7 +31,7 @@ use std::{
     sync::Arc,
 };
 use theme::ActiveTheme as _;
-use ui::{h_stack, v_stack};
+use ui::{h_stack, v_stack, Label};
 use unicase::UniCase;
 use util::TryFutureExt;
 use workspace::{
@@ -1382,7 +1382,7 @@ impl ProjectPanel {
                 if let (Some(editor), true) = (editor, show_editor) {
                     div().child(editor.clone())
                 } else {
-                    div().child(details.filename.clone())
+                    div().child(Label::new(details.filename.clone()))
                 }
                 .ml_1(),
             )
@@ -1449,6 +1449,7 @@ impl Render for ProjectPanel {
 
         if has_worktree {
             div()
+                .size_full()
                 .id("project-panel")
                 .track_focus(&self.focus_handle)
                 .child(
@@ -1472,6 +1473,7 @@ impl Render for ProjectPanel {
                             items
                         },
                     )
+                    .size_full()
                     .track_scroll(self.list.clone()),
                 )
         } else {

crates/workspace2/src/dock.rs 🔗

@@ -1,7 +1,7 @@
 use crate::{status_bar::StatusItemView, Axis, Workspace};
 use gpui::{
     div, Action, AnyView, AppContext, Div, Entity, EntityId, EventEmitter, FocusHandle,
-    ParentElement, Render, Subscription, View, ViewContext, WeakView, WindowContext,
+    ParentElement, Render, Styled, Subscription, View, ViewContext, WeakView, WindowContext,
 };
 use schemars::JsonSchema;
 use serde::{Deserialize, Serialize};
@@ -428,7 +428,11 @@ impl Render for Dock {
     type Element = Div<Self>;
 
     fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
-        todo!()
+        if let Some(entry) = self.visible_entry() {
+            div().size_full().child(entry.panel.to_any())
+        } else {
+            div()
+        }
     }
 }
 

crates/workspace2/src/workspace2.rs 🔗

@@ -3642,45 +3642,30 @@ impl Render for Workspace {
                     .border_t()
                     .border_b()
                     .border_color(cx.theme().colors().border)
-                    // .children(
-                    //     Some(
-                    //         Panel::new("project-panel-outer", cx)
-                    //             .side(PanelSide::Left)
-                    //             .child(ProjectPanel::new("project-panel-inner")),
-                    //     )
-                    //     .filter(|_| self.is_project_panel_open()),
-                    // )
-                    // .children(
-                    //     Some(
-                    //         Panel::new("collab-panel-outer", cx)
-                    //             .child(CollabPanel::new("collab-panel-inner"))
-                    //             .side(PanelSide::Left),
-                    //     )
-                    //     .filter(|_| self.is_collab_panel_open()),
-                    // )
-                    // .child(NotificationToast::new(
-                    //     "maxbrunsfeld has requested to add you as a contact.".into(),
-                    // ))
                     .child(
-                        div().flex().flex_col().flex_1().h_full().child(
-                            div().flex().flex_1().child(self.center.render(
-                                &self.project,
-                                &self.follower_states,
-                                self.active_call(),
-                                &self.active_pane,
-                                self.zoomed.as_ref(),
-                                &self.app_state,
-                                cx,
-                            )),
-                        ), // .children(
-                           //     Some(
-                           //         Panel::new("terminal-panel", cx)
-                           //             .child(Terminal::new())
-                           //             .allowed_sides(PanelAllowedSides::BottomOnly)
-                           //             .side(PanelSide::Bottom),
-                           //     )
-                           //     .filter(|_| self.is_terminal_open()),
-                           // ),
+                        div()
+                            .flex()
+                            .flex_row()
+                            .flex_1()
+                            .h_full()
+                            .child(div().flex().flex_1().child(self.left_dock.clone()))
+                            .child(
+                                div()
+                                    .flex()
+                                    .flex_col()
+                                    .flex_1()
+                                    .child(self.center.render(
+                                        &self.project,
+                                        &self.follower_states,
+                                        self.active_call(),
+                                        &self.active_pane,
+                                        self.zoomed.as_ref(),
+                                        &self.app_state,
+                                        cx,
+                                    ))
+                                    .child(div().flex().flex_1().child(self.bottom_dock.clone())),
+                            )
+                            .child(div().flex().flex_1().child(self.right_dock.clone())),
                     ), // .children(
                        //     Some(
                        //         Panel::new("chat-panel-outer", cx)