diff --git a/src/export_all_window.rs b/src/export_all_window.rs index 4d42a2e..58db095 100644 --- a/src/export_all_window.rs +++ b/src/export_all_window.rs @@ -43,6 +43,7 @@ pub(crate) struct ExportAllWindow { pub(crate) close_btn: Button, pub(crate) images_list: Arc>>, pub(crate) channel: Arc>>>, + pub(crate) finished: Arc>, } impl ExportAllWindow { @@ -106,7 +107,7 @@ impl ExportAllWindow { main_flex.end(); win.end(); - win.make_resizable(true); + win.make_modal(true); let mut config_picker = Self { win, @@ -115,6 +116,7 @@ impl ExportAllWindow { close_btn, images_list, channel: Arc::new(RwLock::new(None)), + finished: Arc::new(RwLock::new(false)), }; config_picker.event(); @@ -124,8 +126,10 @@ impl ExportAllWindow { pub(crate) fn export(&mut self) { self.image_name.set_label(""); self.progress.set_label("Exporting..."); + self.close_btn.set_label("Cancel"); self.progress.set_maximum(1.0); self.progress.set_value(0.0); + *rw_write!(self.finished) = false; self.win.show(); let (left, right) = bichannel::channel(); *rw_write!(self.channel) = Some(left); @@ -143,25 +147,31 @@ impl ExportAllWindow { } app::wait(); } - self.win.redraw(); } // Set callbacks of elements fn event(&mut self) { - let channel = Arc::clone(&self.channel); // Close Button + let channel = Arc::clone(&self.channel); + let finished = Arc::clone(&self.finished); + let mut win = self.win.clone(); self.close_btn.set_callback(move |_| { - if dialog::choice_default("Are you sure?", "Yes", "No") == 0 { + if *rw_read!(finished) == true { + win.hide(); + } else if dialog::choice_default("Are you sure?", "Yes", "No") == 0 { if let Some(c) = &*rw_read!(channel) { c.send(ThreadMessage::Stop).error_log("Failed to stop task"); } } }); - let channel = Arc::clone(&self.channel); // Window Close - self.win.set_callback(move |_| { - if dialog::choice_default("Are you sure?", "Yes", "No") == 0 { + let channel = Arc::clone(&self.channel); + let finished = Arc::clone(&self.finished); + self.win.set_callback(move |f| { + if *rw_read!(finished) == true { + f.hide(); + } else if dialog::choice_default("Are you sure?", "Yes", "No") == 0 { if let Some(c) = &*rw_read!(channel) { c.send(ThreadMessage::Stop).error_log("Failed to stop task"); } @@ -182,6 +192,8 @@ fn spawn_export_thread( let mut win = export_all.win.clone(); let mut progress = export_all.progress.clone(); let mut image_name = export_all.image_name.clone(); + let mut close_btn = export_all.close_btn.clone(); + let finished = Arc::clone(&export_all.finished); let images_list = Arc::clone(&export_all.images_list); thread::spawn(move || { @@ -224,14 +236,20 @@ fn spawn_export_thread( if let Ok(msg) = channel.try_recv() { match msg { - ThreadMessage::Stop => break, + ThreadMessage::Stop => { + channel + .send(ThreadMessage::HideWindow) + .error_log("Failed to close window"); + return; + } _ => (), } } } - image_name.set_label("Done"); - channel - .send(ThreadMessage::HideWindow) - .error_log("Failed to close window"); + image_name.set_label("Finished"); + close_btn.set_label("Close"); + *rw_write!(finished) = true; + win.redraw(); + app::awake(); }); } diff --git a/src/main_window.rs b/src/main_window.rs index 7b1375d..0012d05 100644 --- a/src/main_window.rs +++ b/src/main_window.rs @@ -490,6 +490,7 @@ impl MainWindow { }, ); + let mut win = self.win.clone(); let mut export_all = ExportAllWindow::new(Arc::clone(&self.images_list)); self.menubar.add( "&Actions/Export All with Quotes...\t", @@ -497,6 +498,7 @@ impl MainWindow { menu::MenuFlag::Normal, move |_| { export_all.export(); + win.redraw(); fltk::app::awake(); }, );