refactor(egui): move layer colors to `Config`

This commit is contained in:
Mikolaj Wielgus 2024-12-08 16:56:35 +01:00
parent 1fd61f773c
commit 4b16285143
6 changed files with 115 additions and 72 deletions

View File

@ -209,17 +209,20 @@ impl eframe::App for App {
.and_then(|w| w.interactor.maybe_activity().as_ref()), .and_then(|w| w.interactor.maybe_activity().as_ref()),
); );
if self.menu_bar.show_layer_manager { if self.menu_bar.show_appearance_panel {
if let Some(workspace) = &mut self.maybe_workspace { if let Some(workspace) = &mut self.maybe_workspace {
workspace.update_layers(ctx); workspace.update_appearance_panel(ctx);
} }
} }
self.error_dialog.update(ctx, &self.translator); self.error_dialog.update(ctx, &self.translator);
let _viewport_rect = let _viewport_rect = self.viewport.update(
self.viewport &self.config,
.update(ctx, &self.menu_bar, self.maybe_workspace.as_mut()); ctx,
&self.menu_bar,
self.maybe_workspace.as_mut(),
);
self.update_locale(); self.update_locale();
self.update_title(ctx); self.update_title(ctx);

View File

@ -5,8 +5,6 @@ pub struct AppearancePanel {
// In1.Cu shall be #7fc87f (#d5ecd5 when selected). // In1.Cu shall be #7fc87f (#d5ecd5 when selected).
// In2.Cu shall be #ce7d2c (#e8c39e when selected). // In2.Cu shall be #ce7d2c (#e8c39e when selected).
pub visible: Box<[bool]>, pub visible: Box<[bool]>,
pub colors: Box<[egui::Color32]>,
pub highlight_colors: Box<[egui::Color32]>,
} }
impl AppearancePanel { impl AppearancePanel {
@ -16,53 +14,7 @@ impl AppearancePanel {
.take(layer_count) .take(layer_count)
.collect::<Vec<_>>() .collect::<Vec<_>>()
.into_boxed_slice(); .into_boxed_slice();
Self { visible }
let colors = std::iter::repeat(egui::Color32::from_rgb(255, 255, 255))
.enumerate()
.map(|(i, color)| {
let layername = board.mesadata().layer_layername(i);
if matches!(layername, Some("F.Cu") | Some("1")) {
egui::Color32::from_rgb(255, 52, 52)
} else if matches!(layername, Some("B.Cu") | Some("2")) {
egui::Color32::from_rgb(52, 52, 255)
} else if matches!(layername, Some("In1.Cu")) {
egui::Color32::from_rgb(127, 200, 127)
} else if matches!(layername, Some("In2.Cu")) {
egui::Color32::from_rgb(206, 125, 44)
} else {
color
}
})
.take(layer_count)
.collect::<Vec<_>>()
.into_boxed_slice();
let highlight_colors = std::iter::repeat(egui::Color32::from_rgb(255, 255, 255))
.enumerate()
.map(|(i, color)| {
let layername = board.mesadata().layer_layername(i);
if matches!(layername, Some("F.Cu") | Some("1")) {
egui::Color32::from_rgb(255, 100, 100)
} else if matches!(layername, Some("B.Cu") | Some("2")) {
egui::Color32::from_rgb(100, 100, 255)
} else if matches!(layername, Some("In1.Cu")) {
egui::Color32::from_rgb(213, 236, 213)
} else if matches!(layername, Some("In2.Cu")) {
egui::Color32::from_rgb(232, 195, 158)
} else {
color
}
})
.take(layer_count)
.collect::<Vec<_>>()
.into_boxed_slice();
Self {
visible,
colors,
highlight_colors,
}
} }
pub fn update(&mut self, ctx: &egui::Context, board: &Board<impl AccessMesadata>) { pub fn update(&mut self, ctx: &egui::Context, board: &Board<impl AccessMesadata>) {

View File

@ -1,9 +1,95 @@
use std::collections::HashMap;
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(default)] #[serde(default)]
pub struct Config {} pub struct Config {
pub dark_theme: Colors,
pub light_theme: Colors,
}
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct Colors {
pub layers: LayerColors,
}
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct LayerColors {
default: LayerColor,
colors: HashMap<String, LayerColor>,
}
impl LayerColors {
pub fn color(&self, layername: Option<&str>) -> &LayerColor {
layername
.and_then(|layername| Some(self.colors.get(layername).unwrap_or(&self.default)))
.unwrap_or(&self.default)
}
}
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct LayerColor {
pub normal: egui::Color32,
pub highlighted: egui::Color32,
}
impl Default for Config { impl Default for Config {
fn default() -> Self { fn default() -> Self {
Self {} let dark_theme = Colors {
layers: LayerColors {
default: LayerColor {
normal: egui::Color32::from_rgb(255, 255, 255),
highlighted: egui::Color32::from_rgb(255, 255, 255),
},
colors: HashMap::from([
(
"F.Cu".to_string(),
LayerColor {
normal: egui::Color32::from_rgb(255, 52, 52),
highlighted: egui::Color32::from_rgb(255, 100, 100),
},
),
(
"1".to_string(),
LayerColor {
normal: egui::Color32::from_rgb(255, 52, 52),
highlighted: egui::Color32::from_rgb(255, 100, 100),
},
),
(
"B.Cu".to_string(),
LayerColor {
normal: egui::Color32::from_rgb(52, 52, 255),
highlighted: egui::Color32::from_rgb(100, 100, 255),
},
),
(
"2".to_string(),
LayerColor {
normal: egui::Color32::from_rgb(52, 52, 255),
highlighted: egui::Color32::from_rgb(100, 100, 255),
},
),
(
"In1.Cu".to_string(),
LayerColor {
normal: egui::Color32::from_rgb(127, 200, 127),
highlighted: egui::Color32::from_rgb(213, 236, 213),
},
),
(
"In2.Cu".to_string(),
LayerColor {
normal: egui::Color32::from_rgb(206, 125, 44),
highlighted: egui::Color32::from_rgb(232, 195, 158),
},
),
]),
},
};
Self {
dark_theme: dark_theme.clone(),
light_theme: dark_theme,
}
} }
} }

View File

@ -26,7 +26,7 @@ pub struct MenuBar {
pub show_navmesh: bool, pub show_navmesh: bool,
pub show_bboxes: bool, pub show_bboxes: bool,
pub show_origin_destination: bool, pub show_origin_destination: bool,
pub show_layer_manager: bool, pub show_appearance_panel: bool,
pub frame_timestep: f32, pub frame_timestep: f32,
} }
@ -46,7 +46,7 @@ impl MenuBar {
show_navmesh: false, show_navmesh: false,
show_bboxes: false, show_bboxes: false,
show_origin_destination: false, show_origin_destination: false,
show_layer_manager: true, show_appearance_panel: true,
frame_timestep: 0.1, frame_timestep: 0.1,
} }
} }
@ -359,7 +359,7 @@ impl MenuBar {
ui.separator(); ui.separator();
ui.checkbox( ui.checkbox(
&mut self.show_layer_manager, &mut self.show_appearance_panel,
tr.text("tr-menu-view-show-layer-manager"), tr.text("tr-menu-view-show-layer-manager"),
); );

View File

@ -9,6 +9,7 @@ use topola::{
execution::Command, execution::Command,
invoker::{GetGhosts, GetMaybeNavcord, GetMaybeNavmesh, GetObstacles, Invoker}, invoker::{GetGhosts, GetMaybeNavcord, GetMaybeNavmesh, GetObstacles, Invoker},
}, },
board::mesadata::AccessMesadata,
drawing::{ drawing::{
graph::{MakePrimitive, PrimitiveIndex}, graph::{MakePrimitive, PrimitiveIndex},
primitive::MakePrimitiveShape, primitive::MakePrimitiveShape,
@ -19,7 +20,7 @@ use topola::{
specctra::mesadata::SpecctraMesadata, specctra::mesadata::SpecctraMesadata,
}; };
use crate::{menu_bar::MenuBar, painter::Painter, workspace::Workspace}; use crate::{config::Config, menu_bar::MenuBar, painter::Painter, workspace::Workspace};
pub struct Viewport { pub struct Viewport {
pub transform: egui::emath::TSTransform, pub transform: egui::emath::TSTransform,
@ -36,6 +37,7 @@ impl Viewport {
pub fn update( pub fn update(
&mut self, &mut self,
config: &Config,
ctx: &egui::Context, ctx: &egui::Context,
menu_bar: &MenuBar, menu_bar: &MenuBar,
maybe_workspace: Option<&mut Workspace>, maybe_workspace: Option<&mut Workspace>,
@ -56,7 +58,7 @@ impl Viewport {
let mut painter = Painter::new(ui, self.transform, menu_bar.show_bboxes); let mut painter = Painter::new(ui, self.transform, menu_bar.show_bboxes);
if let Some(workspace) = maybe_workspace { if let Some(workspace) = maybe_workspace {
let layers = &mut workspace.layers; let layers = &mut workspace.appearance_panel;
let overlay = &mut workspace.overlay; let overlay = &mut workspace.overlay;
if ctx.input(|i| i.pointer.any_click()) { if ctx.input(|i| i.pointer.any_click()) {
@ -91,15 +93,15 @@ impl Viewport {
.selection() .selection()
.contains_node(board, GenericNode::Primitive(primitive)) .contains_node(board, GenericNode::Primitive(primitive))
{ {
layers.highlight_colors[i] config.dark_theme.layers.color(board.layout().rules().layer_layername(i)).highlighted
} else if let Some(activity) = &mut workspace.interactor.maybe_activity() { } else if let Some(activity) = &mut workspace.interactor.maybe_activity() {
if activity.obstacles().contains(&primitive) { if activity.obstacles().contains(&primitive) {
layers.highlight_colors[i] config.dark_theme.layers.color(board.layout().rules().layer_layername(i)).highlighted
} else { } else {
layers.colors[i] config.dark_theme.layers.color(board.layout().rules().layer_layername(i)).normal
} }
} else { } else {
layers.colors[i] config.dark_theme.layers.color(board.layout().rules().layer_layername(i)).normal
}; };
painter.paint_primitive(&shape, color); painter.paint_primitive(&shape, color);
@ -110,9 +112,9 @@ impl Viewport {
.selection() .selection()
.contains_node(board, GenericNode::Compound(poly.into())) .contains_node(board, GenericNode::Compound(poly.into()))
{ {
layers.highlight_colors[i] config.dark_theme.layers.color(board.layout().rules().layer_layername(i)).highlighted
} else { } else {
layers.colors[i] config.dark_theme.layers.color(board.layout().rules().layer_layername(i)).normal
}; };
painter.paint_polygon(&board.layout().poly(poly).shape().polygon, color) painter.paint_polygon(&board.layout().poly(poly).shape().polygon, color)

View File

@ -22,7 +22,7 @@ use crate::{
/// A loaded design and associated structures /// A loaded design and associated structures
pub struct Workspace { pub struct Workspace {
pub design: SpecctraDesign, pub design: SpecctraDesign,
pub layers: AppearancePanel, pub appearance_panel: AppearancePanel,
pub overlay: Overlay, pub overlay: Overlay,
pub interactor: Interactor<SpecctraMesadata>, pub interactor: Interactor<SpecctraMesadata>,
@ -35,7 +35,7 @@ pub struct Workspace {
impl Workspace { impl Workspace {
pub fn new(design: SpecctraDesign, tr: &Translator) -> Result<Self, String> { pub fn new(design: SpecctraDesign, tr: &Translator) -> Result<Self, String> {
let board = design.make_board(&mut LayoutEdit::new()); let board = design.make_board(&mut LayoutEdit::new());
let layers = AppearancePanel::new(&board); let appearance_panel = AppearancePanel::new(&board);
let overlay = Overlay::new(&board).map_err(|err| { let overlay = Overlay::new(&board).map_err(|err| {
format!( format!(
"{}; {}", "{}; {}",
@ -45,7 +45,7 @@ impl Workspace {
})?; })?;
Ok(Self { Ok(Self {
design, design,
layers, appearance_panel,
overlay, overlay,
interactor: Interactor::new(board).map_err(|err| { interactor: Interactor::new(board).map_err(|err| {
format!( format!(
@ -98,8 +98,8 @@ impl Workspace {
} }
} }
pub fn update_layers(&mut self, ctx: &egui::Context) { pub fn update_appearance_panel(&mut self, ctx: &egui::Context) {
self.layers self.appearance_panel
.update(ctx, self.interactor.invoker().autorouter().board()); .update(ctx, self.interactor.invoker().autorouter().board());
} }
} }