mirror of https://codeberg.org/topola/topola.git
feat(topola-egui): Display loaded board's boundary
This commit is contained in:
parent
78242f16fc
commit
b1ab710adb
|
|
@ -8,7 +8,7 @@ use specctra::{error::ParseErrorContext, structure::DsnFile};
|
||||||
use topola::Board;
|
use topola::Board;
|
||||||
use unic_langid::langid;
|
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 {
|
pub struct App {
|
||||||
translator: Translator,
|
translator: Translator,
|
||||||
|
|
@ -19,7 +19,7 @@ pub struct App {
|
||||||
),
|
),
|
||||||
|
|
||||||
menu_bar: MenuBar,
|
menu_bar: MenuBar,
|
||||||
view_rect: egui::Rect,
|
viewport: Viewport,
|
||||||
workspace: Option<Workspace>,
|
workspace: Option<Workspace>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -29,10 +29,7 @@ impl Default for App {
|
||||||
translator: Translator::new(langid!("en-US")),
|
translator: Translator::new(langid!("en-US")),
|
||||||
content_channel: channel(),
|
content_channel: channel(),
|
||||||
menu_bar: MenuBar::new(),
|
menu_bar: MenuBar::new(),
|
||||||
view_rect: egui::Rect::from_min_max(
|
viewport: Viewport::new(),
|
||||||
egui::pos2(-100.0, 100.0),
|
|
||||||
egui::pos2(100.0, 100.0),
|
|
||||||
),
|
|
||||||
workspace: None,
|
workspace: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -130,14 +127,7 @@ impl eframe::App for App {
|
||||||
|
|
||||||
self.update_state();
|
self.update_state();
|
||||||
|
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
self.viewport.update(ctx, self.workspace.as_mut());
|
||||||
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.update_locale();
|
self.update_locale();
|
||||||
self.update_title(ctx);
|
self.update_title(ctx);
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,9 +7,12 @@
|
||||||
mod action;
|
mod action;
|
||||||
mod actions;
|
mod actions;
|
||||||
mod app;
|
mod app;
|
||||||
|
mod displayer;
|
||||||
mod menu_bar;
|
mod menu_bar;
|
||||||
mod translator;
|
mod translator;
|
||||||
|
mod viewport;
|
||||||
mod workspace;
|
mod workspace;
|
||||||
|
|
||||||
use crate::app::App;
|
use crate::app::App;
|
||||||
|
|
||||||
// When compiling natively:
|
// When compiling natively:
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
use derive_getters::Dissolve;
|
use derive_getters::{Dissolve, Getters};
|
||||||
use stable_vec::StableVec;
|
use stable_vec::StableVec;
|
||||||
use undoredo::{ApplyDelta, Delta, FlushDelta, Recorder};
|
use undoredo::{ApplyDelta, Delta, FlushDelta, Recorder};
|
||||||
|
|
||||||
|
|
@ -101,7 +101,7 @@ pub struct Via {
|
||||||
radius: u64,
|
radius: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug, Getters)]
|
||||||
pub struct Layout {
|
pub struct Layout {
|
||||||
boundary: Vec<[i64; 2]>,
|
boundary: Vec<[i64; 2]>,
|
||||||
place_boundary: Vec<[i64; 2]>,
|
place_boundary: Vec<[i64; 2]>,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue