Toggle project panel when opening new workspace in a dock-agnostic way

Antonio Scandurra created

Change summary

crates/collab/src/tests.rs        |  2 
crates/workspace/src/workspace.rs | 44 ++++++++++++---------------------
crates/zed/src/zed.rs             | 20 ++++++++++++++
3 files changed, 36 insertions(+), 30 deletions(-)

Detailed changes

crates/collab/src/tests.rs 🔗

@@ -194,7 +194,7 @@ impl TestServer {
             themes: ThemeRegistry::new((), cx.font_cache()),
             fs: fs.clone(),
             build_window_options: |_, _, _| Default::default(),
-            initialize_workspace: |_, _, _| unimplemented!(),
+            initialize_workspace: |_, _, _, _| unimplemented!(),
             background_actions: || &[],
         });
 

crates/workspace/src/workspace.rs 🔗

@@ -361,7 +361,7 @@ pub struct AppState {
     pub fs: Arc<dyn fs::Fs>,
     pub build_window_options:
         fn(Option<WindowBounds>, Option<uuid::Uuid>, &dyn Platform) -> WindowOptions<'static>,
-    pub initialize_workspace: fn(&mut Workspace, &Arc<AppState>, &mut ViewContext<Workspace>),
+    pub initialize_workspace: fn(&mut Workspace, bool, &Arc<AppState>, &mut ViewContext<Workspace>),
     pub background_actions: BackgroundActions,
 }
 
@@ -383,7 +383,7 @@ impl AppState {
             fs,
             languages,
             user_store,
-            initialize_workspace: |_, _, _| {},
+            initialize_workspace: |_, _, _, _| {},
             build_window_options: |_, _, _| Default::default(),
             background_actions: || &[],
         })
@@ -733,6 +733,7 @@ impl Workspace {
             let build_workspace =
                 |cx: &mut ViewContext<Workspace>,
                  serialized_workspace: Option<SerializedWorkspace>| {
+                    let was_deserialized = serialized_workspace.is_some();
                     let mut workspace = Workspace::new(
                         serialized_workspace,
                         workspace_id,
@@ -740,7 +741,12 @@ impl Workspace {
                         app_state.clone(),
                         cx,
                     );
-                    (app_state.initialize_workspace)(&mut workspace, &app_state, cx);
+                    (app_state.initialize_workspace)(
+                        &mut workspace,
+                        was_deserialized,
+                        &app_state,
+                        cx,
+                    );
                     workspace
                 };
 
@@ -2734,7 +2740,7 @@ impl Workspace {
             user_store: project.read(cx).user_store(),
             fs: project.read(cx).fs().clone(),
             build_window_options: |_, _, _| Default::default(),
-            initialize_workspace: |_, _, _| {},
+            initialize_workspace: |_, _, _, _| {},
             background_actions: || &[],
         });
         Self::new(None, 0, project, app_state, cx)
@@ -2998,28 +3004,11 @@ pub fn open_paths(
                     .await,
             ))
         } else {
-            let contains_directory =
-                futures::future::join_all(abs_paths.iter().map(|path| app_state.fs.is_file(path)))
-                    .await
-                    .contains(&false);
-
-            cx.update(|cx| {
-                let task =
-                    Workspace::new_local(abs_paths, app_state.clone(), requesting_window_id, cx);
-
-                cx.spawn(|mut cx| async move {
-                    let (workspace, items) = task.await;
-
-                    workspace.update(&mut cx, |workspace, cx| {
-                        if contains_directory {
-                            workspace.toggle_dock(DockPosition::Left, cx);
-                        }
-                    })?;
-
-                    anyhow::Ok((workspace, items))
+            Ok(cx
+                .update(|cx| {
+                    Workspace::new_local(abs_paths, app_state.clone(), requesting_window_id, cx)
                 })
-            })
-            .await
+                .await)
         }
     })
 }
@@ -3109,9 +3098,8 @@ pub fn join_remote_project(
             let (_, workspace) = cx.add_window(
                 (app_state.build_window_options)(None, None, cx.platform().as_ref()),
                 |cx| {
-                    let mut workspace =
-                        Workspace::new(Default::default(), 0, project, app_state.clone(), cx);
-                    (app_state.initialize_workspace)(&mut workspace, &app_state, cx);
+                    let mut workspace = Workspace::new(None, 0, project, app_state.clone(), cx);
+                    (app_state.initialize_workspace)(&mut workspace, false, &app_state, cx);
                     workspace
                 },
             );

crates/zed/src/zed.rs 🔗

@@ -35,7 +35,10 @@ use terminal_view::terminal_panel::{self, TerminalPanel};
 use util::{channel::ReleaseChannel, paths, ResultExt};
 use uuid::Uuid;
 pub use workspace;
-use workspace::{create_and_open_local_file, open_new, AppState, NewFile, NewWindow, Workspace};
+use workspace::{
+    create_and_open_local_file, dock::PanelHandle, open_new, AppState, NewFile, NewWindow,
+    Workspace,
+};
 
 #[derive(Deserialize, Clone, PartialEq)]
 pub struct OpenBrowser {
@@ -279,6 +282,7 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut gpui::AppContext) {
 
 pub fn initialize_workspace(
     workspace: &mut Workspace,
+    was_deserialized: bool,
     app_state: &Arc<AppState>,
     cx: &mut ViewContext<Workspace>,
 ) {
@@ -316,7 +320,21 @@ pub fn initialize_workspace(
     workspace.set_titlebar_item(collab_titlebar_item.into_any(), cx);
 
     let project_panel = ProjectPanel::new(workspace, cx);
+    let project_panel_position = project_panel.position(cx);
     workspace.add_panel(project_panel, cx);
+    if !was_deserialized
+        && workspace
+            .project()
+            .read(cx)
+            .visible_worktrees(cx)
+            .any(|tree| {
+                tree.read(cx)
+                    .root_entry()
+                    .map_or(false, |entry| entry.is_dir())
+            })
+    {
+        workspace.toggle_dock(project_panel_position, cx);
+    }
 
     let terminal_panel = cx.add_view(|cx| TerminalPanel::new(workspace, cx));
     workspace.add_panel(terminal_panel, cx);