summaryrefslogtreecommitdiff
path: root/crates/renderer/src/toggle.rs
blob: 7bba735240113f11d2b6fa0e4f481a5061147a73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use teleia::*;
use std::collections::HashMap;

use crate::fig;

#[derive(Debug, Clone)]
pub struct Toggle {
    pub val: bool,
    pub set_time: u64,
}

pub struct Toggles {
    toggles: HashMap<String, Toggle>,
}
impl Toggles {
    pub fn new() -> Self {
        Self {
            toggles: HashMap::new(),
        }
    }
    pub fn set(&mut self, ctx: &context::Context, st: &state::State, nm: &str, val: bool) {
        self.toggles.insert(nm.to_string(), Toggle { val, set_time: st.tick });
    }
    pub fn get(&self, ctx: &context::Context, st: &state::State, nm: &str) -> Option<Toggle> {
        self.toggles.get(nm).cloned()
    }
    pub fn reset(&mut self) {
        self.toggles.clear();
    }
    pub fn handle(&mut self, ctx: &context::Context, st: &state::State, msg: fig::Message) -> Option<()> {
        let nm = msg.data.get(0)?.as_str()?;
        let prev = self.get(ctx, st, nm).map(|t| t.val).unwrap_or(false);
        self.set(ctx, st, nm, !prev);
        Some(())
    }
    pub fn handle_set(&mut self, ctx: &context::Context, st: &state::State, msg: fig::Message, val: bool) -> Option<()> {
        let nm = msg.data.get(0)?.as_str()?;
        self.set(ctx, st, nm, val);
        Some(())
    }
}