diff --git a/topola-egui/src/app.rs b/topola-egui/src/app.rs index 817765c..6f1f4ef 100644 --- a/topola-egui/src/app.rs +++ b/topola-egui/src/app.rs @@ -8,7 +8,7 @@ use specctra::{error::ParseErrorContext, structure::DsnFile}; use topola::Board; use unic_langid::langid; -use crate::{menu_bar::MenuBar, translator::Translator, workspace::Workspace}; +use crate::{menu_bar::MenuBar, translator::Translator, viewport::Viewport, workspace::Workspace}; pub struct App { translator: Translator, @@ -19,7 +19,7 @@ pub struct App { ), menu_bar: MenuBar, - view_rect: egui::Rect, + viewport: Viewport, workspace: Option, } @@ -29,10 +29,7 @@ impl Default for App { translator: Translator::new(langid!("en-US")), content_channel: channel(), menu_bar: MenuBar::new(), - view_rect: egui::Rect::from_min_max( - egui::pos2(-100.0, 100.0), - egui::pos2(100.0, 100.0), - ), + viewport: Viewport::new(), workspace: None, } } @@ -130,14 +127,7 @@ impl eframe::App for App { self.update_state(); - egui::CentralPanel::default().show(ctx, |ui| { - egui::Scene::new() - .zoom_range(0.001..=1000.0) - .show(ui, &mut self.view_rect, |ui| { - ui.painter() - .circle_filled(egui::pos2(0.0, 0.0), 20.0, egui::Color32::RED); - }); - }); + self.viewport.update(ctx, self.workspace.as_mut()); self.update_locale(); self.update_title(ctx); diff --git a/topola-egui/src/displayer.rs b/topola-egui/src/displayer.rs new file mode 100644 index 0000000..b969e6d --- /dev/null +++ b/topola-egui/src/displayer.rs @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: 2026 Topola contributors +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +use egui::Pos2; + +use crate::{menu_bar::MenuBar, workspace::Workspace}; + +pub struct Displayer {} + +impl Displayer { + pub fn new() -> Self { + Self {} + } + + pub fn update( + &mut self, + ctx: &egui::Context, + ui: &egui::Ui, + //menu_bar: &MenuBar, + workspace: &Workspace, + ) { + self.display_layout(ctx, ui, /*menu_bar,*/ workspace); + } + + pub fn display_layout( + &mut self, + ctx: &egui::Context, + ui: &egui::Ui, + //menu_bar: &MenuBar, + workspace: &Workspace, + ) { + ui.painter().line( + workspace + .board + .layout() + .boundary() + .iter() + .map(|p| egui::Pos2 { + x: p[0] as f32, + y: p[1] as f32, + }) + .collect::>(), + egui::Stroke::new(500.0, egui::Color32::WHITE), + ); + ui.painter().line( + vec![ + Pos2::new(0.0, 0.0), + Pos2::new(100.0, 100.0), + Pos2::new(100.0, 500.0), + ], + egui::Stroke::new(2.0, egui::Color32::GOLD), + ); + ui.painter() + .circle_filled(egui::pos2(0.0, 0.0), 2.0, egui::Color32::RED); + //workspace.board.layout().boundary() + } +} diff --git a/topola-egui/src/main.rs b/topola-egui/src/main.rs index 10d5f35..fb1a024 100644 --- a/topola-egui/src/main.rs +++ b/topola-egui/src/main.rs @@ -7,9 +7,12 @@ mod action; mod actions; mod app; +mod displayer; mod menu_bar; mod translator; +mod viewport; mod workspace; + use crate::app::App; // When compiling natively: diff --git a/topola-egui/src/viewport.rs b/topola-egui/src/viewport.rs new file mode 100644 index 0000000..6f6b0da --- /dev/null +++ b/topola-egui/src/viewport.rs @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: 2026 Topola contributors +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +use crate::{displayer::Displayer, workspace::Workspace}; + +pub struct Viewport { + pub view_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), + ), + } + } + + pub fn update(&mut self, ctx: &egui::Context, workspace: Option<&mut Workspace>) { + egui::CentralPanel::default().show(ctx, |ui| { + egui::Scene::new() + .zoom_range(0.0001..=10000.0) + .show(ui, &mut self.view_rect, |ui| { + if let Some(workspace) = workspace { + let mut displayer = Displayer::new(); + displayer.update(ctx, ui, workspace) + } + }); + }); + } +} diff --git a/topola/src/layout.rs b/topola/src/layout.rs index 16aa55a..655461e 100644 --- a/topola/src/layout.rs +++ b/topola/src/layout.rs @@ -4,7 +4,7 @@ use std::collections::BTreeMap; -use derive_getters::Dissolve; +use derive_getters::{Dissolve, Getters}; use stable_vec::StableVec; use undoredo::{ApplyDelta, Delta, FlushDelta, Recorder}; @@ -101,7 +101,7 @@ pub struct Via { radius: u64, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Getters)] pub struct Layout { boundary: Vec<[i64; 2]>, place_boundary: Vec<[i64; 2]>,