mirror of https://codeberg.org/topola/topola.git
refactor(egui): move layer colors to `Config`
This commit is contained in:
parent
1fd61f773c
commit
4b16285143
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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>) {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue