Compare commits

...

2 commits

Author SHA1 Message Date
3d9fd8d311 add rule copy button 2024-05-04 11:22:18 +02:00
e2869af4a7 fix default new rule 2024-05-03 23:56:39 +02:00
2 changed files with 32 additions and 13 deletions

View file

@ -18,8 +18,10 @@ pub struct Chunk {
pub contents: Box<[[Cell; CHUNK_SIZE]; CHUNK_SIZE]>, pub contents: Box<[[Cell; CHUNK_SIZE]; CHUNK_SIZE]>,
} }
#[derive(Debug, Default, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Rule { pub struct Rule {
#[serde(default)]
pub name: String,
base: SubRule, base: SubRule,
#[serde(skip)] #[serde(skip)]
variants: Vec<SubRule>, variants: Vec<SubRule>,
@ -61,12 +63,6 @@ pub enum RuleCellTo {
Copy(usize), Copy(usize),
} }
impl std::default::Default for SubRule {
fn default() -> Self {
Self::new()
}
}
impl SubRule { impl SubRule {
fn new() -> Self { fn new() -> Self {
Self { Self {
@ -119,6 +115,18 @@ impl Rule {
pub const SHRINK_UP: ResizeParam = (0, -1, 0, 1); pub const SHRINK_UP: ResizeParam = (0, -1, 0, 1);
pub const SHRINK_DOWN: ResizeParam = (0, -1, 0, 0); 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) { pub fn get(&self, x: usize, y: usize) -> (RuleCellFrom, RuleCellTo) {
self.base.get(x, y) self.base.get(x, y)
} }
@ -280,7 +288,7 @@ impl Dish {
(RuleCellFrom::One(Cell(0)), RuleCellTo::One(Cell(1))), (RuleCellFrom::One(Cell(0)), RuleCellTo::One(Cell(1))),
], ],
}, },
..Rule::default() ..Rule::new()
}, },
Rule { Rule {
enabled: true, enabled: true,
@ -295,7 +303,7 @@ impl Dish {
], ],
}, },
flip_h: true, flip_h: true,
..Rule::default() ..Rule::new()
}, },
]; ];

View file

@ -174,19 +174,30 @@ impl eframe::App for UScope {
ui.heading("Rules"); ui.heading("Rules");
let mut to_remove = None; let mut to_remove = None;
let mut to_clone = None;
for (i, rule) in self.dish.rules.iter_mut().enumerate() { for (i, rule) in self.dish.rules.iter_mut().enumerate() {
ui.separator(); ui.separator();
rule_editor(ui, rule, &self.cell_types, &self.dish.cell_groups); rule_editor(ui, rule, &self.cell_types, &self.dish.cell_groups);
if ui.button("delete").clicked() { ui.horizontal(|ui| {
to_remove = Some(i); if ui.button("delete").clicked() {
} to_remove = Some(i);
}
if ui.button("copy").clicked() {
to_clone = Some(i);
}
});
} }
if let Some(i) = to_remove { if let Some(i) = to_remove {
self.dish.rules.remove(i); 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(); ui.separator();
if ui.button("add rule").clicked() { if ui.button("add rule").clicked() {
self.dish.rules.push(Rule::default()); self.dish.rules.push(Rule::new());
} }
}); });
}); });