maps 1.10.1

Inspect, compare and align multiple grid maps in an intuitive & fast GUI
Documentation
use std::io::Cursor;
use std::sync::{Arc, Mutex};

use image::{DynamicImage, ImageFormat};
use rfd::AsyncFileDialog;

use crate::wasm::async_data::AsyncData;

#[cfg(target_arch = "wasm32")]
pub fn pick_save_png(data: Arc<Mutex<AsyncData>>, image_name: String, image: DynamicImage) {
    let dialog = AsyncFileDialog::new()
        .set_title("Save image file:")
        .add_filter("PNG", &["png"])
        .set_file_name(image_name.as_str());

    let future = dialog.save_file();

    wasm_bindgen_futures::spawn_local(async move {
        if data.try_lock().is_err() {
            return;
        }

        let Some(file_handle) = future.await else {
            return;
        };

        let result = {
            let mut buf = Vec::new();
            match image.write_to(&mut Cursor::new(&mut buf), ImageFormat::Png) {
                Ok(_) => match file_handle.write(&buf).await {
                    Ok(_) => Ok(()),
                    Err(e) => Err(format!("Saving image file {image_name}: {e}")),
                },
                Err(e) => Err(format!("Encoding image {image_name}: {e}")),
            }
        };
        if let Err(err_msg) = result
            && let Ok(mut locked_data) = data.try_lock()
        {
            locked_data.error.clone_from(&err_msg);
        }
    });
}