database_tree/
treeitems_iter.rs1use crate::{databasetreeitems::DatabaseTreeItems, item::DatabaseTreeItem};
2
3pub struct TreeItemsIterator<'a> {
4 tree: &'a DatabaseTreeItems,
5 index: usize,
6 increments: Option<usize>,
7 max_amount: usize,
8}
9
10impl<'a> TreeItemsIterator<'a> {
11 pub const fn new(tree: &'a DatabaseTreeItems, start: usize, max_amount: usize) -> Self {
12 TreeItemsIterator {
13 max_amount,
14 increments: None,
15 index: start,
16 tree,
17 }
18 }
19}
20
21impl<'a> Iterator for TreeItemsIterator<'a> {
22 type Item = (usize, &'a DatabaseTreeItem);
23
24 fn next(&mut self) -> Option<Self::Item> {
25 if self.increments.unwrap_or_default() < self.max_amount {
26 let items = &self.tree.tree_items;
27
28 let mut init = self.increments.is_none();
29
30 if let Some(i) = self.increments.as_mut() {
31 *i += 1;
32 } else {
33 self.increments = Some(0);
34 };
35
36 loop {
37 if !init {
38 self.index += 1;
39 }
40 init = false;
41
42 if self.index >= self.tree.len() {
43 break;
44 }
45
46 let elem = &items[self.index];
47
48 if elem.info().is_visible() {
49 return Some((self.index, &items[self.index]));
50 }
51 }
52 }
53
54 None
55 }
56}