From a6870ce80bb92189b4aa5b353222b320477d9932 Mon Sep 17 00:00:00 2001 From: Heliguy Date: Sat, 28 Sep 2024 23:10:54 -0400 Subject: [PATCH] Fix snapshot creation cancelling --- src/snapshot_page/new_snapshot_dialog.py | 1 + src/snapshot_page/snapshot_page.py | 9 +++++++-- src/snapshot_page/tar_worker.py | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/snapshot_page/new_snapshot_dialog.py b/src/snapshot_page/new_snapshot_dialog.py index 7b10ac1..e4a8a16 100644 --- a/src/snapshot_page/new_snapshot_dialog.py +++ b/src/snapshot_page/new_snapshot_dialog.py @@ -95,6 +95,7 @@ class NewSnapshotDialog(Adw.Dialog): if stopped_workers_amount == len(self.workers): self.loading_status.progress_bar.set_fraction(1) self.loading_status.progress_label.set_label(f"{len(self.workers)} / {len(self.workers)}") + self.workers.clear() if self.on_done: self.on_done() diff --git a/src/snapshot_page/snapshot_page.py b/src/snapshot_page/snapshot_page.py index fa54024..883d9fe 100644 --- a/src/snapshot_page/snapshot_page.py +++ b/src/snapshot_page/snapshot_page.py @@ -204,7 +204,6 @@ class SnapshotPage(Adw.BreakpointBin): def end_loading(self): def callback(*args): - self.new_snapshot_dialog = NewSnapshotDialog(self, self.snapshotting_status, self.refresh) self.generate_active_list() self.generate_leftover_list() if (not self.active_box.get_visible()) and (not self.leftover_box.get_visible()): @@ -224,10 +223,14 @@ class SnapshotPage(Adw.BreakpointBin): self.toast_overlay.add_toast(ErrorToast(_("Could not open folder"), str(e)).toast) def on_cancel(self): + for worker in self.workers: + worker.do_cancel("manual_cancel") + for worker in self.new_snapshot_dialog.workers: worker.do_cancel("manual_cancel") def on_new(self, *args): + self.new_snapshot_dialog = NewSnapshotDialog(self, self.snapshotting_status, self.refresh) self.new_snapshot_dialog.present(HostInfo.main_window) def refresh(self): @@ -347,7 +350,8 @@ class SnapshotPage(Adw.BreakpointBin): self.toast_overlay.add_toast(Adw.Toast(title=_("No apps in your selection can be snapshotted"))) return - NewSnapshotDialog(self, self.snapshotting_status, self.refresh, packages).present(HostInfo.main_window) + self.new_snapshot_dialog = NewSnapshotDialog(self, self.snapshotting_status, self.refresh, packages) + self.new_snapshot_dialog.present(HostInfo.main_window) def get_snapshots_from_entry(self, app_ids): id_to_tar = {} @@ -379,6 +383,7 @@ class SnapshotPage(Adw.BreakpointBin): self.snapshotting_status.progress_bar.set_fraction(1) self.snapshotting_status.progress_label.set_label(f"{len(self.workers)} / {len(self.workers)}") HostInfo.main_window.refresh_handler() + self.workers.clear() return False self.snapshotting_status.progress_label.set_label(f"{stopped_workers_amount + 1} / {len(self.workers)}") diff --git a/src/snapshot_page/tar_worker.py b/src/snapshot_page/tar_worker.py index 0208594..f3459ed 100644 --- a/src/snapshot_page/tar_worker.py +++ b/src/snapshot_page/tar_worker.py @@ -15,6 +15,7 @@ class TarWorker: self.total = 0 self.process = None self.toast_overlay = toast_overlay + self.has_cancelled = False def compress_thread(self, *args): try: @@ -76,6 +77,10 @@ class TarWorker: self.do_cancel(str(e), [self.new_path]) def do_cancel(self, error_str, files_to_trash=None): + if self.has_cancelled: + return + + self.has_cancelled = True self.process.terminate() self.process.wait() if not files_to_trash is None: