From 60b6b0b317df55d16c6496239321eca999d5aa15 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 23 Mar 2022 15:06:25 +0100 Subject: [PATCH] Cycle through panes spatially rather than in the order in which they created Co-Authored-By: Nathan Sobo --- crates/workspace/src/pane_group.rs | 17 ++++++++++++++ crates/workspace/src/workspace.rs | 36 ++++++++++++++++-------------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/crates/workspace/src/pane_group.rs b/crates/workspace/src/pane_group.rs index d34613df4ac19633a9659d59b33580f38d4825ad..afffec507452ee00bcf4d185abb92ef09a92a9d7 100644 --- a/crates/workspace/src/pane_group.rs +++ b/crates/workspace/src/pane_group.rs @@ -57,6 +57,12 @@ impl PaneGroup { ) -> ElementBox { self.root.render(theme, follower_states, collaborators) } + + pub(crate) fn panes(&self) -> Vec<&ViewHandle> { + let mut panes = Vec::new(); + self.root.collect_panes(&mut panes); + panes + } } #[derive(Clone, Debug, Eq, PartialEq)] @@ -122,6 +128,17 @@ impl Member { Member::Axis(axis) => axis.render(theme, follower_states, collaborators), } } + + fn collect_panes<'a>(&'a self, panes: &mut Vec<&'a ViewHandle>) { + match self { + Member::Axis(axis) => { + for member in &axis.members { + member.collect_panes(panes); + } + } + Member::Pane(pane) => panes.push(pane), + } + } } #[derive(Clone, Debug, Eq, PartialEq)] diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 19208294d75630901ec502bbd06ebcf5b3b1ee91..691f17ca559deee7eb66c8f4c1f3b3bd0d4a6423 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -1160,27 +1160,29 @@ impl Workspace { } pub fn activate_next_pane(&mut self, cx: &mut ViewContext) { - let ix = self - .panes - .iter() - .position(|pane| pane == &self.active_pane) - .unwrap(); - let next_ix = (ix + 1) % self.panes.len(); - self.activate_pane(self.panes[next_ix].clone(), cx); + let next_pane = { + let panes = self.center.panes(); + let ix = panes + .iter() + .position(|pane| **pane == self.active_pane) + .unwrap(); + let next_ix = (ix + 1) % panes.len(); + panes[next_ix].clone() + }; + self.activate_pane(next_pane, cx); } pub fn activate_previous_pane(&mut self, cx: &mut ViewContext) { - let ix = self - .panes - .iter() - .position(|pane| pane == &self.active_pane) - .unwrap(); - let prev_ix = if ix == 0 { - self.panes.len() - 1 - } else { - ix - 1 + let prev_pane = { + let panes = self.center.panes(); + let ix = panes + .iter() + .position(|pane| **pane == self.active_pane) + .unwrap(); + let prev_ix = if ix == 0 { panes.len() - 1 } else { ix - 1 }; + panes[prev_ix].clone() }; - self.activate_pane(self.panes[prev_ix].clone(), cx); + self.activate_pane(prev_pane, cx); } fn activate_pane(&mut self, pane: ViewHandle, cx: &mut ViewContext) {