From 8a56a1652804e2498523e5b7221377520b9e8dc2 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Tue, 5 Mar 2024 20:02:16 +0000 Subject: [PATCH] egui: implement zooming in/out to a point --- src/bin/topola-egui/app.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/bin/topola-egui/app.rs b/src/bin/topola-egui/app.rs index 52f82ef..6b0a472 100644 --- a/src/bin/topola-egui/app.rs +++ b/src/bin/topola-egui/app.rs @@ -111,9 +111,25 @@ impl eframe::App for App { let desired_size = ui.available_width() * egui::vec2(1.0, 0.5); let (_id, viewport_rect) = ui.allocate_space(desired_size); - self.from_rect = self.from_rect.translate(ctx.input(|i| -i.raw_scroll_delta)); + let old_transform = + egui::emath::RectTransform::from_to(self.from_rect, viewport_rect); + let latest_pos = old_transform + .inverse() + .transform_pos(ctx.input(|i| i.pointer.latest_pos().unwrap_or_default())); + + let old_scale = old_transform.scale().x; self.from_rect = self.from_rect / ctx.input(|i| i.zoom_delta()); + let new_scale = egui::emath::RectTransform::from_to(self.from_rect, viewport_rect) + .scale() + .x; + + self.from_rect = self.from_rect.translate( + ctx.input(|i| latest_pos.to_vec2() * (new_scale - old_scale) / new_scale), + ); + + self.from_rect = self.from_rect.translate(ctx.input(|i| -i.raw_scroll_delta)); + let transform = egui::emath::RectTransform::from_to(self.from_rect, viewport_rect); let mut painter = Painter::new(ui, transform);