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)]
|
#[derive(Debug, Default)]
|
||||||
struct SharedData {
|
struct SharedData {
|
||||||
|
|
@ -76,6 +76,9 @@ pub struct App {
|
||||||
|
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
show_ratsnest: bool,
|
show_ratsnest: bool,
|
||||||
|
|
||||||
|
#[serde(skip)]
|
||||||
|
layers: Option<Layers>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for App {
|
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),
|
from_rect: egui::Rect::from_x_y_ranges(0.0..=1000000.0, 0.0..=500000.0),
|
||||||
is_placing_via: false,
|
is_placing_via: false,
|
||||||
show_ratsnest: true,
|
show_ratsnest: true,
|
||||||
|
layers: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -169,6 +173,7 @@ impl eframe::App for App {
|
||||||
let design = DsnDesign::load_from_string(file_contents).unwrap();
|
let design = DsnDesign::load_from_string(file_contents).unwrap();
|
||||||
let board = design.make_board();
|
let board = design.make_board();
|
||||||
self.overlay = Some(Overlay::new(&board).unwrap());
|
self.overlay = Some(Overlay::new(&board).unwrap());
|
||||||
|
self.layers = Some(Layers::new(&board));
|
||||||
self.invoker = Some(Arc::new(Mutex::new(Invoker::new(
|
self.invoker = Some(Arc::new(Mutex::new(Invoker::new(
|
||||||
Autorouter::new(board).unwrap(),
|
Autorouter::new(board).unwrap(),
|
||||||
))));
|
))));
|
||||||
|
|
@ -178,6 +183,7 @@ impl eframe::App for App {
|
||||||
let design = DsnDesign::load_from_file(&path).unwrap();
|
let design = DsnDesign::load_from_file(&path).unwrap();
|
||||||
let board = design.make_board();
|
let board = design.make_board();
|
||||||
self.overlay = Some(Overlay::new(&board).unwrap());
|
self.overlay = Some(Overlay::new(&board).unwrap());
|
||||||
|
self.layers = Some(Layers::new(&board));
|
||||||
self.invoker = Some(Arc::new(Mutex::new(Invoker::new(
|
self.invoker = Some(Arc::new(Mutex::new(Invoker::new(
|
||||||
Autorouter::new(board).unwrap(),
|
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::CentralPanel::default().show(ctx, |ui| {
|
||||||
egui::Frame::canvas(ui.style()).show(ui, |ui| {
|
egui::Frame::canvas(ui.style()).show(ui, |ui| {
|
||||||
ui.ctx().request_repaint();
|
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
|
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
|
||||||
|
|
||||||
mod app;
|
mod app;
|
||||||
|
mod layers;
|
||||||
mod overlay;
|
mod overlay;
|
||||||
mod painter;
|
mod painter;
|
||||||
use app::App;
|
use app::App;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ use crate::{
|
||||||
band::BandIndex,
|
band::BandIndex,
|
||||||
dot::{FixedDotIndex, FixedDotWeight},
|
dot::{FixedDotIndex, FixedDotWeight},
|
||||||
graph::{GetLayer, GetMaybeNet, PrimitiveIndex},
|
graph::{GetLayer, GetMaybeNet, PrimitiveIndex},
|
||||||
rules::RulesTrait,
|
|
||||||
seg::{FixedSegIndex, FixedSegWeight},
|
seg::{FixedSegIndex, FixedSegWeight},
|
||||||
Infringement,
|
Infringement,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
use crate::{drawing::rules::RulesTrait, layout::NodeIndex};
|
use crate::{drawing::rules::RulesTrait, layout::NodeIndex};
|
||||||
|
|
||||||
// TODO: use this trait.
|
|
||||||
pub trait MesadataTrait: RulesTrait {
|
pub trait MesadataTrait: RulesTrait {
|
||||||
fn bename_layer(&mut self, layer: u64, layername: String);
|
fn bename_layer(&mut self, layer: u64, layername: String);
|
||||||
fn layer_layername(&self, layer: u64) -> Option<&str>;
|
fn layer_layername(&self, layer: u64) -> Option<&str>;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue