From 4cb0803356db6087343356ca165f12b07275c547 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 12 Oct 2022 21:44:05 +0200 Subject: [PATCH 1/3] Add Tree:tabs: an iterator over the tabs --- src/tree.rs | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/src/tree.rs b/src/tree.rs index c569e08..e65c4b2 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -339,6 +339,16 @@ impl Tree { self.tree.iter_mut() } + /// Returns an iterator over all tabs in arbitrary order + pub fn tabs(&self) -> TabIter<'_, Tab> { + TabIter::new(self) + } + + /// Number of tabs + pub fn num_tabs(&self) -> usize { + self.tabs().count() + } + /// Creates two new nodes by splitting a given `parent` node and assigns them as its children. The first (old) node /// inherits content of the `parent` from before the split, and the second (new) has `tabs`. /// @@ -680,3 +690,67 @@ where None } } + +// ---------------------------------------------------------------------------- + +/// Iterates over all tabs in a [`Tree`]. +pub struct TabIter<'a, Tab> { + tree: &'a Tree, + node_idx: usize, + tab_idx: usize, +} + +impl<'a, Tab> TabIter<'a, Tab> { + fn new(tree: &'a Tree) -> Self { + Self { + tree, + node_idx: 0, + tab_idx: 0, + } + } +} + +impl<'a, Tab> Iterator for TabIter<'a, Tab> { + type Item = &'a Tab; + + fn next(&mut self) -> Option { + loop { + let node = self.tree.tree.get(self.node_idx)?; + match node { + Node::Leaf { tabs, .. } => match tabs.get(self.tab_idx) { + Some(tab) => { + self.tab_idx += 1; + return Some(tab); + } + None => { + self.node_idx += 1; + self.tab_idx = 0; + } + }, + _ => { + self.node_idx += 1; + self.tab_idx = 0; + } + } + } + } +} + +#[test] +fn test_tabs_iter() { + fn tabs(tree: &Tree) -> Vec { + tree.tabs().copied().collect() + } + + let mut tree = Tree::new(vec![1, 2, 3]); + assert_eq!(tabs(&tree), vec![1, 2, 3]); + + tree.push_to_first_leaf(4); + assert_eq!(tabs(&tree), vec![1, 2, 3, 4]); + + tree.push_to_first_leaf(5); + assert_eq!(tabs(&tree), vec![1, 2, 3, 4, 5]); + + tree.push_to_focused_leaf(6); + assert_eq!(tabs(&tree), vec![1, 2, 3, 4, 5, 6]); +} From d83bece90d0daacc3a5be9cbc35895610d3900e4 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 12 Oct 2022 21:49:04 +0200 Subject: [PATCH 2/3] Add line to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b75674..2344082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Added - New option `expand_tabs` in `Style` causes tab titles to expand to fill the width of their tab bars. +- `Tree::tabs`: an iterator over the tabs in a tree ([#53](https://github.com/Adanos020/egui_dock/pull/53)). ## 0.2.1 - 2022-09-09 From 4ffee29ef92d484aa8425ebbd992a72742dc04ad Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 12 Oct 2022 22:09:32 +0200 Subject: [PATCH 3/3] Optimize num_tabs --- src/tree.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/tree.rs b/src/tree.rs index e65c4b2..2259848 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -346,7 +346,13 @@ impl Tree { /// Number of tabs pub fn num_tabs(&self) -> usize { - self.tabs().count() + let mut count = 0; + for node in self.tree.iter() { + if let Node::Leaf { tabs, .. } = node { + count += tabs.len(); + } + } + count } /// Creates two new nodes by splitting a given `parent` node and assigns them as its children. The first (old) node @@ -753,4 +759,6 @@ fn test_tabs_iter() { tree.push_to_focused_leaf(6); assert_eq!(tabs(&tree), vec![1, 2, 3, 4, 5, 6]); + + assert_eq!(tree.num_tabs(), tree.tabs().count()); }