From e2869af4a7a877da69cad7c03f304e7d44b3fedf Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Fri, 3 May 2024 23:56:39 +0200 Subject: [PATCH 1/2] fix default new rule --- petri/src/lib.rs | 26 +++++++++++++++++--------- uscope/src/main.rs | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/petri/src/lib.rs b/petri/src/lib.rs index 63f5501..e4ef5f3 100644 --- a/petri/src/lib.rs +++ b/petri/src/lib.rs @@ -18,8 +18,10 @@ pub struct Chunk { pub contents: Box<[[Cell; CHUNK_SIZE]; CHUNK_SIZE]>, } -#[derive(Debug, Default, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct Rule { + #[serde(default)] + pub name: String, base: SubRule, #[serde(skip)] variants: Vec, @@ -61,12 +63,6 @@ pub enum RuleCellTo { Copy(usize), } -impl std::default::Default for SubRule { - fn default() -> Self { - Self::new() - } -} - impl SubRule { fn new() -> Self { Self { @@ -119,6 +115,18 @@ impl Rule { pub const SHRINK_UP: ResizeParam = (0, -1, 0, 1); pub const SHRINK_DOWN: ResizeParam = (0, -1, 0, 0); + pub fn new() -> Self { + Self { + name: "new rule".into(), + enabled: false, + base: SubRule::new(), + variants: vec![SubRule::new()], + flip_h: false, + flip_v: false, + rotate: false, + } + } + pub fn get(&self, x: usize, y: usize) -> (RuleCellFrom, RuleCellTo) { self.base.get(x, y) } @@ -280,7 +288,7 @@ impl Dish { (RuleCellFrom::One(Cell(0)), RuleCellTo::One(Cell(1))), ], }, - ..Rule::default() + ..Rule::new() }, Rule { enabled: true, @@ -295,7 +303,7 @@ impl Dish { ], }, flip_h: true, - ..Rule::default() + ..Rule::new() }, ]; diff --git a/uscope/src/main.rs b/uscope/src/main.rs index f36c2b6..8b5e991 100644 --- a/uscope/src/main.rs +++ b/uscope/src/main.rs @@ -186,7 +186,7 @@ impl eframe::App for UScope { } ui.separator(); if ui.button("add rule").clicked() { - self.dish.rules.push(Rule::default()); + self.dish.rules.push(Rule::new()); } }); }); From 3d9fd8d311dbba5c4f4d88c830a6e3237a836219 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Sat, 4 May 2024 11:22:18 +0200 Subject: [PATCH 2/2] add rule copy button --- petri/src/lib.rs | 2 +- uscope/src/main.rs | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/petri/src/lib.rs b/petri/src/lib.rs index e4ef5f3..686c795 100644 --- a/petri/src/lib.rs +++ b/petri/src/lib.rs @@ -18,7 +18,7 @@ pub struct Chunk { pub contents: Box<[[Cell; CHUNK_SIZE]; CHUNK_SIZE]>, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Rule { #[serde(default)] pub name: String, diff --git a/uscope/src/main.rs b/uscope/src/main.rs index 8b5e991..1b47900 100644 --- a/uscope/src/main.rs +++ b/uscope/src/main.rs @@ -174,16 +174,27 @@ impl eframe::App for UScope { ui.heading("Rules"); let mut to_remove = None; + let mut to_clone = None; for (i, rule) in self.dish.rules.iter_mut().enumerate() { ui.separator(); rule_editor(ui, rule, &self.cell_types, &self.dish.cell_groups); - if ui.button("delete").clicked() { - to_remove = Some(i); - } + ui.horizontal(|ui| { + if ui.button("delete").clicked() { + to_remove = Some(i); + } + if ui.button("copy").clicked() { + to_clone = Some(i); + } + }); } if let Some(i) = to_remove { self.dish.rules.remove(i); } + if let Some(i) = to_clone { + let mut new_rule = self.dish.rules[i].clone(); + new_rule.enabled = false; + self.dish.rules.push(new_rule); + } ui.separator(); if ui.button("add rule").clicked() { self.dish.rules.push(Rule::new());