URI: 
       Track API changes. - 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 126a0c2d1b57582693b3ca2dadbd9d5a2664b3f1
   DIR parent 5374eca1b509b4b1daa4c92f04d4223fabaeddfc
  HTML Author: Mike Krüger <mkrueger@posteo.de>
       Date:   Tue,  5 Sep 2023 11:57:46 +0200
       
       Track API changes.
       
       Diffstat:
         M src/ui/dialogs/edit_sauce_dialog.rs |      45 +++++++++++---------------------
         M src/ui/dialogs/export_file_dialog/… |     100 ++++++++++++++++----------------
         M src/ui/dialogs/export_file_dialog/… |      12 +++++-------
         M src/ui/dialogs/export_file_dialog/… |      79 +++++++++++++++----------------
         M src/ui/dialogs/export_file_dialog/… |     113 ++++++++++++++-----------------
         M src/ui/editor/ansi/mod.rs           |       2 +-
       
       6 files changed, 161 insertions(+), 190 deletions(-)
       ---
   DIR diff --git a/src/ui/dialogs/edit_sauce_dialog.rs b/src/ui/dialogs/edit_sauce_dialog.rs
       @@ -1,30 +1,20 @@
        use eframe::egui::{self, Layout};
        use egui_modal::Modal;
        use i18n_embed_fl::fl;
       -use icy_engine::SauceString;
       +use icy_engine::{SauceString, SauceData};
        
        use crate::{AnsiEditor, Message, ModalDialog, TerminalResult};
        
        pub struct EditSauceDialog {
            pub should_commit: bool,
       -    pub title: SauceString<35, b' '>,
       -    pub author: SauceString<20, b' '>,
       -    pub group: SauceString<20, b' '>,
       -    pub comments: Vec<SauceString<64, 0>>,
       -    pub use_letter_spacing: bool,
       -    pub use_aspect_ratio: bool,
       +    pub sauce_data: SauceData
        }
        
        impl EditSauceDialog {
            pub fn new(buf: &icy_engine::Buffer) -> Self {
                EditSauceDialog {
                    should_commit: false,
       -            title: buf.title.clone(),
       -            author: buf.author.clone(),
       -            group: buf.group.clone(),
       -            comments: buf.comments.clone(),
       -            use_letter_spacing: buf.use_letter_spacing,
       -            use_aspect_ratio: buf.use_aspect_ratio,
       +            sauce_data: buf.sauce_data.clone().unwrap_or_default(),
                }
            }
        }
       @@ -46,9 +36,9 @@ impl ModalDialog for EditSauceDialog {
                                    ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-title-label"));
                                });
                                ui.horizontal(|ui| {
       -                            let mut tmp_str = self.title.to_string();
       +                            let mut tmp_str = self.sauce_data.title.to_string();
                                    ui.add(egui::TextEdit::singleline(&mut tmp_str).char_limit(35));
       -                            self.title = SauceString::from(&tmp_str);
       +                            self.sauce_data.title = SauceString::from(&tmp_str);
                                    ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-title-label-length"));
                                });
                                ui.end_row();
       @@ -58,9 +48,9 @@ impl ModalDialog for EditSauceDialog {
                                });
        
                                ui.horizontal(|ui| {
       -                            let mut tmp_str = self.author.to_string();
       +                            let mut tmp_str = self.sauce_data.author.to_string();
                                    ui.add(egui::TextEdit::singleline(&mut tmp_str).char_limit(20));
       -                            self.author = SauceString::from(&tmp_str);
       +                            self.sauce_data.author = SauceString::from(&tmp_str);
                                    ui.label(fl!(
                                        crate::LANGUAGE_LOADER,
                                        "edit-sauce-author-label-length"
       @@ -72,9 +62,9 @@ impl ModalDialog for EditSauceDialog {
                                    ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-group-label"));
                                });
                                ui.horizontal(|ui| {
       -                            let mut tmp_str = self.group.to_string();
       +                            let mut tmp_str = self.sauce_data.group.to_string();
                                    ui.add(egui::TextEdit::singleline(&mut tmp_str).char_limit(20));
       -                            self.group = SauceString::from(&tmp_str);
       +                            self.sauce_data.group = SauceString::from(&tmp_str);
                                    ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-group-label-length"));
                                });
                                ui.end_row();
       @@ -83,7 +73,7 @@ impl ModalDialog for EditSauceDialog {
                                    ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-letter-spacing"));
                                });
                                ui.horizontal(|ui| {
       -                            ui.checkbox(&mut self.use_letter_spacing, "");
       +                            ui.checkbox(&mut self.sauce_data.use_letter_spacing, "");
                                });
                                ui.end_row();
        
       @@ -91,7 +81,7 @@ impl ModalDialog for EditSauceDialog {
                                    ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-aspect-ratio"));
                                });
                                ui.horizontal(|ui| {
       -                            ui.checkbox(&mut self.use_aspect_ratio, "");
       +                            ui.checkbox(&mut self.sauce_data.use_aspect_ratio, "");
                                });
                                ui.end_row();
                            });
       @@ -99,11 +89,11 @@ impl ModalDialog for EditSauceDialog {
                        ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-comments-label"));
                        ui.add_space(4.0);
                        let mut tmp_str = String::new();
       -                for s in &self.comments {
       +                for s in &self.sauce_data.comments {
                            tmp_str.push_str(&s.to_string());
                            tmp_str.push('\n');
                        }
       -                self.comments.clear();
       +                self.sauce_data.comments.clear();
                        egui::ScrollArea::vertical()
                            .max_height(180.0)
                            .show(ui, |ui| {
       @@ -116,7 +106,7 @@ impl ModalDialog for EditSauceDialog {
        
                        let mut number = 0;
                        for line in tmp_str.lines() {
       -                    self.comments.push(SauceString::from(line));
       +                    self.sauce_data.comments.push(SauceString::from(line));
                            number += 1;
                            // limit to 255 chars which is the maximum for sauce comment lines.
                            if number > 255 {
       @@ -152,12 +142,7 @@ impl ModalDialog for EditSauceDialog {
            fn commit(&self, editor: &mut AnsiEditor) -> TerminalResult<Option<Message>> {
                let bv = &mut editor.buffer_view.lock();
                let buf = bv.get_buffer_mut();
       -        buf.title = self.title.clone();
       -        buf.author = self.author.clone();
       -        buf.group = self.group.clone();
       -        buf.comments = self.comments.clone();
       -        buf.use_letter_spacing = self.use_letter_spacing;
       -        buf.use_aspect_ratio = self.use_aspect_ratio;
       +        buf.sauce_data = Some(self.sauce_data.clone());
                Ok(None)
            }
        }
   DIR diff --git a/src/ui/dialogs/export_file_dialog/ansi.rs b/src/ui/dialogs/export_file_dialog/ansi.rs
       @@ -1,60 +1,60 @@
       -use eframe::egui::{self, Layout, Ui};
       +use eframe::egui::{self, Ui};
        use i18n_embed_fl::fl;
        use icy_engine::{SaveOptions, ScreenPreperation};
        
        pub fn create_settings_page(ui: &mut Ui, options: &mut SaveOptions) {
       -    ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
       -        ui.label(fl!(
       -            crate::LANGUAGE_LOADER,
       -            "export-video-preparation-label"
       -        ));
       -    });
       +    ui.vertical(|ui| {
       +        ui.horizontal(|ui| {
       +            ui.label(fl!(
       +                crate::LANGUAGE_LOADER,
       +                "export-video-preparation-label"
       +            ));
        
       -    let label = match options.screen_preparation {
       -        ScreenPreperation::None => fl!(crate::LANGUAGE_LOADER, "export-video-preparation-None"),
       -        ScreenPreperation::ClearScreen => {
       -            fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Clear")
       -        }
       -        ScreenPreperation::Home => fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Home"),
       -    };
       +            let label = match options.screen_preparation {
       +                ScreenPreperation::None => {
       +                    fl!(crate::LANGUAGE_LOADER, "export-video-preparation-None")
       +                }
       +                ScreenPreperation::ClearScreen => {
       +                    fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Clear")
       +                }
       +                ScreenPreperation::Home => {
       +                    fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Home")
       +                }
       +            };
        
       -    egui::ComboBox::from_id_source("screen_prep_combo")
       -        .selected_text(label)
       -        .show_ui(ui, |ui| {
       -            ui.selectable_value(
       -                &mut options.screen_preparation,
       -                ScreenPreperation::None,
       -                fl!(crate::LANGUAGE_LOADER, "export-video-preparation-None"),
       -            );
       -            ui.selectable_value(
       -                &mut options.screen_preparation,
       -                ScreenPreperation::ClearScreen,
       -                fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Clear"),
       -            );
       -            ui.selectable_value(
       -                &mut options.screen_preparation,
       -                ScreenPreperation::Home,
       -                fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Home"),
       -            );
       +            egui::ComboBox::from_id_source("screen_prep_combo")
       +                .selected_text(label)
       +                .width(150.)
       +                .show_ui(ui, |ui| {
       +                    ui.selectable_value(
       +                        &mut options.screen_preparation,
       +                        ScreenPreperation::None,
       +                        fl!(crate::LANGUAGE_LOADER, "export-video-preparation-None"),
       +                    );
       +                    ui.selectable_value(
       +                        &mut options.screen_preparation,
       +                        ScreenPreperation::ClearScreen,
       +                        fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Clear"),
       +                    );
       +                    ui.selectable_value(
       +                        &mut options.screen_preparation,
       +                        ScreenPreperation::Home,
       +                        fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Home"),
       +                    );
       +                });
       +        });
       +        ui.horizontal(|ui| {
       +            ui.add(egui::Checkbox::new(
       +                &mut options.modern_terminal_output,
       +                fl!(crate::LANGUAGE_LOADER, "export-utf8-output-label"),
       +            ));
                });
       -    ui.end_row();
       -
       -    ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
       -        ui.label("");
       -    });
       -
       -    ui.add(egui::Checkbox::new(
       -        &mut options.modern_terminal_output,
       -        fl!(crate::LANGUAGE_LOADER, "export-utf8-output-label"),
       -    ));
       -    ui.end_row();
        
       -    ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
       -        ui.label("");
       +        ui.horizontal(|ui| {
       +            ui.add(egui::Checkbox::new(
       +                &mut options.save_sauce,
       +                fl!(crate::LANGUAGE_LOADER, "export-save-sauce-label"),
       +            ));
       +        });
            });
       -    ui.add(egui::Checkbox::new(
       -        &mut options.save_sauce,
       -        fl!(crate::LANGUAGE_LOADER, "export-save-sauce-label"),
       -    ));
       -    ui.end_row();
        }
   DIR diff --git a/src/ui/dialogs/export_file_dialog/ascii.rs b/src/ui/dialogs/export_file_dialog/ascii.rs
       @@ -3,12 +3,10 @@ use i18n_embed_fl::fl;
        use icy_engine::SaveOptions;
        
        pub fn create_settings_page(ui: &mut Ui, options: &mut SaveOptions) {
       -    ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
       -        ui.label("");
       +    ui.vertical(|ui| {
       +        ui.add(egui::Checkbox::new(
       +            &mut options.save_sauce,
       +            fl!(crate::LANGUAGE_LOADER, "export-save-sauce-label"),
       +        ));
            });
       -    ui.add(egui::Checkbox::new(
       -        &mut options.save_sauce,
       -        fl!(crate::LANGUAGE_LOADER, "export-save-sauce-label"),
       -    ));
       -    ui.end_row();
        }
   DIR diff --git a/src/ui/dialogs/export_file_dialog/avatar.rs b/src/ui/dialogs/export_file_dialog/avatar.rs
       @@ -3,48 +3,47 @@ use i18n_embed_fl::fl;
        use icy_engine::{SaveOptions, ScreenPreperation};
        
        pub fn create_settings_page(ui: &mut Ui, options: &mut SaveOptions) {
       -    ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
       -        ui.label(fl!(
       -            crate::LANGUAGE_LOADER,
       -            "export-video-preparation-label"
       -        ));
       -    });
       +    ui.vertical(|ui| {
        
       -    let label = match options.screen_preparation {
       -        ScreenPreperation::None => fl!(crate::LANGUAGE_LOADER, "export-video-preparation-None"),
       -        ScreenPreperation::ClearScreen => {
       -            fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Clear")
       -        }
       -        ScreenPreperation::Home => fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Home"),
       -    };
       +        ui.horizontal(|ui| {
        
       -    egui::ComboBox::from_id_source("screen_prep_combo")
       -        .selected_text(label)
       -        .show_ui(ui, |ui| {
       -            ui.selectable_value(
       -                &mut options.screen_preparation,
       -                ScreenPreperation::None,
       -                fl!(crate::LANGUAGE_LOADER, "export-video-preparation-None"),
       -            );
       -            ui.selectable_value(
       -                &mut options.screen_preparation,
       -                ScreenPreperation::ClearScreen,
       -                fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Clear"),
       -            );
       -            ui.selectable_value(
       -                &mut options.screen_preparation,
       -                ScreenPreperation::Home,
       -                fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Home"),
       -            );
       -        });
       -    ui.end_row();
       +            ui.label(fl!(
       +                crate::LANGUAGE_LOADER,
       +                "export-video-preparation-label"
       +            ));
        
       -    ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
       -        ui.label("");
       +        let label = match options.screen_preparation {
       +            ScreenPreperation::None => fl!(crate::LANGUAGE_LOADER, "export-video-preparation-None"),
       +            ScreenPreperation::ClearScreen => {
       +                fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Clear")
       +            }
       +            ScreenPreperation::Home => fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Home"),
       +        };
       +
       +        egui::ComboBox::from_id_source("screen_prep_combo")
       +            .selected_text(label)
       +            .width(150.)
       +            .show_ui(ui, |ui| {
       +                ui.selectable_value(
       +                    &mut options.screen_preparation,
       +                    ScreenPreperation::None,
       +                    fl!(crate::LANGUAGE_LOADER, "export-video-preparation-None"),
       +                );
       +                ui.selectable_value(
       +                    &mut options.screen_preparation,
       +                    ScreenPreperation::ClearScreen,
       +                    fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Clear"),
       +                );
       +                ui.selectable_value(
       +                    &mut options.screen_preparation,
       +                    ScreenPreperation::Home,
       +                    fl!(crate::LANGUAGE_LOADER, "export-video-preparation-Home"),
       +                );
       +            });
       +        });
       +        ui.add(egui::Checkbox::new(
       +            &mut options.save_sauce,
       +            fl!(crate::LANGUAGE_LOADER, "export-save-sauce-label"),
       +        ));
            });
       -    ui.add(egui::Checkbox::new(
       -        &mut options.save_sauce,
       -        fl!(crate::LANGUAGE_LOADER, "export-save-sauce-label"),
       -    ));
       -    ui.end_row();
        }
   DIR diff --git a/src/ui/dialogs/export_file_dialog/mod.rs b/src/ui/dialogs/export_file_dialog/mod.rs
       @@ -23,7 +23,6 @@ mod xbin;
        pub struct ExportFileDialog {
            pub should_commit: bool,
            pub file_name: PathBuf,
       -    save_file_dialog: Option<FileDialog>,
            save_options: SaveOptions,
        }
        
       @@ -31,7 +30,6 @@ impl ExportFileDialog {
            pub fn new(buf: &icy_engine::Buffer) -> Self {
                ExportFileDialog {
                    should_commit: false,
       -            save_file_dialog: None,
                    file_name: match &buf.file_name {
                        Some(path) => path.clone(),
                        _ => PathBuf::from("Untitled.ans"),
       @@ -45,78 +43,69 @@ impl ModalDialog for ExportFileDialog {
            fn show(&mut self, ctx: &egui::Context) -> bool {
                let mut result = false;
        
       -        if let Some(dialog) = &mut self.save_file_dialog {
       -            if dialog.show(ctx).selected() {
       -                if let Some(file) = dialog.path() {
       -                    self.file_name = file.to_path_buf();
       -                }
       -                self.save_file_dialog = None;
       -            }
       -            return false;
       -        }
       -
       -        let modal = Modal::new(ctx, "my_modal");
       +        let modal = Modal::new(ctx, "export_file-dialog");
        
                modal.show(|ui| {
                    modal.title(ui, fl!(crate::LANGUAGE_LOADER, "export-title"));
        
                    modal.frame(ui, |ui| {
       -                egui::Grid::new("some_unique_id")
       -                    .num_columns(2)
       -                    .spacing([4.0, 8.0])
       -                    .show(ui, |ui| {
       -                        ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
       -                            ui.label(fl!(crate::LANGUAGE_LOADER, "export-file-label"));
       -                        });
       -
       -                        let mut path_edit = self.file_name.to_str().unwrap().to_string();
       -                        let response = ui.add(
       -                            //    ui.available_size(),
       -                            TextEdit::singleline(&mut path_edit),
       -                        );
       -                        if response.changed() {
       -                            self.file_name = path_edit.into();
       +                let mut format_type = 0;
       +
       +                ui.horizontal(|ui| {
       +                    ui.label(fl!(crate::LANGUAGE_LOADER, "export-file-label"));
       +
       +                    let mut path_edit = self.file_name.to_str().unwrap().to_string();
       +                    let response = ui.add(
       +                        //    ui.available_size(),
       +                        TextEdit::singleline(&mut path_edit),
       +                    );
       +                    if response.changed() {
       +                        self.file_name = path_edit.into();
       +                    }
       +
       +                    if ui.add(egui::Button::new("…").wrap(false)).clicked() {
       +                        let mut dialog = rfd::FileDialog::new();
       +                        if let Some(parent) = self.file_name.parent() {
       +                            dialog = dialog.set_directory(parent);
                                }
       +                        let res = dialog.pick_file();
        
       -                        if ui.add(egui::Button::new("…").wrap(false)).clicked() {
       -                            let mut dialog = FileDialog::save_file(Some(self.file_name.clone()));
       -                            dialog.open();
       -                            self.save_file_dialog = Some(dialog);
       -                            ui.close_menu();
       +                        if let Some(file) = res {
       +                            self.file_name = file;
                                }
       -
       -                        let mut format_type = 0;
       -                        if let Some(ext) = self.file_name.extension() {
       -                            if let Some(ext) = ext.to_str() {
       -                                let ext = ext.to_lowercase();
       -                                for i in 0..TYPE_DESCRIPTIONS.len() {
       -                                    let td = TYPE_DESCRIPTIONS[i];
       -                                    if ext == td.2 {
       -                                        format_type = i;
       -                                        break;
       -                                    }
       +                    }
       +                    if let Some(ext) = self.file_name.extension() {
       +                        if let Some(ext) = ext.to_str() {
       +                            let ext = ext.to_lowercase();
       +                            for i in 0..TYPE_DESCRIPTIONS.len() {
       +                                let td = TYPE_DESCRIPTIONS[i];
       +                                if ext == td.2 {
       +                                    format_type = i;
       +                                    break;
                                        }
                                    }
                                }
       -                        let old_format = format_type;
       -
       -                        egui::ComboBox::from_id_source("format_combo")
       -                            .selected_text(TYPE_DESCRIPTIONS[format_type].0)
       -                            .show_ui(ui, |ui| {
       -                                (0..TYPE_DESCRIPTIONS.len()).for_each(|i| {
       -                                    let td = TYPE_DESCRIPTIONS[i];
       -                                    ui.selectable_value(&mut format_type, i, td.0);
       -                                });
       +                    }
       +                    let old_format = format_type;
       +                    // ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
       +
       +                    egui::ComboBox::from_id_source("format_combo")
       +                        .selected_text(TYPE_DESCRIPTIONS[format_type].0)
       +                        .width(190.)
       +                        .show_ui(ui, |ui| {
       +                            (0..TYPE_DESCRIPTIONS.len()).for_each(|i| {
       +                                let td = TYPE_DESCRIPTIONS[i];
       +                                ui.selectable_value(&mut format_type, i, td.0);
                                    });
       -                        if old_format != format_type {
       -                            self.file_name
       -                                .set_extension(TYPE_DESCRIPTIONS[format_type].2);
       -                        }
       -                        ui.end_row();
       -
       -                        TYPE_DESCRIPTIONS[format_type].1(ui, &mut self.save_options);
       -                    });
       -                ui.add_space(4.0);
       +                        });
       +                    if old_format != format_type {
       +                        self.file_name
       +                            .set_extension(TYPE_DESCRIPTIONS[format_type].2);
       +                    }
       +                    //    });
       +                });
       +
       +                TYPE_DESCRIPTIONS[format_type].1(ui, &mut self.save_options);
                    });
        
                    modal.buttons(ui, |ui| {
   DIR diff --git a/src/ui/editor/ansi/mod.rs b/src/ui/editor/ansi/mod.rs
       @@ -161,7 +161,7 @@ impl Document for AnsiEditor {
                let mut message = None;
        
                let mut scale = options.scale;
       -        if self.buffer_view.lock().get_buffer().use_aspect_ratio {
       +        if self.buffer_view.lock().get_buffer().use_aspect_ratio() {
                    scale.y *= 1.35;
                }
                ui.allocate_ui(