URI: 
       Replaced rfd usage. - icy_draw - icy_draw is the successor to mystic draw. fork / mirror
  HTML git clone https://git.drkhsh.at/icy_draw.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 3144650a95f02d0087ce1eca107da2e524a863d8
   DIR parent 800a9e37ac84dbb8ee83f9642241d6362d536fd8
  HTML Author: Mike Krüger <mkrueger@posteo.de>
       Date:   Mon, 11 Sep 2023 19:58:39 +0200
       
       Replaced rfd usage.
       
       Diffstat:
         M src/ui/dialogs/export_file_dialog/… |      29 +++++++++++++++++++----------
         M src/ui/dialogs/open_file_dialog.rs  |       6 +++---
         M src/ui/dialogs/open_referenceimage… |       6 +++---
         M src/ui/dialogs/select_font_dialog.… |      41 +++++++++++++++++++++++--------
         M src/ui/messages.rs                  |      34 +++++++++++++++++++++++++++++--
       
       5 files changed, 88 insertions(+), 28 deletions(-)
       ---
   DIR diff --git a/src/ui/dialogs/export_file_dialog/mod.rs b/src/ui/dialogs/export_file_dialog/mod.rs
       @@ -3,6 +3,7 @@
        use std::path::PathBuf;
        
        use eframe::egui::{self, TextEdit, Ui};
       +use egui_file::FileDialog;
        use egui_modal::Modal;
        use i18n_embed_fl::fl;
        use icy_engine::{Rectangle, SaveOptions, TextPane};
       @@ -24,6 +25,7 @@ pub struct ExportFileDialog {
            pub should_commit: bool,
            pub file_name: PathBuf,
            save_options: SaveOptions,
       +    folder_dialog: Option<FileDialog>,
        }
        
        impl ExportFileDialog {
       @@ -35,12 +37,24 @@ impl ExportFileDialog {
                        _ => PathBuf::from("Untitled.ans"),
                    },
                    save_options: SaveOptions::new(),
       +            folder_dialog: None,
                }
            }
        }
        
        impl ModalDialog for ExportFileDialog {
            fn show(&mut self, ctx: &egui::Context) -> bool {
       +        if let Some(ed) = &mut self.folder_dialog {
       +            if ed.show(ctx).selected() {
       +                if let Some(res) = ed.path() {
       +                    self.file_name = res.to_path_buf();
       +                }
       +                self.folder_dialog = None
       +            } else {
       +                return false;
       +            }
       +        }
       +
                let mut result = false;
        
                let modal = Modal::new(ctx, "export_file-dialog");
       @@ -63,17 +77,12 @@ impl ModalDialog for ExportFileDialog {
                            }
        
                            if ui.add(egui::Button::new("…").wrap(false)).clicked() {
       -                        /* TODO: File Dialog
       -
       -                        let mut dialog = rfd::FileDialog::new();
       -                        if let Some(parent) = self.file_name.parent() {
       -                            dialog = dialog.set_directory(parent);
       -                        }
       -                        let res = dialog.pick_file();
       +                        let mut initial_path = None;
       +                        crate::set_default_initial_directory_opt(&mut initial_path);
       +                        let mut dialog = FileDialog::save_file(initial_path);
       +                        dialog.open();
       +                        self.folder_dialog = Some(dialog);
        
       -                        if let Some(file) = res {
       -                            self.file_name = file;
       -                        }*/
                                ui.close_menu();
                            }
                            if let Some(ext) = self.file_name.extension() {
   DIR diff --git a/src/ui/dialogs/open_file_dialog.rs b/src/ui/dialogs/open_file_dialog.rs
       @@ -10,9 +10,9 @@ pub struct OpenFileDialog {
            opened_file: Option<PathBuf>,
        }
        
       -impl Default for OpenFileDialog {
       -    fn default() -> Self {
       -        let mut dialog = FileDialog::open_file(None);
       +impl OpenFileDialog {
       +    pub fn new(initial_path: Option<PathBuf>) -> Self {
       +        let mut dialog = FileDialog::open_file(initial_path);
                dialog.open();
                Self {
                    open_file: false,
   DIR diff --git a/src/ui/dialogs/open_referenceimage_dialog.rs b/src/ui/dialogs/open_referenceimage_dialog.rs
       @@ -10,9 +10,9 @@ pub struct OpenReferenceImageDialog {
            opened_file: Option<PathBuf>,
        }
        
       -impl Default for OpenReferenceImageDialog {
       -    fn default() -> Self {
       -        let mut dialog = FileDialog::open_file(None);
       +impl OpenReferenceImageDialog {
       +    pub fn new(initial_path: Option<PathBuf>) -> Self {
       +        let mut dialog = FileDialog::open_file(initial_path);
                dialog.open();
                Self {
                    open_file: false,
   DIR diff --git a/src/ui/dialogs/select_font_dialog.rs b/src/ui/dialogs/select_font_dialog.rs
       @@ -1,4 +1,7 @@
       -use std::sync::{Arc, Mutex};
       +use std::{
       +    fs,
       +    sync::{Arc, Mutex},
       +};
        
        use eframe::{
            egui::{self, Response, Sense, TextEdit, TextStyle, WidgetText},
       @@ -7,6 +10,7 @@ use eframe::{
            },
        };
        use egui_extras::RetainedImage;
       +use egui_file::FileDialog;
        use egui_modal::Modal;
        use i18n_embed_fl::fl;
        use icy_engine::{editor::EditState, Buffer, Rectangle, Size, TextPane, TheDrawFont};
       @@ -23,6 +27,9 @@ pub struct SelectFontDialog {
            show_color: bool,
            show_block: bool,
        
       +    export_data: Option<Vec<u8>>,
       +    export_dialog: Option<FileDialog>,
       +
            image_cache: HashMap<usize, RetainedImage>,
        }
        
       @@ -40,6 +47,8 @@ impl SelectFontDialog {
                    show_color: true,
                    show_block: true,
                    image_cache: HashMap::default(),
       +            export_dialog: None,
       +            export_data: None,
                }
            }
        
       @@ -207,6 +216,21 @@ impl SelectFontDialog {
        
        impl crate::ModalDialog for SelectFontDialog {
            fn show(&mut self, ctx: &egui::Context) -> bool {
       +        if let Some(ed) = &mut self.export_dialog {
       +            if ed.show(ctx).selected() {
       +                if let Some(res) = ed.path() {
       +                    let mut res = res.to_path_buf();
       +                    res.set_extension("tdf");
       +                    if let Err(err) = fs::write(res, self.export_data.take().unwrap()) {
       +                        log::error!("Failed to write font: {}", err);
       +                    }
       +                }
       +                self.export_dialog = None
       +            } else {
       +                return false;
       +            }
       +        }
       +
                let mut result = false;
                let modal = Modal::new(ctx, "select_font_dialog2");
                let font_count = self.fonts.lock().unwrap().len();
       @@ -338,15 +362,12 @@ impl crate::ModalDialog for SelectFontDialog {
                        {
                            match self.fonts.lock().unwrap()[self.selected_font as usize].as_tdf_bytes() {
                                Ok(data) => {
       -                            /* TODO: File dialog
       -                            let dialog = rfd::FileDialog::new();
       -                            let res = dialog.save_file();
       -                            if let Some(mut res) = res {
       -                                res.set_extension("tdf");
       -                                if let Err(err) = fs::write(res, data) {
       -                                    log::error!("Failed to write font: {}", err);
       -                                }
       -                            }*/
       +                            let mut initial_path = None;
       +                            crate::set_default_initial_directory_opt(&mut initial_path);
       +                            let mut dialog = FileDialog::save_file(initial_path);
       +                            dialog.open();
       +                            self.export_data = Some(data);
       +                            self.export_dialog = Some(dialog);
                                }
                                Err(err) => {
                                    log::error!("Failed to export font: {}", err);
   DIR diff --git a/src/ui/messages.rs b/src/ui/messages.rs
       @@ -5,6 +5,7 @@ use std::{
            sync::{Arc, Mutex},
        };
        
       +use directories::UserDirs;
        use eframe::{
            egui::{self},
            epaint::Vec2,
       @@ -143,7 +144,13 @@ impl MainWindow {
                        self.open_dialog(NewFileDialog::default());
                    }
                    Message::OpenFileDialog => {
       -                self.open_dialog(OpenFileDialog::default());
       +                let mut initial_directory = if let Some(d) = self.get_active_pane() {
       +                    d.get_path()
       +                } else {
       +                    None
       +                };
       +                set_default_initial_directory_opt(&mut initial_directory);
       +                self.open_dialog(OpenFileDialog::new(initial_directory));
                    }
        
                    Message::TryLoadFile(path) => {
       @@ -677,7 +684,19 @@ impl MainWindow {
        
                    Message::SetReferenceImage => {
                        self.run_editor_command(0, |window, editor, _| {
       -                    window.open_dialog(crate::OpenReferenceImageDialog::default()/*new(editor.buffer_view.lock().clear_reference_image())*/);
       +                    let mut initial_directory =
       +                        if let Some(d) = editor.buffer_view.lock().get_reference_image_path() {
       +                            if let Some(p) = d.parent() {
       +                                Some(p.to_path_buf())
       +                            } else {
       +                                None
       +                            }
       +                        } else {
       +                            None
       +                        };
       +                    set_default_initial_directory_opt(&mut initial_directory);
       +
       +                    window.open_dialog(crate::OpenReferenceImageDialog::new(initial_directory));
                            None
                        });
                    }
       @@ -856,6 +875,17 @@ impl MainWindow {
            }
        }
        
       +pub fn set_default_initial_directory_opt(initial_directory: &mut Option<PathBuf>) {
       +    if initial_directory.is_some() {
       +        return;
       +    }
       +    *initial_directory = if let Some(user) = UserDirs::new() {
       +        Some(user.home_dir().to_path_buf())
       +    } else {
       +        Some(std::env::current_dir().unwrap())
       +    };
       +}
       +
        pub fn to_message<T>(result: EngineResult<T>) -> Option<Message> {
            if let Err(result) = result {
                Some(Message::ShowError(format!("{result}")))