database_tree/
treeitems_iter.rs

1use 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}