diff options
author | 2020-03-05 03:12:45 +0100 | |
---|---|---|
committer | 2020-03-05 03:12:45 +0100 | |
commit | 15fad17f373c0aeb023a879f5e38440fdd944eca (patch) | |
tree | cec7d195454f5e524a2987a260a2b281e4250bea /native/src | |
parent | a6531c840b97b1d30af5153c01fda69d09f43a08 (diff) | |
download | iced-15fad17f373c0aeb023a879f5e38440fdd944eca.tar.gz iced-15fad17f373c0aeb023a879f5e38440fdd944eca.tar.bz2 iced-15fad17f373c0aeb023a879f5e38440fdd944eca.zip |
Implement `panes::State::close`
Diffstat (limited to 'native/src')
-rw-r--r-- | native/src/widget/panes.rs | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/native/src/widget/panes.rs b/native/src/widget/panes.rs index 22fa2b5a..2ffb2226 100644 --- a/native/src/widget/panes.rs +++ b/native/src/widget/panes.rs @@ -199,6 +199,10 @@ impl<T> State<T> { ) } + pub fn len(&self) -> usize { + self.panes.len() + } + pub fn get_mut(&mut self, pane: &Pane) -> Option<&mut T> { self.panes.get_mut(pane) } @@ -252,6 +256,15 @@ impl<T> State<T> { Some(new_pane) } + + pub fn close(&mut self, pane: &Pane) -> Option<T> { + if let Some(sibling) = self.internal.layout.remove(pane) { + self.internal.focused_pane = Some(sibling); + self.panes.remove(pane) + } else { + None + } + } } #[derive(Debug, Clone, Hash)] @@ -266,7 +279,7 @@ enum Node { } impl Node { - pub fn find(&mut self, pane: &Pane) -> Option<&mut Node> { + fn find(&mut self, pane: &Pane) -> Option<&mut Node> { match self { Node::Split { a, b, .. } => { if let Some(node) = a.find(pane) { @@ -285,7 +298,7 @@ impl Node { } } - pub fn split(&mut self, kind: Split, new_pane: Pane) { + fn split(&mut self, kind: Split, new_pane: Pane) { *self = Node::Split { kind, ratio: 500_000, @@ -294,6 +307,23 @@ impl Node { }; } + fn remove(&mut self, pane: &Pane) -> Option<Pane> { + match self { + Node::Split { a, b, .. } => { + if a.pane() == Some(*pane) { + *self = *b.clone(); + Some(self.first_pane()) + } else if b.pane() == Some(*pane) { + *self = *a.clone(); + Some(self.first_pane()) + } else { + a.remove(pane).or_else(|| b.remove(pane)) + } + } + Node::Pane(_) => None, + } + } + pub fn regions(&self, size: Size) -> HashMap<Pane, Rectangle> { let mut regions = HashMap::new(); @@ -310,6 +340,20 @@ impl Node { regions } + fn pane(&self) -> Option<Pane> { + match self { + Node::Split { .. } => None, + Node::Pane(pane) => Some(*pane), + } + } + + fn first_pane(&self) -> Pane { + match self { + Node::Split { a, .. } => a.first_pane(), + Node::Pane(pane) => *pane, + } + } + fn compute_regions( &self, current: &Rectangle, @@ -330,7 +374,7 @@ impl Node { } } -#[derive(Debug, Clone, Copy, Hash)] +#[derive(Debug, Clone, Hash, PartialEq, Eq)] pub enum Split { Horizontal, Vertical, |