From 74b9004ed9e04cd66ba902587d720439242b38bc Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Mon, 9 Mar 2026 16:49:11 +0100 Subject: [PATCH] feat(topola-egui): Make stroke width independent of scale factor --- topola-egui/src/displayer.rs | 8 +++++--- topola-egui/src/viewport.rs | 25 +++++++++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/topola-egui/src/displayer.rs b/topola-egui/src/displayer.rs index b969e6d..56c37b5 100644 --- a/topola-egui/src/displayer.rs +++ b/topola-egui/src/displayer.rs @@ -4,7 +4,7 @@ use egui::Pos2; -use crate::{menu_bar::MenuBar, workspace::Workspace}; +use crate::{viewport::Viewport, workspace::Workspace}; pub struct Displayer {} @@ -18,9 +18,10 @@ impl Displayer { ctx: &egui::Context, ui: &egui::Ui, //menu_bar: &MenuBar, + viewport: &Viewport, workspace: &Workspace, ) { - self.display_layout(ctx, ui, /*menu_bar,*/ workspace); + self.display_layout(ctx, ui, /*menu_bar,*/ viewport, workspace); } pub fn display_layout( @@ -28,6 +29,7 @@ impl Displayer { ctx: &egui::Context, ui: &egui::Ui, //menu_bar: &MenuBar, + viewport: &Viewport, workspace: &Workspace, ) { ui.painter().line( @@ -41,7 +43,7 @@ impl Displayer { y: p[1] as f32, }) .collect::>(), - egui::Stroke::new(500.0, egui::Color32::WHITE), + egui::Stroke::new(20.0 / viewport.scale_factor(), egui::Color32::WHITE), ); ui.painter().line( vec![ diff --git a/topola-egui/src/viewport.rs b/topola-egui/src/viewport.rs index 6f6b0da..242993b 100644 --- a/topola-egui/src/viewport.rs +++ b/topola-egui/src/viewport.rs @@ -5,29 +5,42 @@ use crate::{displayer::Displayer, workspace::Workspace}; pub struct Viewport { - pub view_rect: egui::Rect, + pub scene_rect: egui::Rect, + pub ref_scene_rect: egui::Rect, } impl Viewport { pub fn new() -> Self { Self { - view_rect: egui::Rect::from_min_max( - egui::pos2(-10000.0, 10000.0), - egui::pos2(-10000.0, 10000.0), + scene_rect: egui::Rect::from_min_max( + egui::pos2(-10000.0, -10000.0), + egui::pos2(10000.0, 10000.0), + ), + ref_scene_rect: egui::Rect::from_min_max( + egui::pos2(-10000.0, -10000.0), + egui::pos2(10000.0, 10000.0), ), } } pub fn update(&mut self, ctx: &egui::Context, workspace: Option<&mut Workspace>) { egui::CentralPanel::default().show(ctx, |ui| { + let mut scene_rect = self.scene_rect.clone(); + egui::Scene::new() .zoom_range(0.0001..=10000.0) - .show(ui, &mut self.view_rect, |ui| { + .show(ui, &mut scene_rect, |ui| { if let Some(workspace) = workspace { let mut displayer = Displayer::new(); - displayer.update(ctx, ui, workspace) + displayer.update(ctx, ui, &self, workspace); } }); + + self.scene_rect = scene_rect; }); } + + pub fn scale_factor(&self) -> f32 { + self.ref_scene_rect.width() / self.scene_rect.width() + } }