Merge pull request #431 from hecrj/feature/pane-grid-splits
Splits iterator for `PaneGrid` and minor improvements
This commit is contained in:
commit
99a50d6b2f
@ -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(),
|
||||
|
@ -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,
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user