Reduce frequency of workspace save (#11183)
Co-Authored-By: Mikayla <mikayla@zed.dev> Release Notes: - N/A --------- Co-authored-by: Mikayla <mikayla@zed.dev>
This commit is contained in:
parent
4fad96b179
commit
62c12cd549
4 changed files with 42 additions and 26 deletions
|
@ -603,7 +603,7 @@ impl<T: Item> ItemHandle for View<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
cx.defer(|workspace, cx| {
|
cx.defer(|workspace, cx| {
|
||||||
workspace.serialize_workspace(cx).detach();
|
workspace.serialize_workspace(cx);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -749,7 +749,7 @@ mod element {
|
||||||
}
|
}
|
||||||
|
|
||||||
workspace
|
workspace
|
||||||
.update(cx, |this, cx| this.schedule_serialize(cx))
|
.update(cx, |this, cx| this.serialize_workspace(cx))
|
||||||
.log_err();
|
.log_err();
|
||||||
cx.stop_propagation();
|
cx.stop_propagation();
|
||||||
cx.refresh();
|
cx.refresh();
|
||||||
|
@ -935,7 +935,7 @@ mod element {
|
||||||
let mut borrow = flexes.lock();
|
let mut borrow = flexes.lock();
|
||||||
*borrow = vec![1.; borrow.len()];
|
*borrow = vec![1.; borrow.len()];
|
||||||
workspace
|
workspace
|
||||||
.update(cx, |this, cx| this.schedule_serialize(cx))
|
.update(cx, |this, cx| this.serialize_workspace(cx))
|
||||||
.log_err();
|
.log_err();
|
||||||
|
|
||||||
cx.refresh();
|
cx.refresh();
|
||||||
|
|
|
@ -631,7 +631,7 @@ impl Workspace {
|
||||||
|
|
||||||
project::Event::WorktreeRemoved(_) | project::Event::WorktreeAdded => {
|
project::Event::WorktreeRemoved(_) | project::Event::WorktreeAdded => {
|
||||||
this.update_window_title(cx);
|
this.update_window_title(cx);
|
||||||
this.serialize_workspace(cx).detach();
|
this.serialize_workspace(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
project::Event::DisconnectedFromHost => {
|
project::Event::DisconnectedFromHost => {
|
||||||
|
@ -823,15 +823,15 @@ impl Workspace {
|
||||||
ThemeSettings::reload_current_theme(cx);
|
ThemeSettings::reload_current_theme(cx);
|
||||||
}),
|
}),
|
||||||
cx.observe(&left_dock, |this, _, cx| {
|
cx.observe(&left_dock, |this, _, cx| {
|
||||||
this.serialize_workspace(cx).detach();
|
this.serialize_workspace(cx);
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}),
|
}),
|
||||||
cx.observe(&bottom_dock, |this, _, cx| {
|
cx.observe(&bottom_dock, |this, _, cx| {
|
||||||
this.serialize_workspace(cx).detach();
|
this.serialize_workspace(cx);
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}),
|
}),
|
||||||
cx.observe(&right_dock, |this, _, cx| {
|
cx.observe(&right_dock, |this, _, cx| {
|
||||||
this.serialize_workspace(cx).detach();
|
this.serialize_workspace(cx);
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}),
|
}),
|
||||||
cx.on_release(|this, window, cx| {
|
cx.on_release(|this, window, cx| {
|
||||||
|
@ -1897,7 +1897,7 @@ impl Workspace {
|
||||||
}
|
}
|
||||||
|
|
||||||
cx.notify();
|
cx.notify();
|
||||||
self.serialize_workspace(cx).detach();
|
self.serialize_workspace(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn close_all_docks(&mut self, cx: &mut ViewContext<Self>) {
|
pub fn close_all_docks(&mut self, cx: &mut ViewContext<Self>) {
|
||||||
|
@ -1911,7 +1911,7 @@ impl Workspace {
|
||||||
|
|
||||||
cx.focus_self();
|
cx.focus_self();
|
||||||
cx.notify();
|
cx.notify();
|
||||||
self.serialize_workspace(cx).detach();
|
self.serialize_workspace(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Transfer focus to the panel of the given type.
|
/// Transfer focus to the panel of the given type.
|
||||||
|
@ -1934,6 +1934,8 @@ impl Workspace {
|
||||||
cx: &mut ViewContext<Self>,
|
cx: &mut ViewContext<Self>,
|
||||||
should_focus: impl Fn(&dyn PanelHandle, &mut ViewContext<Dock>) -> bool,
|
should_focus: impl Fn(&dyn PanelHandle, &mut ViewContext<Dock>) -> bool,
|
||||||
) -> Option<Arc<dyn PanelHandle>> {
|
) -> Option<Arc<dyn PanelHandle>> {
|
||||||
|
let mut result_panel = None;
|
||||||
|
let mut serialize = false;
|
||||||
for dock in [&self.left_dock, &self.bottom_dock, &self.right_dock] {
|
for dock in [&self.left_dock, &self.bottom_dock, &self.right_dock] {
|
||||||
if let Some(panel_index) = dock.read(cx).panel_index_for_type::<T>() {
|
if let Some(panel_index) = dock.read(cx).panel_index_for_type::<T>() {
|
||||||
let mut focus_center = false;
|
let mut focus_center = false;
|
||||||
|
@ -1956,12 +1958,18 @@ impl Workspace {
|
||||||
self.active_pane.update(cx, |pane, cx| pane.focus(cx))
|
self.active_pane.update(cx, |pane, cx| pane.focus(cx))
|
||||||
}
|
}
|
||||||
|
|
||||||
self.serialize_workspace(cx).detach();
|
result_panel = panel;
|
||||||
cx.notify();
|
serialize = true;
|
||||||
return panel;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
|
||||||
|
if serialize {
|
||||||
|
self.serialize_workspace(cx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cx.notify();
|
||||||
|
result_panel
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Open the panel of the given type
|
/// Open the panel of the given type
|
||||||
|
@ -2559,7 +2567,7 @@ impl Workspace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.serialize_workspace(cx).detach();
|
self.serialize_workspace(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn split_pane(
|
pub fn split_pane(
|
||||||
|
@ -3511,17 +3519,22 @@ impl Workspace {
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn schedule_serialize(&mut self, cx: &mut ViewContext<Self>) {
|
fn serialize_workspace(&mut self, cx: &mut ViewContext<Self>) {
|
||||||
self._schedule_serialize = Some(cx.spawn(|this, mut cx| async move {
|
if self._schedule_serialize.is_none() {
|
||||||
cx.background_executor()
|
self._schedule_serialize = Some(cx.spawn(|this, mut cx| async move {
|
||||||
.timer(Duration::from_millis(100))
|
cx.background_executor()
|
||||||
.await;
|
.timer(Duration::from_millis(100))
|
||||||
this.update(&mut cx, |this, cx| this.serialize_workspace(cx).detach())
|
.await;
|
||||||
|
this.update(&mut cx, |this, cx| {
|
||||||
|
this.serialize_workspace_internal(cx).detach();
|
||||||
|
this._schedule_serialize.take();
|
||||||
|
})
|
||||||
.log_err();
|
.log_err();
|
||||||
}));
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_workspace(&self, cx: &mut WindowContext) -> Task<()> {
|
fn serialize_workspace_internal(&self, cx: &mut WindowContext) -> Task<()> {
|
||||||
fn serialize_pane_handle(pane_handle: &View<Pane>, cx: &WindowContext) -> SerializedPane {
|
fn serialize_pane_handle(pane_handle: &View<Pane>, cx: &WindowContext) -> SerializedPane {
|
||||||
let (items, active) = {
|
let (items, active) = {
|
||||||
let pane = pane_handle.read(cx);
|
let pane = pane_handle.read(cx);
|
||||||
|
@ -3741,9 +3754,11 @@ impl Workspace {
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
// Serialize ourself to make sure our timestamps and any pane / item changes are replicated
|
// Serialize ourself to make sure our timestamps and any pane / item changes are replicated
|
||||||
workspace.update(&mut cx, |workspace, cx| {
|
workspace
|
||||||
workspace.serialize_workspace(cx).detach()
|
.update(&mut cx, |workspace, cx| {
|
||||||
})?;
|
workspace.serialize_workspace_internal(cx).detach();
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
|
||||||
Ok(opened_items)
|
Ok(opened_items)
|
||||||
})
|
})
|
||||||
|
|
|
@ -2842,11 +2842,12 @@ mod tests {
|
||||||
handle_keymap_file_changes(keymap_rx, cx);
|
handle_keymap_file_changes(keymap_rx, cx);
|
||||||
});
|
});
|
||||||
workspace
|
workspace
|
||||||
.update(cx, |workspace, _| {
|
.update(cx, |workspace, cx| {
|
||||||
workspace.register_action(|_, _: &A, _cx| {});
|
workspace.register_action(|_, _: &A, _cx| {});
|
||||||
workspace.register_action(|_, _: &B, _cx| {});
|
workspace.register_action(|_, _: &B, _cx| {});
|
||||||
workspace.register_action(|_, _: &ActivatePreviousPane, _cx| {});
|
workspace.register_action(|_, _: &ActivatePreviousPane, _cx| {});
|
||||||
workspace.register_action(|_, _: &ActivatePrevItem, _cx| {});
|
workspace.register_action(|_, _: &ActivatePrevItem, _cx| {});
|
||||||
|
cx.notify();
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
executor.run_until_parked();
|
executor.run_until_parked();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue