From b13a60735b0b75ae22e840e25ce2db4e6fef9b2c Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 12 Dec 2022 13:37:43 -0800 Subject: [PATCH] Merge pull request #1959 from zed-industries/serializing-bug-fixes Add check for if the user wants a blanks workspace when deserializing --- crates/drag_and_drop/src/drag_and_drop.rs | 4 +- crates/workspace/src/persistence.rs | 45 +++++++++++++++-------- crates/workspace/src/workspace.rs | 11 +++++- crates/zed/src/main.rs | 14 ++++++- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/crates/drag_and_drop/src/drag_and_drop.rs b/crates/drag_and_drop/src/drag_and_drop.rs index a34fa83a4c..b4881258f7 100644 --- a/crates/drag_and_drop/src/drag_and_drop.rs +++ b/crates/drag_and_drop/src/drag_and_drop.rs @@ -139,9 +139,7 @@ impl DragAndDrop { region_offset, region, }) => { - if (dbg!(event.position) - (dbg!(region.origin() + region_offset))).length() - > DEAD_ZONE - { + if (event.position - (region.origin() + region_offset)).length() > DEAD_ZONE { this.currently_dragged = Some(State::Dragging { window_id, region_offset, diff --git a/crates/workspace/src/persistence.rs b/crates/workspace/src/persistence.rs index 2d4ae919f9..39a4883247 100644 --- a/crates/workspace/src/persistence.rs +++ b/crates/workspace/src/persistence.rs @@ -8,7 +8,7 @@ use anyhow::{anyhow, bail, Context, Result}; use db::{define_connection, query, sqlez::connection::Connection, sqlez_macros::sql}; use gpui::Axis; -use util::{iife, unzip_option, ResultExt}; +use util::{ unzip_option, ResultExt}; use crate::dock::DockPosition; use crate::WorkspaceId; @@ -96,22 +96,16 @@ impl WorkspaceDb { WorkspaceLocation, bool, DockPosition, - ) = iife!({ - if worktree_roots.len() == 0 { - self.select_row(sql!( - SELECT workspace_id, workspace_location, left_sidebar_open, dock_visible, dock_anchor - FROM workspaces - ORDER BY timestamp DESC LIMIT 1))?()? - } else { - self.select_row_bound(sql!( - SELECT workspace_id, workspace_location, left_sidebar_open, dock_visible, dock_anchor - FROM workspaces - WHERE workspace_location = ?))?(&workspace_location)? - } + ) = + self.select_row_bound(sql!{ + SELECT workspace_id, workspace_location, left_sidebar_open, dock_visible, dock_anchor + FROM workspaces + WHERE workspace_location = ? + }) + .and_then(|mut prepared_statement| (prepared_statement)(&workspace_location)) .context("No workspaces found") - }) - .warn_on_err() - .flatten()?; + .warn_on_err() + .flatten()?; Some(SerializedWorkspace { id: workspace_id, @@ -205,6 +199,16 @@ impl WorkspaceDb { } } + query! { + pub fn last_workspace() -> Result> { + SELECT workspace_location + FROM workspaces + WHERE workspace_location IS NOT NULL + ORDER BY timestamp DESC + LIMIT 1 + } + } + fn get_center_pane_group(&self, workspace_id: WorkspaceId) -> Result { self.get_pane_group(workspace_id, None)? .into_iter() @@ -371,6 +375,15 @@ impl WorkspaceDb { Ok(()) } + + query!{ + pub async fn update_timestamp(workspace_id: WorkspaceId) -> Result<()> { + UPDATE workspaces + SET timestamp = CURRENT_TIMESTAMP + WHERE workspace_id = ? + } + } + } #[cfg(test)] diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index f613ed94c7..553c57437d 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -176,6 +176,7 @@ pub fn init(app_state: Arc, cx: &mut MutableAppContext) { } } }); + cx.add_global_action({ let app_state = Arc::downgrade(&app_state); move |_: &NewWindow, cx: &mut MutableAppContext| { @@ -2181,7 +2182,11 @@ impl Workspace { } pub fn on_window_activation_changed(&mut self, active: bool, cx: &mut ViewContext) { - if !active { + if active { + cx.background() + .spawn(persistence::DB.update_timestamp(self.database_id())) + .detach(); + } else { for pane in &self.panes { pane.update(cx, |pane, cx| { if let Some(item) = pane.active_item() { @@ -2618,6 +2623,10 @@ pub fn activate_workspace_for_project( None } +pub fn last_opened_workspace_paths() -> Option { + DB.last_workspace().log_err().flatten() +} + #[allow(clippy::type_complexity)] pub fn open_paths( abs_paths: &[PathBuf], diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 4163841d45..f0447f4054 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -167,7 +167,7 @@ fn main() { cx.platform().activate(true); let paths = collect_path_args(); if paths.is_empty() { - cx.dispatch_global_action(NewFile); + restore_or_create_workspace(cx); } else { cx.dispatch_global_action(OpenPaths { paths }); } @@ -176,7 +176,7 @@ fn main() { cx.spawn(|cx| handle_cli_connection(connection, app_state.clone(), cx)) .detach(); } else { - cx.dispatch_global_action(NewFile); + restore_or_create_workspace(cx); } cx.spawn(|cx| async move { while let Some(connection) = cli_connections_rx.next().await { @@ -200,6 +200,16 @@ fn main() { }); } +fn restore_or_create_workspace(cx: &mut gpui::MutableAppContext) { + if let Some(location) = workspace::last_opened_workspace_paths() { + cx.dispatch_global_action(OpenPaths { + paths: location.paths().as_ref().clone(), + }) + } else { + cx.dispatch_global_action(NewFile); + } +} + fn init_paths() { std::fs::create_dir_all(&*util::paths::CONFIG_DIR).expect("could not create config path"); std::fs::create_dir_all(&*util::paths::LANGUAGES_DIR).expect("could not create languages path");