summaryrefslogtreecommitdiffstats
path: root/native
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2020-07-01 22:44:37 +0200
committerLibravatar GitHub <noreply@github.com>2020-07-01 22:44:37 +0200
commit99a50d6b2ff2c54c276d3a142071bd77ac38e4f0 (patch)
tree0f8eca7533cf6eef8fdf0661fe2c0c4fe83f9243 /native
parent79aa225001dda0efc7b9d8301641a4806f259960 (diff)
parente50c61f7ff8c7bd559afb66025eaded78ca423bb (diff)
downloadiced-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.rs12
-rw-r--r--native/src/widget/pane_grid/node.rs28
-rw-r--r--native/src/widget/pane_grid/state.rs21
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) {