From e66fbe292be3ad41467a2f247995b986561c04a0 Mon Sep 17 00:00:00 2001 From: Alain Emilia Anna Zscheile Date: Tue, 8 Oct 2024 13:47:39 +0200 Subject: [PATCH] egui/Viewport: merge zoom_to_fit part into paint, merge into update method --- src/bin/topola-egui/viewport.rs | 86 ++++++++++++--------------------- 1 file changed, 31 insertions(+), 55 deletions(-) diff --git a/src/bin/topola-egui/viewport.rs b/src/bin/topola-egui/viewport.rs index 03cd2fd..d68e344 100644 --- a/src/bin/topola-egui/viewport.rs +++ b/src/bin/topola-egui/viewport.rs @@ -35,22 +35,6 @@ impl Viewport { } pub fn update( - &mut self, - ctx: &egui::Context, - top: &MenuBar, - mut maybe_workspace: Option<&mut Workspace>, - ) -> egui::Rect { - let viewport_rect = self.paint(ctx, top, maybe_workspace.as_deref_mut()); - - if self.scheduled_zoom_to_fit { - let mut maybe_invoker = maybe_workspace.as_mut().map(|w| &mut w.invoker); - self.zoom_to_fit(maybe_invoker.as_deref_mut(), &viewport_rect); - } - - viewport_rect - } - - pub fn paint( &mut self, ctx: &egui::Context, top: &MenuBar, @@ -247,49 +231,41 @@ impl Viewport { } } } + + if self.scheduled_zoom_to_fit { + let root_bbox = invoker + .autorouter() + .board() + .layout() + .drawing() + .rtree() + .root() + .envelope(); + + let root_bbox_width = root_bbox.upper()[0] - root_bbox.lower()[0]; + let root_bbox_height = root_bbox.upper()[1] - root_bbox.lower()[1]; + + self.transform.scaling = 0.8 * if root_bbox_width / root_bbox_height + >= (viewport_rect.width() as f64) / (viewport_rect.height() as f64) + { + viewport_rect.width() / root_bbox_width as f32 + } else { + viewport_rect.height() / root_bbox_height as f32 + }; + + self.transform.translation = egui::Vec2::new( + viewport_rect.center()[0] as f32, + viewport_rect.center()[1] as f32, + ) - (self.transform.scaling + * egui::Pos2::new(root_bbox.center()[0] as f32, -root_bbox.center()[1] as f32)) + .to_vec2(); + } + + self.scheduled_zoom_to_fit = false; } viewport_rect }) }).inner.inner } - - fn zoom_to_fit( - &mut self, - maybe_invoker: Option<&mut Invoker>, - viewport_rect: &egui::Rect, - ) { - if self.scheduled_zoom_to_fit { - if let Some(invoker) = maybe_invoker { - let root_bbox = invoker - .autorouter() - .board() - .layout() - .drawing() - .rtree() - .root() - .envelope(); - - let root_bbox_width = root_bbox.upper()[0] - root_bbox.lower()[0]; - let root_bbox_height = root_bbox.upper()[1] - root_bbox.lower()[1]; - - if root_bbox_width / root_bbox_height - >= (viewport_rect.width() as f64) / (viewport_rect.height() as f64) - { - self.transform.scaling = 0.8 * viewport_rect.width() / root_bbox_width as f32; - } else { - self.transform.scaling = 0.8 * viewport_rect.height() / root_bbox_height as f32; - } - - self.transform.translation = egui::Vec2::new( - viewport_rect.center()[0] as f32, - viewport_rect.center()[1] as f32, - ) - (self.transform.scaling - * egui::Pos2::new(root_bbox.center()[0] as f32, -root_bbox.center()[1] as f32)) - .to_vec2(); - } - } - - self.scheduled_zoom_to_fit = false; - } }