mirror of https://codeberg.org/topola/topola.git
egui: impl. layer display manager sidebar (not affecting display yet)
This commit is contained in:
parent
c5842b7821
commit
5067fb55d9
|
|
@ -40,7 +40,7 @@ use topola::{
|
|||
},
|
||||
};
|
||||
|
||||
use crate::{overlay::Overlay, painter::Painter};
|
||||
use crate::{layers::Layers, overlay::Overlay, painter::Painter};
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
struct SharedData {
|
||||
|
|
@ -76,6 +76,9 @@ pub struct App {
|
|||
|
||||
#[serde(skip)]
|
||||
show_ratsnest: bool,
|
||||
|
||||
#[serde(skip)]
|
||||
layers: Option<Layers>,
|
||||
}
|
||||
|
||||
impl Default for App {
|
||||
|
|
@ -88,6 +91,7 @@ impl Default for App {
|
|||
from_rect: egui::Rect::from_x_y_ranges(0.0..=1000000.0, 0.0..=500000.0),
|
||||
is_placing_via: false,
|
||||
show_ratsnest: true,
|
||||
layers: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -169,6 +173,7 @@ impl eframe::App for App {
|
|||
let design = DsnDesign::load_from_string(file_contents).unwrap();
|
||||
let board = design.make_board();
|
||||
self.overlay = Some(Overlay::new(&board).unwrap());
|
||||
self.layers = Some(Layers::new(&board));
|
||||
self.invoker = Some(Arc::new(Mutex::new(Invoker::new(
|
||||
Autorouter::new(board).unwrap(),
|
||||
))));
|
||||
|
|
@ -178,6 +183,7 @@ impl eframe::App for App {
|
|||
let design = DsnDesign::load_from_file(&path).unwrap();
|
||||
let board = design.make_board();
|
||||
self.overlay = Some(Overlay::new(&board).unwrap());
|
||||
self.layers = Some(Layers::new(&board));
|
||||
self.invoker = Some(Arc::new(Mutex::new(Invoker::new(
|
||||
Autorouter::new(board).unwrap(),
|
||||
))));
|
||||
|
|
@ -338,6 +344,12 @@ impl eframe::App for App {
|
|||
});
|
||||
});
|
||||
|
||||
if let Some(ref mut layers) = self.layers {
|
||||
if let Some(invoker_arc_mutex) = &self.invoker {
|
||||
layers.update(ctx, invoker_arc_mutex.lock().unwrap().autorouter().board());
|
||||
}
|
||||
}
|
||||
|
||||
egui::CentralPanel::default().show(ctx, |ui| {
|
||||
egui::Frame::canvas(ui.style()).show(ui, |ui| {
|
||||
ui.ctx().request_repaint();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
use topola::board::{mesadata::MesadataTrait, Board};
|
||||
|
||||
pub struct Layers {
|
||||
visible: Box<[bool]>,
|
||||
}
|
||||
|
||||
impl Layers {
|
||||
pub fn new(board: &Board<impl MesadataTrait>) -> Self {
|
||||
let layer_count = board.layout().drawing().layer_count();
|
||||
|
||||
Self {
|
||||
visible: std::iter::repeat(true)
|
||||
.take(layer_count.try_into().unwrap() /* FIXME */)
|
||||
.collect::<Vec<_>>()
|
||||
.into_boxed_slice(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn update(&mut self, ctx: &egui::Context, board: &Board<impl MesadataTrait>) {
|
||||
egui::SidePanel::right("right_side_panel").show(ctx, |ui| {
|
||||
ui.label("Layers");
|
||||
|
||||
for (layer, visible) in self.visible.iter_mut().enumerate() {
|
||||
let layername = board
|
||||
.layout()
|
||||
.drawing()
|
||||
.rules()
|
||||
.layer_layername(layer.try_into().unwrap() /* FIXME */)
|
||||
.unwrap_or("Unnamed layer");
|
||||
|
||||
ui.checkbox(visible, layername);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
|
||||
|
||||
mod app;
|
||||
mod layers;
|
||||
mod overlay;
|
||||
mod painter;
|
||||
use app::App;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ use crate::{
|
|||
band::BandIndex,
|
||||
dot::{FixedDotIndex, FixedDotWeight},
|
||||
graph::{GetLayer, GetMaybeNet, PrimitiveIndex},
|
||||
rules::RulesTrait,
|
||||
seg::{FixedSegIndex, FixedSegWeight},
|
||||
Infringement,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
use crate::{drawing::rules::RulesTrait, layout::NodeIndex};
|
||||
|
||||
// TODO: use this trait.
|
||||
pub trait MesadataTrait: RulesTrait {
|
||||
fn bename_layer(&mut self, layer: u64, layername: String);
|
||||
fn layer_layername(&self, layer: u64) -> Option<&str>;
|
||||
|
|
|
|||
Loading…
Reference in New Issue