1use crate::ZoomHandler;
3use eframe::egui::{Context, Rect, Ui};
4use ferrite_config::ControlsConfig;
5
6pub fn handle_input(
7 ctx: &Context,
8 ui: &Ui,
9 zoom_handler: &mut ZoomHandler,
10 controls: &ControlsConfig,
11 _panel_rect: Rect,
12) {
13 if ctx.input(|i| i.key_pressed(controls.toggle_fit_key)) {
14 zoom_handler.reset_to_default_fit_mode();
15 }
16
17 if ctx.input(|i| {
18 controls
19 .zoom_in_keys
20 .iter()
21 .any(|&key| i.key_pressed(key))
22 }) {
23 handle_zoom(ui, zoom_handler, 1.0);
24 }
25
26 if ctx.input(|i| {
27 controls
28 .zoom_out_keys
29 .iter()
30 .any(|&key| i.key_pressed(key))
31 }) {
32 handle_zoom(ui, zoom_handler, -1.0);
33 }
34
35 let scroll_delta = ctx.input(|i| i.raw_scroll_delta.y);
36 if scroll_delta != 0.0 {
37 handle_zoom(ui, zoom_handler, scroll_delta.into());
38 }
39
40 if ctx.input(|i| i.key_pressed(controls.reset_zoom_key)) {
41 zoom_handler.reset();
42 }
43}
44
45fn handle_zoom(ui: &Ui, zoom_handler: &mut ZoomHandler, scroll_delta: f64) {
46 if let Some(mouse_pos) = ui.input(|i| i.pointer.hover_pos()) {
47 let panel_rect = ui.available_rect_before_wrap();
48 let old_center = panel_rect.center() + zoom_handler.offset();
49
50 let zoom_step = if scroll_delta > 0.0 { 1.1 } else { 0.9 };
51 let new_zoom = (zoom_handler.zoom_level() * zoom_step).clamp(0.1, 10.0);
52
53 let mouse_to_center = mouse_pos - old_center;
54
55 let scale_factor = new_zoom / zoom_handler.zoom_level();
56 let new_mouse_to_center = mouse_to_center * scale_factor as f32;
57
58 let offset_correction = mouse_to_center - new_mouse_to_center;
59 zoom_handler.add_offset(offset_correction);
60
61 zoom_handler.set_zoom(new_zoom);
62
63 ui.ctx().request_repaint();
64 } else {
65 let zoom_step = if scroll_delta > 0.0 { 1.1 } else { 0.9 };
66 let new_zoom = (zoom_handler.zoom_level() * zoom_step).clamp(0.1, 10.0);
67 zoom_handler.set_zoom(new_zoom);
68 }
69}