mirror of https://codeberg.org/topola/topola.git
egui: implement zooming in/out to a point
This commit is contained in:
parent
4959f3512b
commit
8a56a16528
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue