From 5067fb55d9e2bb933c227d6211007dea2bd23507 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Wed, 12 Jun 2024 20:25:45 +0200 Subject: [PATCH] egui: impl. layer display manager sidebar (not affecting display yet) --- src/bin/topola-egui/app.rs | 14 +++++++++++++- src/bin/topola-egui/layers.rs | 35 +++++++++++++++++++++++++++++++++++ src/bin/topola-egui/main.rs | 1 + src/board/board.rs | 1 - src/board/mesadata.rs | 1 - 5 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 src/bin/topola-egui/layers.rs diff --git a/src/bin/topola-egui/app.rs b/src/bin/topola-egui/app.rs index c2ffcf8..ec9b813 100644 --- a/src/bin/topola-egui/app.rs +++ b/src/bin/topola-egui/app.rs @@ -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, } 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(); diff --git a/src/bin/topola-egui/layers.rs b/src/bin/topola-egui/layers.rs new file mode 100644 index 0000000..02a0b05 --- /dev/null +++ b/src/bin/topola-egui/layers.rs @@ -0,0 +1,35 @@ +use topola::board::{mesadata::MesadataTrait, Board}; + +pub struct Layers { + visible: Box<[bool]>, +} + +impl Layers { + pub fn new(board: &Board) -> Self { + let layer_count = board.layout().drawing().layer_count(); + + Self { + visible: std::iter::repeat(true) + .take(layer_count.try_into().unwrap() /* FIXME */) + .collect::>() + .into_boxed_slice(), + } + } + + pub fn update(&mut self, ctx: &egui::Context, board: &Board) { + 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); + } + }); + } +} diff --git a/src/bin/topola-egui/main.rs b/src/bin/topola-egui/main.rs index 6ccf968..1a396fe 100644 --- a/src/bin/topola-egui/main.rs +++ b/src/bin/topola-egui/main.rs @@ -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; diff --git a/src/board/board.rs b/src/board/board.rs index be5236f..2c4b054 100644 --- a/src/board/board.rs +++ b/src/board/board.rs @@ -6,7 +6,6 @@ use crate::{ band::BandIndex, dot::{FixedDotIndex, FixedDotWeight}, graph::{GetLayer, GetMaybeNet, PrimitiveIndex}, - rules::RulesTrait, seg::{FixedSegIndex, FixedSegWeight}, Infringement, }, diff --git a/src/board/mesadata.rs b/src/board/mesadata.rs index 1e0b0f6..4b82f46 100644 --- a/src/board/mesadata.rs +++ b/src/board/mesadata.rs @@ -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>;