ferrite_ui/
input.rs

1// /ferrite-ui/src/input.rs
2use 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}