edit_sauce_dialog.rs - icy_draw - icy_draw is the successor to mystic draw. fork / mirror
 (HTM) git clone https://git.drkhsh.at/icy_draw.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       edit_sauce_dialog.rs (5924B)
       ---
            1 use eframe::egui::{self, Layout};
            2 use egui_modal::Modal;
            3 use i18n_embed_fl::fl;
            4 use icy_engine::{SauceData, SauceString};
            5 
            6 use crate::{to_message, AnsiEditor, Message, ModalDialog, TerminalResult};
            7 
            8 pub struct EditSauceDialog {
            9     pub should_commit: bool,
           10     pub sauce_data: SauceData,
           11     pub comments: String,
           12 }
           13 
           14 impl EditSauceDialog {
           15     pub fn new(buf: &icy_engine::Buffer) -> Self {
           16         let mut comments = String::new();
           17 
           18         if let Some(sauce) = buf.get_sauce() {
           19             for s in &sauce.comments {
           20                 comments.push_str(&s.to_string());
           21                 comments.push('\n');
           22             }
           23         }
           24 
           25         EditSauceDialog {
           26             should_commit: false,
           27             sauce_data: buf.get_sauce().clone().unwrap_or_default(),
           28             comments,
           29         }
           30     }
           31 }
           32 
           33 impl ModalDialog for EditSauceDialog {
           34     fn show(&mut self, ctx: &egui::Context) -> bool {
           35         let mut result = false;
           36         let modal: Modal = Modal::new(ctx, "edit_sauce_dialog");
           37 
           38         modal.show(|ui| {
           39             modal.title(ui, fl!(crate::LANGUAGE_LOADER, "edit-sauce-title"));
           40 
           41             modal.frame(ui, |ui| {
           42                 egui::Grid::new("some_unique_id").num_columns(2).spacing([4.0, 8.0]).show(ui, |ui| {
           43                     ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
           44                         ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-title-label"));
           45                     });
           46                     ui.horizontal(|ui| {
           47                         let mut tmp_str = self.sauce_data.title.to_string();
           48                         ui.add(egui::TextEdit::singleline(&mut tmp_str).char_limit(35));
           49                         self.sauce_data.title = SauceString::from(&tmp_str);
           50                         ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-title-label-length"));
           51                     });
           52                     ui.end_row();
           53 
           54                     ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
           55                         ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-author-label"));
           56                     });
           57 
           58                     ui.horizontal(|ui| {
           59                         let mut tmp_str = self.sauce_data.author.to_string();
           60                         ui.add(egui::TextEdit::singleline(&mut tmp_str).char_limit(20));
           61                         self.sauce_data.author = SauceString::from(&tmp_str);
           62                         ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-author-label-length"));
           63                     });
           64                     ui.end_row();
           65 
           66                     ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
           67                         ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-group-label"));
           68                     });
           69                     ui.horizontal(|ui| {
           70                         let mut tmp_str = self.sauce_data.group.to_string();
           71                         ui.add(egui::TextEdit::singleline(&mut tmp_str).char_limit(20));
           72                         self.sauce_data.group = SauceString::from(&tmp_str);
           73                         ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-group-label-length"));
           74                     });
           75                     ui.end_row();
           76 
           77                     ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
           78                         ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-letter-spacing"));
           79                     });
           80                     ui.horizontal(|ui| {
           81                         ui.checkbox(&mut self.sauce_data.use_letter_spacing, "");
           82                     });
           83                     ui.end_row();
           84 
           85                     ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
           86                         ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-aspect-ratio"));
           87                     });
           88                     ui.horizontal(|ui| {
           89                         ui.checkbox(&mut self.sauce_data.use_aspect_ratio, "");
           90                     });
           91                     ui.end_row();
           92                 });
           93                 ui.add_space(16.0);
           94                 ui.label(fl!(crate::LANGUAGE_LOADER, "edit-sauce-comments-label"));
           95                 ui.add_space(4.0);
           96                 self.sauce_data.comments.clear();
           97                 egui::ScrollArea::vertical().max_height(180.0).show(ui, |ui| {
           98                     ui.add(egui::TextEdit::multiline(&mut self.comments).desired_rows(6).desired_width(f32::INFINITY));
           99                     let mut new_comments = String::new();
          100                     for line in self.comments.lines() {
          101                         if line.len() > 64 {
          102                             new_comments.push_str(&line[..64]);
          103                         } else {
          104                             new_comments.push_str(line);
          105                         }
          106                         new_comments.push('\n');
          107                     }
          108                     self.comments = new_comments;
          109                 });
          110             });
          111 
          112             modal.buttons(ui, |ui| {
          113                 if ui.button(fl!(crate::LANGUAGE_LOADER, "new-file-ok")).clicked() {
          114                     self.should_commit = true;
          115                     result = true;
          116                 }
          117                 if ui.button(fl!(crate::LANGUAGE_LOADER, "new-file-cancel")).clicked() {
          118                     result = true;
          119                 }
          120             });
          121         });
          122         modal.open();
          123         result
          124     }
          125 
          126     fn should_commit(&self) -> bool {
          127         self.should_commit
          128     }
          129 
          130     fn commit(&self, editor: &mut AnsiEditor) -> TerminalResult<Option<Message>> {
          131         let mut data = self.sauce_data.clone();
          132         let mut number = 0;
          133         for line in self.comments.lines() {
          134             data.comments.push(SauceString::from(line));
          135             number += 1;
          136             // limit to 255 chars which is the maximum for sauce comment lines.
          137             if number > 255 {
          138                 break;
          139             }
          140         }
          141 
          142         let bv = &mut editor.buffer_view.lock();
          143         Ok(to_message(bv.get_edit_state_mut().update_sauce_data(Some(data))))
          144     }
          145 }