dock compiling with todos outstanding

KCaverly and Kirill created

Co-Authored-By: Kirill <kirill@zed.dev>

Change summary

crates/workspace2/src/dock.rs | 432 ++++++++++++++++++------------------
1 file changed, 220 insertions(+), 212 deletions(-)

Detailed changes

crates/workspace2/src/dock.rs 🔗

@@ -1,13 +1,12 @@
-use crate::{Axis, Workspace};
+use crate::{status_bar::StatusItemView, Axis, Workspace};
 use gpui2::{
-    Action, AnyElement, AnyView, AppContext, Render, Subscription, View, ViewContext, WeakView,
-    WindowContext,
+    Action, AnyView, EventEmitter, Render, Subscription, View, ViewContext, WeakView, WindowContext,
 };
 use schemars::JsonSchema;
 use serde::{Deserialize, Serialize};
 use std::sync::Arc;
 
-pub trait Panel: Render {
+pub trait Panel: Render + EventEmitter {
     fn position(&self, cx: &WindowContext) -> DockPosition;
     fn position_is_valid(&self, position: DockPosition) -> bool;
     fn set_position(&mut self, position: DockPosition, cx: &mut ViewContext<Self>);
@@ -177,226 +176,226 @@ pub struct PanelButtons {
     workspace: WeakView<Workspace>,
 }
 
-impl Dock {
-    pub fn new(position: DockPosition) -> Self {
-        Self {
-            position,
-            panel_entries: Default::default(),
-            active_panel_index: 0,
-            is_open: false,
-        }
-    }
+// impl Dock {
+//     pub fn new(position: DockPosition) -> Self {
+//         Self {
+//             position,
+//             panel_entries: Default::default(),
+//             active_panel_index: 0,
+//             is_open: false,
+//         }
+//     }
 
-    pub fn position(&self) -> DockPosition {
-        self.position
-    }
+//     pub fn position(&self) -> DockPosition {
+//         self.position
+//     }
 
-    pub fn is_open(&self) -> bool {
-        self.is_open
-    }
+//     pub fn is_open(&self) -> bool {
+//         self.is_open
+//     }
 
-    pub fn has_focus(&self, cx: &WindowContext) -> bool {
-        self.visible_panel()
-            .map_or(false, |panel| panel.has_focus(cx))
-    }
+//     pub fn has_focus(&self, cx: &WindowContext) -> bool {
+//         self.visible_panel()
+//             .map_or(false, |panel| panel.has_focus(cx))
+//     }
 
-    pub fn panel<T: Panel>(&self) -> Option<View<T>> {
-        self.panel_entries
-            .iter()
-            .find_map(|entry| entry.panel.as_any().clone().downcast())
-    }
+//     pub fn panel<T: Panel>(&self) -> Option<View<T>> {
+//         self.panel_entries
+//             .iter()
+//             .find_map(|entry| entry.panel.as_any().clone().downcast())
+//     }
 
-    pub fn panel_index_for_type<T: Panel>(&self) -> Option<usize> {
-        self.panel_entries
-            .iter()
-            .position(|entry| entry.panel.as_any().is::<T>())
-    }
+//     pub fn panel_index_for_type<T: Panel>(&self) -> Option<usize> {
+//         self.panel_entries
+//             .iter()
+//             .position(|entry| entry.panel.as_any().is::<T>())
+//     }
 
-    pub fn panel_index_for_ui_name(&self, ui_name: &str, cx: &AppContext) -> Option<usize> {
-        todo!()
-        // self.panel_entries.iter().position(|entry| {
-        //     let panel = entry.panel.as_any();
-        //     cx.view_ui_name(panel.window(), panel.id()) == Some(ui_name)
-        // })
-    }
+//     pub fn panel_index_for_ui_name(&self, ui_name: &str, cx: &AppContext) -> Option<usize> {
+//         todo!()
+//         // self.panel_entries.iter().position(|entry| {
+//         //     let panel = entry.panel.as_any();
+//         //     cx.view_ui_name(panel.window(), panel.id()) == Some(ui_name)
+//         // })
+//     }
 
-    pub fn active_panel_index(&self) -> usize {
-        self.active_panel_index
-    }
+//     pub fn active_panel_index(&self) -> usize {
+//         self.active_panel_index
+//     }
 
-    pub(crate) fn set_open(&mut self, open: bool, cx: &mut ViewContext<Self>) {
-        if open != self.is_open {
-            self.is_open = open;
-            if let Some(active_panel) = self.panel_entries.get(self.active_panel_index) {
-                active_panel.panel.set_active(open, cx);
-            }
+//     pub(crate) fn set_open(&mut self, open: bool, cx: &mut ViewContext<Self>) {
+//         if open != self.is_open {
+//             self.is_open = open;
+//             if let Some(active_panel) = self.panel_entries.get(self.active_panel_index) {
+//                 active_panel.panel.set_active(open, cx);
+//             }
 
-            cx.notify();
-        }
-    }
+//             cx.notify();
+//         }
+//     }
 
-    pub fn set_panel_zoomed(&mut self, panel: &AnyView, zoomed: bool, cx: &mut ViewContext<Self>) {
-        for entry in &mut self.panel_entries {
-            if entry.panel.as_any() == panel {
-                if zoomed != entry.panel.is_zoomed(cx) {
-                    entry.panel.set_zoomed(zoomed, cx);
-                }
-            } else if entry.panel.is_zoomed(cx) {
-                entry.panel.set_zoomed(false, cx);
-            }
-        }
+//     pub fn set_panel_zoomed(&mut self, panel: &AnyView, zoomed: bool, cx: &mut ViewContext<Self>) {
+//         for entry in &mut self.panel_entries {
+//             if entry.panel.as_any() == panel {
+//                 if zoomed != entry.panel.is_zoomed(cx) {
+//                     entry.panel.set_zoomed(zoomed, cx);
+//                 }
+//             } else if entry.panel.is_zoomed(cx) {
+//                 entry.panel.set_zoomed(false, cx);
+//             }
+//         }
 
-        cx.notify();
-    }
+//         cx.notify();
+//     }
 
-    pub fn zoom_out(&mut self, cx: &mut ViewContext<Self>) {
-        for entry in &mut self.panel_entries {
-            if entry.panel.is_zoomed(cx) {
-                entry.panel.set_zoomed(false, cx);
-            }
-        }
-    }
+//     pub fn zoom_out(&mut self, cx: &mut ViewContext<Self>) {
+//         for entry in &mut self.panel_entries {
+//             if entry.panel.is_zoomed(cx) {
+//                 entry.panel.set_zoomed(false, cx);
+//             }
+//         }
+//     }
 
-    pub(crate) fn add_panel<T: Panel>(&mut self, panel: View<T>, cx: &mut ViewContext<Self>) {
-        let subscriptions = [
-            cx.observe(&panel, |_, _, cx| cx.notify()),
-            cx.subscribe(&panel, |this, panel, event, cx| {
-                if T::should_activate_on_event(event) {
-                    if let Some(ix) = this
-                        .panel_entries
-                        .iter()
-                        .position(|entry| entry.panel.id() == panel.id())
-                    {
-                        this.set_open(true, cx);
-                        this.activate_panel(ix, cx);
-                        cx.focus(&panel);
-                    }
-                } else if T::should_close_on_event(event)
-                    && this.visible_panel().map_or(false, |p| p.id() == panel.id())
-                {
-                    this.set_open(false, cx);
-                }
-            }),
-        ];
-
-        let dock_view_id = cx.view_id();
-        self.panel_entries.push(PanelEntry {
-            panel: Arc::new(panel),
-            // todo!()
-            // context_menu: cx.add_view(|cx| {
-            //     let mut menu = ContextMenu::new(dock_view_id, cx);
-            //     menu.set_position_mode(OverlayPositionMode::Local);
-            //     menu
-            // }),
-            _subscriptions: subscriptions,
-        });
-        cx.notify()
-    }
+//     pub(crate) fn add_panel<T: Panel>(&mut self, panel: View<T>, cx: &mut ViewContext<Self>) {
+//         let subscriptions = [
+//             cx.observe(&panel, |_, _, cx| cx.notify()),
+//             cx.subscribe(&panel, |this, panel, event, cx| {
+//                 if T::should_activate_on_event(event) {
+//                     if let Some(ix) = this
+//                         .panel_entries
+//                         .iter()
+//                         .position(|entry| entry.panel.id() == panel.id())
+//                     {
+//                         this.set_open(true, cx);
+//                         this.activate_panel(ix, cx);
+//                         cx.focus(&panel);
+//                     }
+//                 } else if T::should_close_on_event(event)
+//                     && this.visible_panel().map_or(false, |p| p.id() == panel.id())
+//                 {
+//                     this.set_open(false, cx);
+//                 }
+//             }),
+//         ];
+
+//         let dock_view_id = cx.view_id();
+//         self.panel_entries.push(PanelEntry {
+//             panel: Arc::new(panel),
+//             // todo!()
+//             // context_menu: cx.add_view(|cx| {
+//             //     let mut menu = ContextMenu::new(dock_view_id, cx);
+//             //     menu.set_position_mode(OverlayPositionMode::Local);
+//             //     menu
+//             // }),
+//             _subscriptions: subscriptions,
+//         });
+//         cx.notify()
+//     }
 
-    pub fn remove_panel<T: Panel>(&mut self, panel: &View<T>, cx: &mut ViewContext<Self>) {
-        if let Some(panel_ix) = self
-            .panel_entries
-            .iter()
-            .position(|entry| entry.panel.id() == panel.id())
-        {
-            if panel_ix == self.active_panel_index {
-                self.active_panel_index = 0;
-                self.set_open(false, cx);
-            } else if panel_ix < self.active_panel_index {
-                self.active_panel_index -= 1;
-            }
-            self.panel_entries.remove(panel_ix);
-            cx.notify();
-        }
-    }
+//     pub fn remove_panel<T: Panel>(&mut self, panel: &View<T>, cx: &mut ViewContext<Self>) {
+//         if let Some(panel_ix) = self
+//             .panel_entries
+//             .iter()
+//             .position(|entry| entry.panel.id() == panel.id())
+//         {
+//             if panel_ix == self.active_panel_index {
+//                 self.active_panel_index = 0;
+//                 self.set_open(false, cx);
+//             } else if panel_ix < self.active_panel_index {
+//                 self.active_panel_index -= 1;
+//             }
+//             self.panel_entries.remove(panel_ix);
+//             cx.notify();
+//         }
+//     }
 
-    pub fn panels_len(&self) -> usize {
-        self.panel_entries.len()
-    }
+//     pub fn panels_len(&self) -> usize {
+//         self.panel_entries.len()
+//     }
 
-    pub fn activate_panel(&mut self, panel_ix: usize, cx: &mut ViewContext<Self>) {
-        if panel_ix != self.active_panel_index {
-            if let Some(active_panel) = self.panel_entries.get(self.active_panel_index) {
-                active_panel.panel.set_active(false, cx);
-            }
+//     pub fn activate_panel(&mut self, panel_ix: usize, cx: &mut ViewContext<Self>) {
+//         if panel_ix != self.active_panel_index {
+//             if let Some(active_panel) = self.panel_entries.get(self.active_panel_index) {
+//                 active_panel.panel.set_active(false, cx);
+//             }
 
-            self.active_panel_index = panel_ix;
-            if let Some(active_panel) = self.panel_entries.get(self.active_panel_index) {
-                active_panel.panel.set_active(true, cx);
-            }
+//             self.active_panel_index = panel_ix;
+//             if let Some(active_panel) = self.panel_entries.get(self.active_panel_index) {
+//                 active_panel.panel.set_active(true, cx);
+//             }
 
-            cx.notify();
-        }
-    }
+//             cx.notify();
+//         }
+//     }
 
-    pub fn visible_panel(&self) -> Option<&Arc<dyn PanelHandle>> {
-        let entry = self.visible_entry()?;
-        Some(&entry.panel)
-    }
+//     pub fn visible_panel(&self) -> Option<&Arc<dyn PanelHandle>> {
+//         let entry = self.visible_entry()?;
+//         Some(&entry.panel)
+//     }
 
-    pub fn active_panel(&self) -> Option<&Arc<dyn PanelHandle>> {
-        Some(&self.panel_entries.get(self.active_panel_index)?.panel)
-    }
+//     pub fn active_panel(&self) -> Option<&Arc<dyn PanelHandle>> {
+//         Some(&self.panel_entries.get(self.active_panel_index)?.panel)
+//     }
 
-    fn visible_entry(&self) -> Option<&PanelEntry> {
-        if self.is_open {
-            self.panel_entries.get(self.active_panel_index)
-        } else {
-            None
-        }
-    }
+//     fn visible_entry(&self) -> Option<&PanelEntry> {
+//         if self.is_open {
+//             self.panel_entries.get(self.active_panel_index)
+//         } else {
+//             None
+//         }
+//     }
 
-    pub fn zoomed_panel(&self, cx: &WindowContext) -> Option<Arc<dyn PanelHandle>> {
-        let entry = self.visible_entry()?;
-        if entry.panel.is_zoomed(cx) {
-            Some(entry.panel.clone())
-        } else {
-            None
-        }
-    }
+//     pub fn zoomed_panel(&self, cx: &WindowContext) -> Option<Arc<dyn PanelHandle>> {
+//         let entry = self.visible_entry()?;
+//         if entry.panel.is_zoomed(cx) {
+//             Some(entry.panel.clone())
+//         } else {
+//             None
+//         }
+//     }
 
-    pub fn panel_size(&self, panel: &dyn PanelHandle, cx: &WindowContext) -> Option<f32> {
-        self.panel_entries
-            .iter()
-            .find(|entry| entry.panel.id() == panel.id())
-            .map(|entry| entry.panel.size(cx))
-    }
+//     pub fn panel_size(&self, panel: &dyn PanelHandle, cx: &WindowContext) -> Option<f32> {
+//         self.panel_entries
+//             .iter()
+//             .find(|entry| entry.panel.id() == panel.id())
+//             .map(|entry| entry.panel.size(cx))
+//     }
 
-    pub fn active_panel_size(&self, cx: &WindowContext) -> Option<f32> {
-        if self.is_open {
-            self.panel_entries
-                .get(self.active_panel_index)
-                .map(|entry| entry.panel.size(cx))
-        } else {
-            None
-        }
-    }
+//     pub fn active_panel_size(&self, cx: &WindowContext) -> Option<f32> {
+//         if self.is_open {
+//             self.panel_entries
+//                 .get(self.active_panel_index)
+//                 .map(|entry| entry.panel.size(cx))
+//         } else {
+//             None
+//         }
+//     }
 
-    pub fn resize_active_panel(&mut self, size: Option<f32>, cx: &mut ViewContext<Self>) {
-        if let Some(entry) = self.panel_entries.get_mut(self.active_panel_index) {
-            entry.panel.set_size(size, cx);
-            cx.notify();
-        }
-    }
+//     pub fn resize_active_panel(&mut self, size: Option<f32>, cx: &mut ViewContext<Self>) {
+//         if let Some(entry) = self.panel_entries.get_mut(self.active_panel_index) {
+//             entry.panel.set_size(size, cx);
+//             cx.notify();
+//         }
+//     }
 
-    pub fn render_placeholder(&self, cx: &WindowContext) -> AnyElement<Workspace> {
-        todo!()
-        // if let Some(active_entry) = self.visible_entry() {
-        //     Empty::new()
-        //         .into_any()
-        //         .contained()
-        //         .with_style(self.style(cx))
-        //         .resizable::<WorkspaceBounds>(
-        //             self.position.to_resize_handle_side(),
-        //             active_entry.panel.size(cx),
-        //             |_, _, _| {},
-        //         )
-        //         .into_any()
-        // } else {
-        //     Empty::new().into_any()
-        // }
-    }
-}
+//     pub fn render_placeholder(&self, cx: &WindowContext) -> AnyElement<Workspace> {
+//         todo!()
+// if let Some(active_entry) = self.visible_entry() {
+//     Empty::new()
+//         .into_any()
+//         .contained()
+//         .with_style(self.style(cx))
+//         .resizable::<WorkspaceBounds>(
+//             self.position.to_resize_handle_side(),
+//             active_entry.panel.size(cx),
+//             |_, _, _| {},
+//         )
+//         .into_any()
+// } else {
+//     Empty::new().into_any()
+// }
+//     }
+// }
 
 // todo!()
 // impl View for Dock {
@@ -444,13 +443,17 @@ impl Dock {
 //     }
 // }
 
-// todo!()
-// impl Entity for PanelButtons {
-//     type Event = ();
-// }
+impl EventEmitter for PanelButtons {
+    type Event = ();
+}
+
+// impl Render for PanelButtons {
+//     type Element = ();
+
+//     fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
+//         todo!("")
+//     }
 
-// todo!()
-// impl View for PanelButtons {
 //     fn ui_name() -> &'static str {
 //         "PanelButtons"
 //     }
@@ -593,14 +596,15 @@ impl Dock {
 //     }
 // }
 
-impl StatusItemView for PanelButtons {
-    fn set_active_pane_item(
-        &mut self,
-        _: Option<&dyn crate::ItemHandle>,
-        _: &mut ViewContext<Self>,
-    ) {
-    }
-}
+// impl StatusItemView for PanelButtons {
+//     fn set_active_pane_item(
+//         &mut self,
+//         active_pane_item: Option<&dyn crate::ItemHandle>,
+//         cx: &mut ViewContext<Self>,
+//     ) {
+//         todo!()
+//     }
+// }
 
 #[cfg(any(test, feature = "test-support"))]
 pub mod test {
@@ -625,6 +629,10 @@ pub mod test {
         pub size: f32,
     }
 
+    impl EventEmitter for TestPanel {
+        type Event = TestPanelEvent;
+    }
+
     impl TestPanel {
         pub fn new(position: DockPosition) -> Self {
             Self {