Merge pull request #2454 from zed-industries/fix-mismatching-panes-when-deserializing-empty-panes

Mikayla Maki created

Fully remove panes and update internal data structures

Change summary

crates/workspace/src/persistence/model.rs |  2 +-
crates/workspace/src/workspace.rs         | 19 +++++++++++++------
2 files changed, 14 insertions(+), 7 deletions(-)

Detailed changes

crates/workspace/src/persistence/model.rs 🔗

@@ -147,7 +147,7 @@ impl SerializedPaneGroup {
                 } else {
                     let pane = pane.upgrade(cx)?;
                     workspace
-                        .update(cx, |workspace, cx| workspace.remove_pane(pane, cx))
+                        .update(cx, |workspace, cx| workspace.force_remove_pane(&pane, cx))
                         .log_err()?;
                     None
                 }

crates/workspace/src/workspace.rs 🔗

@@ -1743,16 +1743,12 @@ impl Workspace {
 
     fn remove_pane(&mut self, pane: ViewHandle<Pane>, cx: &mut ViewContext<Self>) {
         if self.center.remove(&pane).unwrap() {
-            self.panes.retain(|p| p != &pane);
-            cx.focus(self.panes.last().unwrap());
+            self.force_remove_pane(&pane, cx);
             self.unfollow(&pane, cx);
             self.last_leaders_by_pane.remove(&pane.downgrade());
             for removed_item in pane.read(cx).items() {
                 self.panes_by_item.remove(&removed_item.id());
             }
-            if self.last_active_center_pane == Some(pane.downgrade()) {
-                self.last_active_center_pane = None;
-            }
 
             cx.notify();
         } else {
@@ -2459,8 +2455,19 @@ impl Workspace {
                     self.remove_panes(child.clone(), cx)
                 }
             }
-            Member::Pane(pane) => self.remove_pane(pane.clone(), cx),
+            Member::Pane(pane) => {
+                self.force_remove_pane(&pane, cx);
+            }
+        }
+    }
+
+    fn force_remove_pane(&mut self, pane: &ViewHandle<Pane>, cx: &mut ViewContext<Workspace>) {
+        self.panes.retain(|p| p != pane);
+        cx.focus(self.panes.last().unwrap());
+        if self.last_active_center_pane == Some(pane.downgrade()) {
+            self.last_active_center_pane = None;
         }
+        cx.notify();
     }
 
     fn serialize_workspace(&self, cx: &AppContext) {