feat(topola-egui): Display loaded board's boundary

This commit is contained in:
Mikolaj Wielgus 2026-03-09 16:01:42 +01:00
parent 78242f16fc
commit b1ab710adb
5 changed files with 100 additions and 16 deletions

View File

@ -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<Workspace>,
}
@ -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);

View File

@ -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::<Vec<_>>(),
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()
}
}

View File

@ -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:

View File

@ -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)
}
});
});
}
}

View File

@ -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]>,