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 }