diff options
author | 2020-07-01 22:44:37 +0200 | |
---|---|---|
committer | 2020-07-01 22:44:37 +0200 | |
commit | 99a50d6b2ff2c54c276d3a142071bd77ac38e4f0 (patch) | |
tree | 0f8eca7533cf6eef8fdf0661fe2c0c4fe83f9243 /native | |
parent | 79aa225001dda0efc7b9d8301641a4806f259960 (diff) | |
parent | e50c61f7ff8c7bd559afb66025eaded78ca423bb (diff) | |
download | iced-99a50d6b2ff2c54c276d3a142071bd77ac38e4f0.tar.gz iced-99a50d6b2ff2c54c276d3a142071bd77ac38e4f0.tar.bz2 iced-99a50d6b2ff2c54c276d3a142071bd77ac38e4f0.zip |
Merge pull request #431 from hecrj/feature/pane-grid-splits
Splits iterator for `PaneGrid` and minor improvements
Diffstat (limited to 'native')
-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) { |