diff --git a/crates/workspace/src/persistence.rs b/crates/workspace/src/persistence.rs index 213033a90f..db59141087 100644 --- a/crates/workspace/src/persistence.rs +++ b/crates/workspace/src/persistence.rs @@ -36,6 +36,7 @@ impl Domain for Workspace { dock_visible INTEGER, // Boolean dock_anchor TEXT, // Enum: 'Bottom' / 'Right' / 'Expanded' dock_pane INTEGER, // NULL indicates that we don't have a dock pane yet + project_panel_open INTEGER, //Boolean timestamp TEXT DEFAULT CURRENT_TIMESTAMP NOT NULL, FOREIGN KEY(dock_pane) REFERENCES panes(pane_id) ) STRICT; @@ -100,19 +101,20 @@ impl WorkspaceDb { // Note that we re-assign the workspace_id here in case it's empty // and we've grabbed the most recent workspace - let (workspace_id, workspace_location, dock_position): ( + let (workspace_id, workspace_location, project_panel_open, dock_position): ( WorkspaceId, WorkspaceLocation, + bool, DockPosition, ) = iife!({ if worktree_roots.len() == 0 { self.select_row(sql!( - SELECT workspace_id, workspace_location, dock_visible, dock_anchor + SELECT workspace_id, workspace_location, project_panel_open, dock_visible, dock_anchor FROM workspaces ORDER BY timestamp DESC LIMIT 1))?()? } else { self.select_row_bound(sql!( - SELECT workspace_id, workspace_location, dock_visible, dock_anchor + SELECT workspace_id, workspace_location, project_panel_open, dock_visible, dock_anchor FROM workspaces WHERE workspace_location = ?))?(&workspace_location)? } @@ -133,6 +135,7 @@ impl WorkspaceDb { .context("Getting center group") .log_err()?, dock_position, + project_panel_open }) } @@ -158,18 +161,20 @@ impl WorkspaceDb { INSERT INTO workspaces( workspace_id, workspace_location, + project_panel_open, dock_visible, dock_anchor, timestamp ) - VALUES (?1, ?2, ?3, ?4, CURRENT_TIMESTAMP) + VALUES (?1, ?2, ?3, ?4, ?5, CURRENT_TIMESTAMP) ON CONFLICT DO UPDATE SET workspace_location = ?2, - dock_visible = ?3, - dock_anchor = ?4, + project_panel_open = ?3, + dock_visible = ?4, + dock_anchor = ?5, timestamp = CURRENT_TIMESTAMP - ))?((workspace.id, &workspace.location, workspace.dock_position)) + ))?((workspace.id, &workspace.location, workspace.project_panel_open, workspace.dock_position)) .context("Updating workspace")?; // Save center pane group and dock pane @@ -273,6 +278,7 @@ impl WorkspaceDb { .collect::>() } + fn save_pane_group( conn: &Connection, workspace_id: WorkspaceId, @@ -462,6 +468,7 @@ mod tests { dock_position: crate::dock::DockPosition::Shown(DockAnchor::Bottom), center_group: Default::default(), dock_pane: Default::default(), + project_panel_open: true }; let mut workspace_2 = SerializedWorkspace { @@ -470,6 +477,7 @@ mod tests { dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Expanded), center_group: Default::default(), dock_pane: Default::default(), + project_panel_open: false }; db.save_workspace(workspace_1.clone()).await; @@ -575,6 +583,7 @@ mod tests { dock_position: DockPosition::Shown(DockAnchor::Bottom), center_group, dock_pane, + project_panel_open: true }; db.save_workspace(workspace.clone()).await; @@ -602,6 +611,7 @@ mod tests { dock_position: crate::dock::DockPosition::Shown(DockAnchor::Bottom), center_group: Default::default(), dock_pane: Default::default(), + project_panel_open: true, }; let mut workspace_2 = SerializedWorkspace { @@ -610,6 +620,7 @@ mod tests { dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Expanded), center_group: Default::default(), dock_pane: Default::default(), + project_panel_open: false, }; db.save_workspace(workspace_1.clone()).await; @@ -645,6 +656,7 @@ mod tests { dock_position: DockPosition::Shown(DockAnchor::Right), center_group: Default::default(), dock_pane: Default::default(), + project_panel_open: false }; db.save_workspace(workspace_3.clone()).await; @@ -679,6 +691,7 @@ mod tests { dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Right), center_group: center_group.clone(), dock_pane, + project_panel_open: true } } diff --git a/crates/workspace/src/persistence/model.rs b/crates/workspace/src/persistence/model.rs index c6943ab622..c57c992d7b 100644 --- a/crates/workspace/src/persistence/model.rs +++ b/crates/workspace/src/persistence/model.rs @@ -65,6 +65,7 @@ pub struct SerializedWorkspace { pub dock_position: DockPosition, pub center_group: SerializedPaneGroup, pub dock_pane: SerializedPane, + pub project_panel_open: bool, } #[derive(Debug, PartialEq, Eq, Clone)] diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 82d95389d8..66ef63f27f 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -2340,6 +2340,7 @@ impl Workspace { dock_position: self.dock.position(), dock_pane, center_group, + project_panel_open: self.left_sidebar.read(cx).is_open(), }; cx.background() @@ -2383,6 +2384,12 @@ impl Workspace { // Swap workspace center group workspace.center = PaneGroup::with_root(root); + // Note, if this is moved after 'set_dock_position' + // it causes an infinite loop. + if serialized_workspace.project_panel_open { + workspace.toggle_sidebar_item_focus(SidebarSide::Left, 0, cx) + } + Dock::set_dock_position(workspace, serialized_workspace.dock_position, cx); if let Some(active_pane) = active_pane {