summaryrefslogtreecommitdiff
path: root/src/config/keymap/template.rs
blob: 5425eb85fa5c55a3873bf62a6a3ad4e9e56d2b35 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
macro_rules! KeyMapSections {
    ($($name:ident => $key:ident),+ $(,)?) => {
        $(
            #[derive(Debug, Default, Clone)]
            pub struct $name {
                store: KeyMapStore,
                default_return: bool,
            }

            impl $name {
                pub const fn new() -> Self {
                    Self {
                        store: KeyMapStore::new(),
                        default_return: true,
                    }
                }

                pub fn handle(event: KeyEvent) -> bool {
                    let (def, func) = {
                        let mut config = GlobalConfig::instance_mut();
                        (config.keymap.$key.default_return, config.keymap.$key.store.get(event))
                    };

                    if let Some(func) = func {
                        let func = func.lock().unwrap();
                        match func.run() {
                            Ok(value) => value,
                            _ => def
                        }
                    } else {
                        def
                    }
                }

                pub fn map(event: KeyEvent, func: impl Runnable + 'static) {
                    GlobalConfig::instance_mut()
                        .keymap
                        .$key
                        .store
                        .map(event, func)
                }
            }

            impl UserData for $name {
                fn add_fields<'lua, M: mlua::prelude::LuaUserDataFields<'lua, Self>>(fields: &mut M) {
                    fields.add_field_function_get("default", |_, _| {
                        Ok(GlobalConfig::instance().keymap.$key.default_return)
                    });

                    fields.add_field_function_set("default", |_, _, def: bool| {
                        GlobalConfig::instance_mut().keymap.$key.default_return = def;
                        Ok(())
                    })
                }

                fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>(
                    methods: &mut M,
                ) {
                    methods.add_function("map", |lua, (event, func): (String, Function<'_>)| {
                        let key = lua.create_registry_value(func)?;

                        if let Ok(event) = event_from_string(event) {
                            $name::map(event, key);
                        }
                        Ok(())
                    });
                }
            }
        )*
    };
}

pub(super) use KeyMapSections;