From 6e8585e88c89c9e3e18e49765d4d954000bd4674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Sat, 14 Mar 2020 04:06:32 +0100 Subject: [PATCH] Expose `adjacent_pane` instead of `focus_adjacent` --- native/src/widget/pane_grid.rs | 70 ++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index 1ba1b417..ddbc7bfd 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -321,8 +321,8 @@ enum FocusedPane { #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Direction { - Top, - Bottom, + Up, + Down, Left, Right, } @@ -378,6 +378,41 @@ impl State { } } + pub fn adjacent_pane( + &self, + pane: &Pane, + direction: Direction, + ) -> Option { + let regions = + self.internal.layout.regions(0.0, Size::new(4096.0, 4096.0)); + + let current_region = regions.get(pane)?; + + let target = match direction { + Direction::Left => { + Point::new(current_region.x - 1.0, current_region.y + 1.0) + } + Direction::Right => Point::new( + current_region.x + current_region.width + 1.0, + current_region.y + 1.0, + ), + Direction::Up => { + Point::new(current_region.x + 1.0, current_region.y - 1.0) + } + Direction::Down => Point::new( + current_region.x + 1.0, + current_region.y + current_region.height + 1.0, + ), + }; + + let mut colliding_regions = + regions.iter().filter(|(_, region)| region.contains(target)); + + let (pane, _) = colliding_regions.next()?; + + Some(*pane) + } + pub fn focus(&mut self, pane: &Pane) { self.internal.focused_pane = FocusedPane::Some { pane: *pane, @@ -385,37 +420,6 @@ impl State { }; } - pub fn focus_adjacent(&mut self, pane: &Pane, direction: Direction) { - let regions = - self.internal.layout.regions(0.0, Size::new(4096.0, 4096.0)); - - if let Some(current_region) = regions.get(pane) { - let target = match direction { - Direction::Left => { - Point::new(current_region.x - 1.0, current_region.y + 1.0) - } - Direction::Right => Point::new( - current_region.x + current_region.width + 1.0, - current_region.y + 1.0, - ), - Direction::Top => { - Point::new(current_region.x + 1.0, current_region.y - 1.0) - } - Direction::Bottom => Point::new( - current_region.x + 1.0, - current_region.y + current_region.height + 1.0, - ), - }; - - let mut colliding_regions = - regions.iter().filter(|(_, region)| region.contains(target)); - - if let Some((pane, _)) = colliding_regions.next() { - self.focus(&pane); - } - } - } - pub fn split_vertically(&mut self, pane: &Pane, state: T) -> Option { self.split(Split::Vertical, pane, state) }