diff --git a/src/generate.rs b/src/generate.rs index babe5da..616e786 100644 --- a/src/generate.rs +++ b/src/generate.rs @@ -8,6 +8,7 @@ pub struct RenderOptions { pub width: usize, pub height: usize, pub unit_width: f64, + #[serde(alias = "iterations")] pub max_iter: u16, pub cx: f64, pub cy: f64, diff --git a/src/main.rs b/src/main.rs index 2ad86de..f5113b3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,20 +39,25 @@ fn main() { #[derive(Serialize, Deserialize)] struct JuliaGUI { color: (u8, u8, u8), + settings: RenderOptions, + export_res_power: u8, + #[serde(alias = "export_iterations")] + export_max_iter: u16, + preview_point: bool, + #[serde(default = "default_color_presets")] + color_presets: Vec<(String, (u8, u8, u8))>, #[serde(skip)] preview: Option, - settings: RenderOptions, #[serde(skip)] preview_render_ms: f64, #[serde(skip)] export_render_ms: Option, - export_res_power: u8, - export_max_iter: u16, #[serde(skip)] export_path: PathBuf, #[serde(skip)] settings_changed: bool, - preview_point: bool, + #[serde(skip)] + new_color_preset_name: String, #[serde(skip)] render_thread_handle: Option>, #[serde(skip)] @@ -63,6 +68,17 @@ struct JuliaGUI { waiting: bool, } +fn default_color_presets() -> Vec<(String, (u8, u8, u8))> { + vec![ + ("pink".into(), (8, 2, 6)), + ("blue".into(), (2, 4, 8)), + ("green".into(), (2, 8, 4)), + ("salmon".into(), (8, 4, 4)), + ("purple".into(), (5, 2, 11)), + ("yellow".into(), (9, 6, 1)), + ] +} + enum RenderJob { Render(PathBuf, RenderOptions, (u8, u8, u8)), Exit, @@ -72,13 +88,15 @@ impl Default for JuliaGUI { fn default() -> Self { Self { color: (12, 5, 10), + color_presets: default_color_presets(), + new_color_preset_name: String::new(), preview: None, settings: RenderOptions::default(), preview_render_ms: 0.0, export_render_ms: None, export_res_power: 3, export_max_iter: 512, - export_path: "".into(), + export_path: PathBuf::new(), settings_changed: true, preview_point: false, render_thread_handle: None, @@ -237,25 +255,20 @@ impl eframe::App for JuliaGUI { ui.horizontal(|ui| { ui.label("Colour (RGB)"); ui.menu_button("presets", |ui| { - if ui.button("pink").clicked() { - self.color = (8, 2, 6); - self.settings_changed = true; + let mut to_remove = None; + for (i, (name, col)) in self.color_presets.iter().enumerate() { + ui.horizontal(|ui| { + if ui.button(name).clicked() { + self.color = *col; + self.settings_changed = true; + } + if ui.button("x").clicked() { + to_remove = Some(i); + } + }); } - if ui.button("blue").clicked() { - self.color = (2, 4, 8); - self.settings_changed = true; - } - if ui.button("green").clicked() { - self.color = (2, 8, 4); - self.settings_changed = true; - } - if ui.button("salmon").clicked() { - self.color = (8, 4, 4); - self.settings_changed = true; - } - if ui.button("purple").clicked() { - self.color = (5, 2, 11); - self.settings_changed = true; + if let Some(i) = to_remove { + self.color_presets.remove(i); } if ui.button("randomise").clicked() { self.color = ( @@ -265,6 +278,13 @@ impl eframe::App for JuliaGUI { ); self.settings_changed = true; } + ui.horizontal(|ui| { + ui.text_edit_singleline(&mut self.new_color_preset_name); + if ui.button("add").clicked() { + self.color_presets + .push((self.new_color_preset_name.clone(), self.color)); + } + }) }); }); let set_red = ui.add(Slider::new(&mut self.color.0, 0..=16)); @@ -388,10 +408,10 @@ impl eframe::App for JuliaGUI { } fn on_exit(&mut self, _gl: Option<&eframe::glow::Context>) { + self.save_settings(); if let Some(channel) = &self.render_thread { channel.send(RenderJob::Exit).unwrap(); } self.render_thread_handle.take().unwrap().join().unwrap(); - self.save_settings(); } }