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}