diff --git a/src/main.rs b/src/main.rs index 722dc54..61b680c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -141,19 +141,21 @@ impl eframe::App for DungeonApp { self.push_undo_snapshot(); self.regenerate_layout(); } else if panel_result.save_clicked { - if self.settings.active_level_index < self.levels.len() { - let layout = &self.levels[self.settings.active_level_index]; - let svg = exporter::build_svg(layout, &self.settings); - if let Err(err) = saveandload::save_dungeon(&self.settings, layout, svg) { - eprintln!("{err}"); - } + let mut layouts = Vec::new(); + let mut svgs = Vec::new(); + for layout in &self.levels { + layouts.push(layout.clone()); + svgs.push(exporter::build_svg(layout, &self.settings)); + } + if let Err(err) = saveandload::save_dungeon(&self.settings, layouts, svgs) { + eprintln!("{err}"); } } else if panel_result.load_clicked { match saveandload::load_dungeon() { Ok(data) => { self.push_undo_snapshot(); self.settings = data.settings; - self.levels = vec![data.layout]; + self.levels = data.layouts; self.settings.active_level_index = 0; // Don't regenerate_layout() here to preserve the exact loaded state. } diff --git a/src/saveandload.rs b/src/saveandload.rs index 63e8080..b64f90c 100644 --- a/src/saveandload.rs +++ b/src/saveandload.rs @@ -9,14 +9,14 @@ use crate::ui::UiSettings; #[derive(Serialize, Deserialize)] pub struct DungeonSave { pub settings: UiSettings, - pub layout: DungeonLayout, - pub svg: String, + pub layouts: Vec, + pub svgs: Vec, } pub fn save_dungeon( settings: &UiSettings, - layout: &DungeonLayout, - svg: String, + layouts: Vec, + svgs: Vec, ) -> Result { let path = FileDialog::new() .set_title("Save Dungeon State") @@ -27,8 +27,8 @@ pub fn save_dungeon( let save_data = DungeonSave { settings: settings.clone(), - layout: layout.clone(), - svg, + layouts, + svgs, }; let json = serde_json::to_string_pretty(&save_data)