feat(topola-egui): Make stroke width independent of scale factor

This commit is contained in:
Mikolaj Wielgus 2026-03-09 16:49:11 +01:00
parent b1ab710adb
commit 74b9004ed9
2 changed files with 24 additions and 9 deletions

View File

@ -4,7 +4,7 @@
use egui::Pos2; use egui::Pos2;
use crate::{menu_bar::MenuBar, workspace::Workspace}; use crate::{viewport::Viewport, workspace::Workspace};
pub struct Displayer {} pub struct Displayer {}
@ -18,9 +18,10 @@ impl Displayer {
ctx: &egui::Context, ctx: &egui::Context,
ui: &egui::Ui, ui: &egui::Ui,
//menu_bar: &MenuBar, //menu_bar: &MenuBar,
viewport: &Viewport,
workspace: &Workspace, workspace: &Workspace,
) { ) {
self.display_layout(ctx, ui, /*menu_bar,*/ workspace); self.display_layout(ctx, ui, /*menu_bar,*/ viewport, workspace);
} }
pub fn display_layout( pub fn display_layout(
@ -28,6 +29,7 @@ impl Displayer {
ctx: &egui::Context, ctx: &egui::Context,
ui: &egui::Ui, ui: &egui::Ui,
//menu_bar: &MenuBar, //menu_bar: &MenuBar,
viewport: &Viewport,
workspace: &Workspace, workspace: &Workspace,
) { ) {
ui.painter().line( ui.painter().line(
@ -41,7 +43,7 @@ impl Displayer {
y: p[1] as f32, y: p[1] as f32,
}) })
.collect::<Vec<_>>(), .collect::<Vec<_>>(),
egui::Stroke::new(500.0, egui::Color32::WHITE), egui::Stroke::new(20.0 / viewport.scale_factor(), egui::Color32::WHITE),
); );
ui.painter().line( ui.painter().line(
vec![ vec![

View File

@ -5,29 +5,42 @@
use crate::{displayer::Displayer, workspace::Workspace}; use crate::{displayer::Displayer, workspace::Workspace};
pub struct Viewport { pub struct Viewport {
pub view_rect: egui::Rect, pub scene_rect: egui::Rect,
pub ref_scene_rect: egui::Rect,
} }
impl Viewport { impl Viewport {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
view_rect: egui::Rect::from_min_max( scene_rect: egui::Rect::from_min_max(
egui::pos2(-10000.0, 10000.0), egui::pos2(-10000.0, -10000.0),
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>) { pub fn update(&mut self, ctx: &egui::Context, workspace: Option<&mut Workspace>) {
egui::CentralPanel::default().show(ctx, |ui| { egui::CentralPanel::default().show(ctx, |ui| {
let mut scene_rect = self.scene_rect.clone();
egui::Scene::new() egui::Scene::new()
.zoom_range(0.0001..=10000.0) .zoom_range(0.0001..=10000.0)
.show(ui, &mut self.view_rect, |ui| { .show(ui, &mut scene_rect, |ui| {
if let Some(workspace) = workspace { if let Some(workspace) = workspace {
let mut displayer = Displayer::new(); 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()
}
} }