egui: impl. layer display manager sidebar (not affecting display yet)

This commit is contained in:
Mikolaj Wielgus 2024-06-12 20:25:45 +02:00
parent c5842b7821
commit 5067fb55d9
5 changed files with 49 additions and 3 deletions

View File

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

View File

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

View File

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

View File

@ -6,7 +6,6 @@ use crate::{
band::BandIndex,
dot::{FixedDotIndex, FixedDotWeight},
graph::{GetLayer, GetMaybeNet, PrimitiveIndex},
rules::RulesTrait,
seg::{FixedSegIndex, FixedSegWeight},
Infringement,
},

View File

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