widget_forge/widget/
conditional_widgets.rs1use 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}