Added side bar restoration

Mikayla Maki created

Change summary

crates/workspace/src/persistence.rs       | 27 ++++++++++++++++++------
crates/workspace/src/persistence/model.rs |  1 
crates/workspace/src/workspace.rs         |  7 ++++++
3 files changed, 28 insertions(+), 7 deletions(-)

Detailed changes

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::<Result<_>>()
     }
 
+   
     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
         }
     }
 

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)]

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 {