From 0522317349275355f492c89d999d1cb858c98b8b Mon Sep 17 00:00:00 2001 From: grimsace Date: Fri, 22 May 2026 11:41:32 -0500 Subject: [PATCH] file explorer fix --- Cargo.toml | 2 +- src/exporter/pipeline.rs | 33 +++++++++++++++++++++++++-------- src/saveandload.rs | 30 ++++++++++++++++++++++-------- src/ui/types.rs | 16 ++++++++-------- 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 88a28de..9477b76 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "desktop_dungeon_generator" -version = "0.8.0" +version = "0.8.1" edition = "2024" [dependencies] diff --git a/src/exporter/pipeline.rs b/src/exporter/pipeline.rs index 5f13fdc..b3ed671 100644 --- a/src/exporter/pipeline.rs +++ b/src/exporter/pipeline.rs @@ -30,11 +30,20 @@ pub fn select_export_target(settings: &UiSettings) -> Result Result, svgs: Vec, ) -> Result { - let path = FileDialog::new() + let dialog = FileDialog::new() .set_title("Save Dungeon State") .add_filter("Dungeon File", &["dungeon"]) - .set_file_name("my_dungeon.dungeon") - .save_file() - .ok_or_else(|| "Save canceled".to_string())?; + .set_file_name("my_dungeon.dungeon"); + + #[cfg(target_os = "windows")] + let path = std::thread::spawn(move || dialog.save_file()) + .join() + .map_err(|_| "Dialog thread panicked".to_string())?; + #[cfg(not(target_os = "windows"))] + let path = dialog.save_file(); + + let path = path.ok_or_else(|| "Save canceled".to_string())?; let save_data = DungeonSave { settings: settings.clone(), @@ -48,11 +55,18 @@ pub fn save_dungeon( // Loads dungeon state from a user-selected JSON file. pub fn load_dungeon() -> Result { - let path = FileDialog::new() + let dialog = FileDialog::new() .set_title("Load Dungeon State") - .add_filter("Dungeon File", &["dungeon"]) - .pick_file() - .ok_or_else(|| "Load canceled".to_string())?; + .add_filter("Dungeon File", &["dungeon"]); + + #[cfg(target_os = "windows")] + let path = std::thread::spawn(move || dialog.pick_file()) + .join() + .map_err(|_| "Dialog thread panicked".to_string())?; + #[cfg(not(target_os = "windows"))] + let path = dialog.pick_file(); + + let path = path.ok_or_else(|| "Load canceled".to_string())?; let content = fs::read_to_string(path).map_err(|e| format!("Failed to read file: {e}"))?; diff --git a/src/ui/types.rs b/src/ui/types.rs index 14766b3..13b9e19 100644 --- a/src/ui/types.rs +++ b/src/ui/types.rs @@ -53,11 +53,11 @@ impl ExportFormat { // Returns the user-facing label for this option. pub fn label(self) -> &'static str { match self { - ExportFormat::Png => ".png", - ExportFormat::Jpeg => ".jpeg", - ExportFormat::Webp => ".webp", - ExportFormat::Svg => ".svg", - ExportFormat::Folder => "Folder (Composite)", + ExportFormat::Png => "PNG Image", + ExportFormat::Jpeg => "JPEG Image", + ExportFormat::Webp => "WebP Image", + ExportFormat::Svg => "SVG Vector Graphic", + ExportFormat::Folder => "Folder", } } @@ -94,9 +94,9 @@ impl MaskFormat { // Returns the user-facing label for this option. pub fn label(self) -> &'static str { match self { - MaskFormat::Png => ".png", - MaskFormat::Jpeg => ".jpeg", - MaskFormat::Webp => ".webp", + MaskFormat::Png => "PNG Image", + MaskFormat::Jpeg => "JPEG Image", + MaskFormat::Webp => "WebP Image", } } }