widget_forge/widget/
conditional_widgets.rs

1use std::{collections::HashSet, marker::PhantomData};
2
3use ascii_forge::window::Window;
4
5use super::{SpecialWidget, Widget};
6
7pub struct ConditionalWidgets<D, C: Fn(&mut Window, &mut D) -> bool>(C, Vec<usize>, PhantomData<D>);
8
9impl<D, C: Fn(&mut Window, &mut D) -> bool> ConditionalWidgets<D, C> {
10    pub fn new(cond: C, ids: Vec<usize>) -> Self {
11        Self(cond, ids, PhantomData {})
12    }
13
14    pub fn with_widget_id(mut self, id: usize) -> Self {
15        self.1.push(id);
16        self
17    }
18}
19
20impl<D, C: Fn(&mut Window, &mut D) -> bool> SpecialWidget<D> for ConditionalWidgets<D, C> {
21    fn update(
22        &mut self,
23        window: &mut Window,
24        data: &mut D,
25        widgets: &mut [Box<dyn Widget<D>>],
26        updated: &mut HashSet<usize>,
27    ) {
28        let cond = self.0(window, data);
29        for idx in &self.1 {
30            if updated.contains(idx) {
31                continue;
32            }
33
34            if cond {
35                widgets[*idx].update(window, data);
36            }
37
38            updated.insert(*idx);
39        }
40    }
41}