rvlib/
egui_mappers.rs

1use crate::{Event, KeyCode, ZoomAmount};
2
3#[derive(Debug, Default)]
4pub struct LastSensedBtns {
5    pub btn_codes: Vec<KeyCode>,
6    pub modifiers: Vec<Event>,
7}
8impl LastSensedBtns {
9    pub fn is_empty(&self) -> bool {
10        self.btn_codes.is_empty() && self.modifiers.is_empty()
11    }
12}
13pub fn map_key(egui_key: egui::Key) -> Option<KeyCode> {
14    match egui_key {
15        egui::Key::A => Some(KeyCode::A),
16        egui::Key::B => Some(KeyCode::B),
17        egui::Key::C => Some(KeyCode::C),
18        egui::Key::D => Some(KeyCode::D),
19        egui::Key::E => Some(KeyCode::E),
20        egui::Key::L => Some(KeyCode::L),
21        egui::Key::H => Some(KeyCode::H),
22        egui::Key::I => Some(KeyCode::I),
23        egui::Key::M => Some(KeyCode::M),
24        egui::Key::Q => Some(KeyCode::Q),
25        egui::Key::R => Some(KeyCode::R),
26        egui::Key::S => Some(KeyCode::S),
27        egui::Key::T => Some(KeyCode::T),
28        egui::Key::V => Some(KeyCode::V),
29        egui::Key::Y => Some(KeyCode::Y),
30        egui::Key::Z => Some(KeyCode::Z),
31        egui::Key::Num0 => Some(KeyCode::Key0),
32        egui::Key::Num1 => Some(KeyCode::Key1),
33        egui::Key::Num2 => Some(KeyCode::Key2),
34        egui::Key::Num3 => Some(KeyCode::Key3),
35        egui::Key::Num4 => Some(KeyCode::Key4),
36        egui::Key::Num5 => Some(KeyCode::Key5),
37        egui::Key::Num6 => Some(KeyCode::Key6),
38        egui::Key::Num7 => Some(KeyCode::Key7),
39        egui::Key::Num8 => Some(KeyCode::Key8),
40        egui::Key::Num9 => Some(KeyCode::Key9),
41        egui::Key::Plus | egui::Key::Equals => Some(KeyCode::PlusEquals),
42        egui::Key::Minus => Some(KeyCode::Minus),
43        egui::Key::Delete => Some(KeyCode::Delete),
44        egui::Key::Backspace => Some(KeyCode::Back),
45        egui::Key::ArrowLeft => Some(KeyCode::Left),
46        egui::Key::ArrowRight => Some(KeyCode::Right),
47        egui::Key::ArrowUp => Some(KeyCode::Up),
48        egui::Key::ArrowDown => Some(KeyCode::Down),
49        egui::Key::F5 => Some(KeyCode::F5),
50        egui::Key::PageDown => Some(KeyCode::PageDown),
51        egui::Key::PageUp => Some(KeyCode::PageUp),
52        egui::Key::Escape => Some(KeyCode::Escape),
53        _ => None,
54    }
55}
56pub fn map_modifiers(modifiers: egui::Modifiers) -> Vec<Event> {
57    let mut events = Vec::new();
58    if modifiers.alt {
59        events.push(Event::Held(KeyCode::Alt));
60    }
61    if modifiers.command || modifiers.ctrl {
62        events.push(Event::Held(KeyCode::Ctrl));
63    }
64    if modifiers.shift {
65        events.push(Event::Held(KeyCode::Shift));
66    }
67    events
68}
69
70pub fn map_key_events(ui: &mut egui::Ui) -> Vec<Event> {
71    let mut events = vec![];
72    ui.input(|i| {
73        for e in &i.events {
74            if let egui::Event::Key {
75                key,
76                pressed,
77                repeat,
78                modifiers,
79                physical_key: _,
80            } = e
81            {
82                if let Some(k) = map_key(*key) {
83                    if !pressed {
84                        events.push(Event::Released(k));
85                    } else if !repeat {
86                        events.push(Event::Pressed(k));
87                        events.push(Event::Held(k));
88                    } else {
89                        events.push(Event::Held(k));
90                    }
91                }
92                let mut modifier_events = map_modifiers(*modifiers);
93                events.append(&mut modifier_events);
94            }
95        }
96    });
97    events
98}
99
100pub fn map_mouse_events(
101    ui: &mut egui::Ui,
102    last_sensed: &mut LastSensedBtns,
103    image_response: &egui::Response,
104) -> Vec<Event> {
105    let mut events = vec![];
106    let mut btn_codes = LastSensedBtns::default();
107    ui.input(|i| {
108        for e in &i.events {
109            match e {
110                egui::Event::PointerButton {
111                    pos: _,
112                    button,
113                    pressed: _,
114                    modifiers,
115                } => {
116                    let modifier_events = map_modifiers(*modifiers);
117                    let btn_code = match button {
118                        egui::PointerButton::Primary => KeyCode::MouseLeft,
119                        egui::PointerButton::Secondary => KeyCode::MouseRight,
120                        _ => KeyCode::DontCare,
121                    };
122                    btn_codes.btn_codes.push(btn_code);
123                    btn_codes.modifiers = modifier_events;
124                }
125                egui::Event::Zoom(z) => {
126                    events.push(Event::Zoom(ZoomAmount::Factor(f64::from(*z))));
127                }
128                egui::Event::MouseWheel {
129                    unit: _,
130                    delta,
131                    modifiers,
132                } => {
133                    if modifiers.ctrl {
134                        events.push(Event::Zoom(ZoomAmount::Delta(f64::from(delta.y))));
135                    }
136                }
137                _ => {}
138            };
139        }
140    });
141    if !btn_codes.is_empty() {
142        *last_sensed = btn_codes;
143    }
144
145    if image_response.clicked()
146        || image_response.secondary_clicked()
147        || image_response.drag_stopped()
148    {
149        if last_sensed.btn_codes.contains(&KeyCode::MouseLeft) {
150            events.push(Event::Released(KeyCode::MouseLeft));
151            for modifier in &last_sensed.modifiers {
152                events.push(*modifier);
153            }
154        } else if last_sensed.btn_codes.contains(&KeyCode::MouseRight) {
155            events.push(Event::Released(KeyCode::MouseRight));
156            for modifier in &last_sensed.modifiers {
157                events.push(*modifier);
158            }
159        }
160        *last_sensed = LastSensedBtns::default();
161    }
162    if image_response.drag_started() {
163        if last_sensed.btn_codes.contains(&KeyCode::MouseLeft) {
164            events.push(Event::Pressed(KeyCode::MouseLeft));
165            for modifier in &last_sensed.modifiers {
166                events.push(*modifier);
167            }
168        } else if last_sensed.btn_codes.contains(&KeyCode::MouseRight) {
169            events.push(Event::Pressed(KeyCode::MouseRight));
170            for modifier in &last_sensed.modifiers {
171                events.push(*modifier);
172            }
173        }
174    }
175    if image_response.dragged() {
176        if last_sensed.btn_codes.contains(&KeyCode::MouseLeft) {
177            events.push(Event::Held(KeyCode::MouseLeft));
178            for modifier in &last_sensed.modifiers {
179                events.push(*modifier);
180            }
181        } else if last_sensed.btn_codes.contains(&KeyCode::MouseRight) {
182            events.push(Event::Held(KeyCode::MouseRight));
183            for modifier in &last_sensed.modifiers {
184                events.push(*modifier);
185            }
186        }
187    }
188    events
189}