This commit is contained in:
Antonio Scandurra 2023-05-18 15:35:46 +02:00
parent 89d8bb1425
commit f2ad17dbc0
3 changed files with 56 additions and 73 deletions

View file

@ -20,7 +20,6 @@ use model::{
use self::model::DockStructure;
define_connection! {
// Current schema shape using pseudo-rust syntax:
//
@ -158,11 +157,11 @@ define_connection! {
// Add panels related information
sql!(
ALTER TABLE workspaces ADD COLUMN left_dock_visible INTEGER; //bool
ALTER TABLE workspaces ADD COLUMN left_dock_size REAL;
ALTER TABLE workspaces ADD COLUMN left_dock_active_panel TEXT;
ALTER TABLE workspaces ADD COLUMN right_dock_visible INTEGER; //bool
ALTER TABLE workspaces ADD COLUMN right_dock_size REAL;
ALTER TABLE workspaces ADD COLUMN right_dock_active_panel TEXT;
ALTER TABLE workspaces ADD COLUMN bottom_dock_visible INTEGER; //bool
ALTER TABLE workspaces ADD COLUMN bottom_dock_size REAL;
ALTER TABLE workspaces ADD COLUMN bottom_dock_active_panel TEXT;
)];
}
@ -178,19 +177,17 @@ 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, left_sidebar_open, bounds, display, docks): (
let (workspace_id, workspace_location, bounds, display, docks): (
WorkspaceId,
WorkspaceLocation,
bool,
Option<WindowBounds>,
Option<Uuid>,
DockStructure
DockStructure,
) = self
.select_row_bound(sql! {
SELECT
workspace_id,
workspace_location,
left_sidebar_open,
window_state,
window_x,
window_y,
@ -198,11 +195,11 @@ impl WorkspaceDb {
window_height,
display,
left_dock_visible,
left_dock_size,
left_dock_active_panel,
right_dock_visible,
right_dock_size,
right_dock_active_panel,
bottom_dock_visible,
bottom_dock_size
bottom_dock_active_panel
FROM workspaces
WHERE workspace_location = ?
})
@ -218,10 +215,9 @@ impl WorkspaceDb {
.get_center_pane_group(workspace_id)
.context("Getting center group")
.log_err()?,
left_sidebar_open,
bounds,
display,
docks
docks,
})
}
@ -246,28 +242,26 @@ impl WorkspaceDb {
INSERT INTO workspaces(
workspace_id,
workspace_location,
left_sidebar_open,
left_dock_visible,
left_dock_size,
left_dock_active_panel,
right_dock_visible,
right_dock_size,
right_dock_active_panel,
bottom_dock_visible,
bottom_dock_size,
bottom_dock_active_panel,
timestamp
)
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, CURRENT_TIMESTAMP)
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, CURRENT_TIMESTAMP)
ON CONFLICT DO
UPDATE SET
workspace_location = ?2,
left_sidebar_open = ?3,
left_dock_visible = ?4,
left_dock_size = ?5,
right_dock_visible = ?6,
right_dock_size = ?7,
bottom_dock_visible = ?8,
bottom_dock_size = ?9,
left_dock_visible = ?3,
left_dock_active_panel = ?4,
right_dock_visible = ?5,
right_dock_active_panel = ?6,
bottom_dock_visible = ?7,
bottom_dock_active_panel = ?8,
timestamp = CURRENT_TIMESTAMP
))?((workspace.id, &workspace.location, workspace.left_sidebar_open, workspace.docks))
))?((workspace.id, &workspace.location, workspace.docks))
.context("Updating workspace")?;
// Save center pane group
@ -581,22 +575,19 @@ mod tests {
let mut workspace_1 = SerializedWorkspace {
id: 1,
location: (["/tmp", "/tmp2"]).into(),
left_sidebar_open: true,
center_group: Default::default(),
bounds: Default::default(),
display: Default::default(),
docks: Default::default()
docks: Default::default(),
};
let mut _workspace_2 = SerializedWorkspace {
id: 2,
location: (["/tmp"]).into(),
left_sidebar_open: false,
center_group: Default::default(),
bounds: Default::default(),
display: Default::default(),
docks: Default::default()
docks: Default::default(),
};
db.save_workspace(workspace_1.clone()).await;
@ -691,10 +682,9 @@ mod tests {
id: 5,
location: (["/tmp", "/tmp2"]).into(),
center_group,
left_sidebar_open: true,
bounds: Default::default(),
display: Default::default(),
docks: Default::default()
docks: Default::default(),
};
db.save_workspace(workspace.clone()).await;
@ -720,20 +710,18 @@ mod tests {
id: 1,
location: (["/tmp", "/tmp2"]).into(),
center_group: Default::default(),
left_sidebar_open: true,
bounds: Default::default(),
display: Default::default(),
docks: Default::default()
docks: Default::default(),
};
let mut workspace_2 = SerializedWorkspace {
id: 2,
location: (["/tmp"]).into(),
center_group: Default::default(),
left_sidebar_open: false,
bounds: Default::default(),
display: Default::default(),
docks: Default::default()
docks: Default::default(),
};
db.save_workspace(workspace_1.clone()).await;
@ -767,10 +755,9 @@ mod tests {
id: 3,
location: (&["/tmp", "/tmp2"]).into(),
center_group: Default::default(),
left_sidebar_open: false,
bounds: Default::default(),
display: Default::default(),
docks: Default::default()
docks: Default::default(),
};
db.save_workspace(workspace_3.clone()).await;
@ -801,10 +788,9 @@ mod tests {
id: 4,
location: workspace_id.into(),
center_group: center_group.clone(),
left_sidebar_open: true,
bounds: Default::default(),
display: Default::default(),
docks: Default::default()
docks: Default::default(),
}
}

View file

@ -60,7 +60,6 @@ pub struct SerializedWorkspace {
pub id: WorkspaceId,
pub location: WorkspaceLocation,
pub center_group: SerializedPaneGroup,
pub left_sidebar_open: bool,
pub bounds: Option<WindowBounds>,
pub display: Option<Uuid>,
pub docks: DockStructure,
@ -100,17 +99,17 @@ impl Bind for DockStructure {
#[derive(Debug, PartialEq, Clone, Default)]
pub struct DockData {
pub(crate) visible: bool,
pub(crate) size: Option<f32>,
pub(crate) active_panel: Option<String>,
}
impl Column for DockData {
fn column(statement: &mut Statement, start_index: i32) -> Result<(Self, i32)> {
let (visible, next_index) = Option::<bool>::column(statement, start_index)?;
let (size, next_index) = Option::<f32>::column(statement, next_index)?;
let (active_panel, next_index) = Option::<String>::column(statement, next_index)?;
Ok((
DockData {
visible: visible.unwrap_or(false),
size,
active_panel,
},
next_index,
))
@ -120,7 +119,7 @@ impl Column for DockData {
impl Bind for DockData {
fn bind(&self, statement: &Statement, start_index: i32) -> Result<i32> {
let next_index = statement.bind(&self.visible, start_index)?;
statement.bind(&self.size, next_index)
statement.bind(&self.active_panel, next_index)
}
}

View file

@ -2580,39 +2580,45 @@ impl Workspace {
fn build_serialized_docks(this: &Workspace, cx: &AppContext) -> DockStructure {
let left_dock = this.left_dock.read(cx);
let left_visible = left_dock.is_open();
let left_size = left_dock
.active_panel()
.map(|panel| left_dock.panel_size(panel.as_ref()))
.flatten();
let left_active_panel = left_dock.active_panel().and_then(|panel| {
Some(
cx.view_ui_name(panel.as_any().window_id(), panel.id())?
.to_string(),
)
});
let right_dock = this.right_dock.read(cx);
let right_visible = right_dock.is_open();
let right_size = right_dock
.active_panel()
.map(|panel| right_dock.panel_size(panel.as_ref()))
.flatten();
let right_active_panel = right_dock.active_panel().and_then(|panel| {
Some(
cx.view_ui_name(panel.as_any().window_id(), panel.id())?
.to_string(),
)
});
let bottom_dock = this.bottom_dock.read(cx);
let bottom_visible = bottom_dock.is_open();
let bottom_size = bottom_dock
.active_panel()
.map(|panel| bottom_dock.panel_size(panel.as_ref()))
.flatten();
let bottom_active_panel = bottom_dock.active_panel().and_then(|panel| {
Some(
cx.view_ui_name(panel.as_any().window_id(), panel.id())?
.to_string(),
)
});
DockStructure {
dbg!(DockStructure {
left: DockData {
visible: left_visible,
size: left_size,
active_panel: left_active_panel,
},
right: DockData {
visible: right_visible,
size: right_size,
active_panel: right_active_panel,
},
bottom: DockData {
visible: bottom_visible,
size: bottom_size,
active_panel: bottom_active_panel,
},
}
})
}
if let Some(location) = self.location(cx) {
@ -2627,7 +2633,6 @@ impl Workspace {
id: self.database_id,
location,
center_group,
left_sidebar_open: self.left_dock.read(cx).is_open(),
bounds: Default::default(),
display: Default::default(),
docks,
@ -2686,22 +2691,15 @@ impl Workspace {
let docks = serialized_workspace.docks;
workspace.left_dock.update(cx, |dock, cx| {
dbg!(docks.left.visible);
dock.set_open(docks.left.visible, cx);
if let Some(size) = docks.left.size {
dock.resize_active_panel(size, cx);
}
dbg!(dock.is_open());
});
workspace.right_dock.update(cx, |dock, cx| {
dock.set_open(docks.right.visible, cx);
if let Some(size) = docks.right.size {
dock.resize_active_panel(size, cx);
}
});
workspace.bottom_dock.update(cx, |dock, cx| {
dock.set_open(docks.bottom.visible, cx);
if let Some(size) = docks.bottom.size {
dock.resize_active_panel(size, cx);
}
});
cx.notify();