diff options
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget/pane_grid.rs | 12 | ||||
| -rw-r--r-- | native/src/widget/pane_grid/node.rs | 28 | ||||
| -rw-r--r-- | native/src/widget/pane_grid/state.rs | 21 | 
3 files changed, 47 insertions, 14 deletions
| diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index f89c3588..a8deef0b 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -273,8 +273,6 @@ impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> {                      self.state.focus(pane);                  }              } -        } else { -            self.state.unfocus();          }      } @@ -288,7 +286,7 @@ impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer> {              if let Some((split, _)) = self.state.picked_split() {                  let bounds = layout.bounds(); -                let splits = self.state.splits( +                let splits = self.state.split_regions(                      f32::from(self.spacing),                      Size::new(bounds.width, bounds.height),                  ); @@ -410,7 +408,7 @@ where          let limits = limits.width(self.width).height(self.height);          let size = limits.resolve(Size::ZERO); -        let regions = self.state.regions(f32::from(self.spacing), size); +        let regions = self.state.pane_regions(f32::from(self.spacing), size);          let children = self              .elements @@ -453,7 +451,7 @@ where                                      cursor_position.y - bounds.y,                                  ); -                                let splits = self.state.splits( +                                let splits = self.state.split_regions(                                      f32::from(self.spacing),                                      Size::new(bounds.width, bounds.height),                                  ); @@ -482,6 +480,8 @@ where                                  );                              }                          } +                    } else { +                        self.state.unfocus();                      }                  }                  mouse::Event::ButtonReleased(mouse::Button::Left) => { @@ -588,7 +588,7 @@ where                      let splits = self                          .state -                        .splits(f32::from(self.spacing), bounds.size()); +                        .split_regions(f32::from(self.spacing), bounds.size());                      hovered_split(                          splits.iter(), diff --git a/native/src/widget/pane_grid/node.rs b/native/src/widget/pane_grid/node.rs index b13c5e26..cbfd8a43 100644 --- a/native/src/widget/pane_grid/node.rs +++ b/native/src/widget/pane_grid/node.rs @@ -43,12 +43,36 @@ pub enum Node {  }  impl Node { +    /// Returns an iterator over each [`Split`] in this [`Node`]. +    /// +    /// [`Split`]: struct.Split.html +    /// [`Node`]: enum.Node.html +    pub fn splits(&self) -> impl Iterator<Item = &Split> { +        let mut unvisited_nodes = vec![self]; + +        std::iter::from_fn(move || { +            while let Some(node) = unvisited_nodes.pop() { +                match node { +                    Node::Split { id, a, b, .. } => { +                        unvisited_nodes.push(a); +                        unvisited_nodes.push(b); + +                        return Some(id); +                    } +                    _ => {} +                } +            } + +            None +        }) +    } +      /// Returns the rectangular region for each [`Pane`] in the [`Node`] given      /// the spacing between panes and the total available space.      ///      /// [`Pane`]: struct.Pane.html      /// [`Node`]: enum.Node.html -    pub fn regions( +    pub fn pane_regions(          &self,          spacing: f32,          size: Size, @@ -75,7 +99,7 @@ impl Node {      ///      /// [`Split`]: struct.Split.html      /// [`Node`]: enum.Node.html -    pub fn splits( +    pub fn split_regions(          &self,          spacing: f32,          size: Size, diff --git a/native/src/widget/pane_grid/state.rs b/native/src/widget/pane_grid/state.rs index 4b13fb8e..a4cfb6f6 100644 --- a/native/src/widget/pane_grid/state.rs +++ b/native/src/widget/pane_grid/state.rs @@ -154,8 +154,10 @@ impl<T> State<T> {      /// [`Pane`]: struct.Pane.html      /// [`State::active`]: struct.State.html#method.active      pub fn adjacent(&self, pane: &Pane, direction: Direction) -> Option<Pane> { -        let regions = -            self.internal.layout.regions(0.0, Size::new(4096.0, 4096.0)); +        let regions = self +            .internal +            .layout +            .pane_regions(0.0, Size::new(4096.0, 4096.0));          let current_region = regions.get(pane)?; @@ -191,6 +193,13 @@ impl<T> State<T> {          self.internal.focus(pane);      } +    /// Unfocuses the current focused [`Pane`]. +    /// +    /// [`Pane`]: struct.Pane.html +    pub fn unfocus(&mut self) { +        self.internal.unfocus(); +    } +      /// Splits the given [`Pane`] into two in the given [`Axis`] and      /// initializing the new [`Pane`] with the provided internal state.      /// @@ -362,20 +371,20 @@ impl Internal {          }      } -    pub fn regions( +    pub fn pane_regions(          &self,          spacing: f32,          size: Size,      ) -> HashMap<Pane, Rectangle> { -        self.layout.regions(spacing, size) +        self.layout.pane_regions(spacing, size)      } -    pub fn splits( +    pub fn split_regions(          &self,          spacing: f32,          size: Size,      ) -> HashMap<Split, (Axis, Rectangle, f32)> { -        self.layout.splits(spacing, size) +        self.layout.split_regions(spacing, size)      }      pub fn focus(&mut self, pane: &Pane) { | 
