only when more than 1 workspace

cameron created

Change summary

crates/sidebar/src/sidebar.rs           | 10 ++++++++--
crates/workspace/src/multi_workspace.rs | 14 ++++++++++++++
crates/workspace/src/workspace.rs       |  8 ++++----
3 files changed, 26 insertions(+), 6 deletions(-)

Detailed changes

crates/sidebar/src/sidebar.rs 🔗

@@ -1676,6 +1676,10 @@ impl Sidebar {
                 let multi_workspace = multi_workspace.clone();
                 let project_group_key = project_group_key.clone();
 
+                let has_multiple_projects = multi_workspace
+                    .read_with(cx, |mw, _| mw.project_group_keys().count() >= 2)
+                    .unwrap_or(false);
+
                 let menu =
                     ContextMenu::build_persistent(window, cx, move |menu, _window, menu_cx| {
                         let mut menu = menu
@@ -1730,10 +1734,12 @@ impl Sidebar {
                             },
                         );
 
-                        let menu = if project_group_key.host().is_none() {
+                        let menu = if project_group_key.host().is_none()
+                            && has_multiple_projects
+                        {
                             menu.entry(
                                 "Open Project in New Window",
-                                None,
+                                Some(Box::new(workspace::MoveProjectToNewWindow)),
                                 {
                                     let project_group_key = project_group_key.clone();
                                     let multi_workspace = multi_workspace.clone();

crates/workspace/src/multi_workspace.rs 🔗

@@ -54,6 +54,8 @@ actions!(
         ShowFewerThreads,
         /// Creates a new thread in the current workspace.
         NewThread,
+        /// Moves the active project to a new window.
+        MoveProjectToNewWindow,
     ]
 );
 
@@ -1714,6 +1716,18 @@ impl Render for MultiWorkspace {
                             }
                         },
                     ))
+                    .when(self.project_group_keys.len() >= 2, |el| {
+                        el.on_action(cx.listener(
+                            |this: &mut Self, _: &MoveProjectToNewWindow, window, cx| {
+                                let key = this.project_group_key_for_workspace(
+                                    this.workspace(),
+                                    cx,
+                                );
+                                this.open_project_group_in_new_window(&key, window, cx)
+                                    .detach_and_log_err(cx);
+                            },
+                        ))
+                    })
                 })
                 .when(
                     self.sidebar_open() && self.multi_workspace_enabled(cx),

crates/workspace/src/workspace.rs 🔗

@@ -31,10 +31,10 @@ mod workspace_settings;
 pub use crate::notifications::NotificationFrame;
 pub use dock::Panel;
 pub use multi_workspace::{
-    CloseWorkspaceSidebar, DraggedSidebar, FocusWorkspaceSidebar, MultiWorkspace,
-    MultiWorkspaceEvent, NewThread, NextProject, NextThread, PreviousProject, PreviousThread,
-    ShowFewerThreads, ShowMoreThreads, Sidebar, SidebarEvent, SidebarHandle, SidebarRenderState,
-    SidebarSide, ToggleWorkspaceSidebar, sidebar_side_context_menu,
+    CloseWorkspaceSidebar, DraggedSidebar, FocusWorkspaceSidebar, MoveProjectToNewWindow,
+    MultiWorkspace, MultiWorkspaceEvent, NewThread, NextProject, NextThread, PreviousProject,
+    PreviousThread, ShowFewerThreads, ShowMoreThreads, Sidebar, SidebarEvent, SidebarHandle,
+    SidebarRenderState, SidebarSide, ToggleWorkspaceSidebar, sidebar_side_context_menu,
 };
 pub use path_list::{PathList, SerializedPathList};
 pub use toast_layer::{ToastAction, ToastLayer, ToastView};