diff --git a/petri/src/lib.rs b/petri/src/lib.rs index 63f5501..686c795 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, Clone, 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..1b47900 100644 --- a/uscope/src/main.rs +++ b/uscope/src/main.rs @@ -174,19 +174,30 @@ 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::default()); + self.dish.rules.push(Rule::new()); } }); });