From 924ec961ffa1a41b7f7e86829b501e0a64f32d4f Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 19 May 2023 15:27:18 +0200 Subject: [PATCH] Toggle project panel when opening new workspace in a dock-agnostic way --- 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(-) diff --git a/crates/collab/src/tests.rs b/crates/collab/src/tests.rs index aeb26231d4..cbc4b3bd45 100644 --- a/crates/collab/src/tests.rs +++ b/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: || &[], }); diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 01ed898de4..b26acf9b4d 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -361,7 +361,7 @@ pub struct AppState { pub fs: Arc, pub build_window_options: fn(Option, Option, &dyn Platform) -> WindowOptions<'static>, - pub initialize_workspace: fn(&mut Workspace, &Arc, &mut ViewContext), + pub initialize_workspace: fn(&mut Workspace, bool, &Arc, &mut ViewContext), 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, serialized_workspace: Option| { + 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 }, ); diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index fb7da693fc..35a430f63f 100644 --- a/crates/zed/src/zed.rs +++ b/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, cx: &mut gpui::AppContext) { pub fn initialize_workspace( workspace: &mut Workspace, + was_deserialized: bool, app_state: &Arc, cx: &mut ViewContext, ) { @@ -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);