Added side bar restoration

This commit is contained in:
Mikayla Maki 2022-12-01 12:02:38 -08:00
parent 8a48567857
commit b8d423555b
3 changed files with 28 additions and 7 deletions

View file

@ -36,6 +36,7 @@ impl Domain for Workspace {
dock_visible INTEGER, // Boolean dock_visible INTEGER, // Boolean
dock_anchor TEXT, // Enum: 'Bottom' / 'Right' / 'Expanded' dock_anchor TEXT, // Enum: 'Bottom' / 'Right' / 'Expanded'
dock_pane INTEGER, // NULL indicates that we don't have a dock pane yet 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, timestamp TEXT DEFAULT CURRENT_TIMESTAMP NOT NULL,
FOREIGN KEY(dock_pane) REFERENCES panes(pane_id) FOREIGN KEY(dock_pane) REFERENCES panes(pane_id)
) STRICT; ) STRICT;
@ -100,19 +101,20 @@ impl WorkspaceDb {
// Note that we re-assign the workspace_id here in case it's empty // Note that we re-assign the workspace_id here in case it's empty
// and we've grabbed the most recent workspace // 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, WorkspaceId,
WorkspaceLocation, WorkspaceLocation,
bool,
DockPosition, DockPosition,
) = iife!({ ) = iife!({
if worktree_roots.len() == 0 { if worktree_roots.len() == 0 {
self.select_row(sql!( 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 FROM workspaces
ORDER BY timestamp DESC LIMIT 1))?()? ORDER BY timestamp DESC LIMIT 1))?()?
} else { } else {
self.select_row_bound(sql!( 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 FROM workspaces
WHERE workspace_location = ?))?(&workspace_location)? WHERE workspace_location = ?))?(&workspace_location)?
} }
@ -133,6 +135,7 @@ impl WorkspaceDb {
.context("Getting center group") .context("Getting center group")
.log_err()?, .log_err()?,
dock_position, dock_position,
project_panel_open
}) })
} }
@ -158,18 +161,20 @@ impl WorkspaceDb {
INSERT INTO workspaces( INSERT INTO workspaces(
workspace_id, workspace_id,
workspace_location, workspace_location,
project_panel_open,
dock_visible, dock_visible,
dock_anchor, dock_anchor,
timestamp timestamp
) )
VALUES (?1, ?2, ?3, ?4, CURRENT_TIMESTAMP) VALUES (?1, ?2, ?3, ?4, ?5, CURRENT_TIMESTAMP)
ON CONFLICT DO ON CONFLICT DO
UPDATE SET UPDATE SET
workspace_location = ?2, workspace_location = ?2,
dock_visible = ?3, project_panel_open = ?3,
dock_anchor = ?4, dock_visible = ?4,
dock_anchor = ?5,
timestamp = CURRENT_TIMESTAMP timestamp = CURRENT_TIMESTAMP
))?((workspace.id, &workspace.location, workspace.dock_position)) ))?((workspace.id, &workspace.location, workspace.project_panel_open, workspace.dock_position))
.context("Updating workspace")?; .context("Updating workspace")?;
// Save center pane group and dock pane // Save center pane group and dock pane
@ -273,6 +278,7 @@ impl WorkspaceDb {
.collect::<Result<_>>() .collect::<Result<_>>()
} }
fn save_pane_group( fn save_pane_group(
conn: &Connection, conn: &Connection,
workspace_id: WorkspaceId, workspace_id: WorkspaceId,
@ -462,6 +468,7 @@ mod tests {
dock_position: crate::dock::DockPosition::Shown(DockAnchor::Bottom), dock_position: crate::dock::DockPosition::Shown(DockAnchor::Bottom),
center_group: Default::default(), center_group: Default::default(),
dock_pane: Default::default(), dock_pane: Default::default(),
project_panel_open: true
}; };
let mut workspace_2 = SerializedWorkspace { let mut workspace_2 = SerializedWorkspace {
@ -470,6 +477,7 @@ mod tests {
dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Expanded), dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Expanded),
center_group: Default::default(), center_group: Default::default(),
dock_pane: Default::default(), dock_pane: Default::default(),
project_panel_open: false
}; };
db.save_workspace(workspace_1.clone()).await; db.save_workspace(workspace_1.clone()).await;
@ -575,6 +583,7 @@ mod tests {
dock_position: DockPosition::Shown(DockAnchor::Bottom), dock_position: DockPosition::Shown(DockAnchor::Bottom),
center_group, center_group,
dock_pane, dock_pane,
project_panel_open: true
}; };
db.save_workspace(workspace.clone()).await; db.save_workspace(workspace.clone()).await;
@ -602,6 +611,7 @@ mod tests {
dock_position: crate::dock::DockPosition::Shown(DockAnchor::Bottom), dock_position: crate::dock::DockPosition::Shown(DockAnchor::Bottom),
center_group: Default::default(), center_group: Default::default(),
dock_pane: Default::default(), dock_pane: Default::default(),
project_panel_open: true,
}; };
let mut workspace_2 = SerializedWorkspace { let mut workspace_2 = SerializedWorkspace {
@ -610,6 +620,7 @@ mod tests {
dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Expanded), dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Expanded),
center_group: Default::default(), center_group: Default::default(),
dock_pane: Default::default(), dock_pane: Default::default(),
project_panel_open: false,
}; };
db.save_workspace(workspace_1.clone()).await; db.save_workspace(workspace_1.clone()).await;
@ -645,6 +656,7 @@ mod tests {
dock_position: DockPosition::Shown(DockAnchor::Right), dock_position: DockPosition::Shown(DockAnchor::Right),
center_group: Default::default(), center_group: Default::default(),
dock_pane: Default::default(), dock_pane: Default::default(),
project_panel_open: false
}; };
db.save_workspace(workspace_3.clone()).await; db.save_workspace(workspace_3.clone()).await;
@ -679,6 +691,7 @@ mod tests {
dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Right), dock_position: crate::dock::DockPosition::Hidden(DockAnchor::Right),
center_group: center_group.clone(), center_group: center_group.clone(),
dock_pane, dock_pane,
project_panel_open: true
} }
} }

View file

@ -65,6 +65,7 @@ pub struct SerializedWorkspace {
pub dock_position: DockPosition, pub dock_position: DockPosition,
pub center_group: SerializedPaneGroup, pub center_group: SerializedPaneGroup,
pub dock_pane: SerializedPane, pub dock_pane: SerializedPane,
pub project_panel_open: bool,
} }
#[derive(Debug, PartialEq, Eq, Clone)] #[derive(Debug, PartialEq, Eq, Clone)]

View file

@ -2340,6 +2340,7 @@ impl Workspace {
dock_position: self.dock.position(), dock_position: self.dock.position(),
dock_pane, dock_pane,
center_group, center_group,
project_panel_open: self.left_sidebar.read(cx).is_open(),
}; };
cx.background() cx.background()
@ -2383,6 +2384,12 @@ impl Workspace {
// Swap workspace center group // Swap workspace center group
workspace.center = PaneGroup::with_root(root); 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); Dock::set_dock_position(workspace, serialized_workspace.dock_position, cx);
if let Some(active_pane) = active_pane { if let Some(active_pane) = active_pane {