diff --git a/qt/aqt/import_export/exporting.py b/qt/aqt/import_export/exporting.py index 29f674b65..26c63afc8 100644 --- a/qt/aqt/import_export/exporting.py +++ b/qt/aqt/import_export/exporting.py @@ -227,9 +227,9 @@ class ApkgExporter(Exporter): ).with_backend_progress(export_progress_update).run_in_background() -def export_progress_update(progress: Progress) -> ProgressUpdate | None: +def export_progress_update(progress: Progress, update: ProgressUpdate) -> None: if not progress.HasField("exporting"): return None - return ProgressUpdate( - label=tr.exporting_exported_media_file(count=progress.exporting) - ) + update.label = tr.exporting_exported_media_file(count=progress.exporting) + if update.user_wants_abort: + update.abort = True diff --git a/qt/aqt/import_export/importing.py b/qt/aqt/import_export/importing.py index 4ac351acb..c7d2942b5 100644 --- a/qt/aqt/import_export/importing.py +++ b/qt/aqt/import_export/importing.py @@ -143,7 +143,9 @@ def stringify_log(log: Any) -> str: ) -def import_progress_update(progress: Progress) -> ProgressUpdate | None: - if progress.HasField("importing"): - return ProgressUpdate(label=progress.importing) - return None +def import_progress_update(progress: Progress, update: ProgressUpdate) -> None: + if not progress.HasField("importing"): + return + update.label = progress.importing + if update.user_wants_abort: + update.abort = True diff --git a/qt/aqt/operations/__init__.py b/qt/aqt/operations/__init__.py index abf921531..761c6e7ab 100644 --- a/qt/aqt/operations/__init__.py +++ b/qt/aqt/operations/__init__.py @@ -69,7 +69,7 @@ class CollectionOp(Generic[ResultWithChanges]): _success: Callable[[ResultWithChanges], Any] | None = None _failure: Callable[[Exception], Any] | None = None - _progress_update: Callable[[Progress], ProgressUpdate | None] | None = None + _progress_update: Callable[[Progress, ProgressUpdate], None] | None = None def __init__(self, parent: QWidget, op: Callable[[Collection], ResultWithChanges]): self._parent = parent @@ -88,7 +88,7 @@ class CollectionOp(Generic[ResultWithChanges]): return self def with_backend_progress( - self, progress_update: Callable[[Progress], ProgressUpdate | None] | None + self, progress_update: Callable[[Progress, ProgressUpdate], None] | None ) -> CollectionOp[ResultWithChanges]: self._progress_update = progress_update return self @@ -196,7 +196,7 @@ class QueryOp(Generic[T]): _failure: Callable[[Exception], Any] | None = None _progress: bool | str = False - _progress_update: Callable[[Progress], ProgressUpdate | None] | None = None + _progress_update: Callable[[Progress, ProgressUpdate], None] | None = None def __init__( self, @@ -222,7 +222,7 @@ class QueryOp(Generic[T]): return self def with_backend_progress( - self, progress_update: Callable[[Progress], ProgressUpdate | None] | None + self, progress_update: Callable[[Progress, ProgressUpdate], None] | None ) -> QueryOp[T]: self._progress_update = progress_update return self diff --git a/qt/aqt/progress.py b/qt/aqt/progress.py index 70f6db58a..3a1b355a9 100644 --- a/qt/aqt/progress.py +++ b/qt/aqt/progress.py @@ -171,7 +171,7 @@ class ProgressManager: def start_with_backend_updates( self, - progress_update: Callable[[Progress], ProgressUpdate | None], + progress_update: Callable[[Progress, ProgressUpdate], None], start_label: str | None = None, parent: QWidget | None = None, ) -> None: @@ -185,12 +185,14 @@ class ProgressManager: def on_progress() -> None: assert self.mw + user_wants_abort = dialog and dialog.wantCancel or False + update = ProgressUpdate(user_wants_abort=user_wants_abort) progress = self.mw.backend.latest_progress() - if not (update := progress_update(progress)): - return - if dialog and dialog.wantCancel: + progress_update(progress, update) + if update.abort: self.mw.backend.set_wants_abort() - self.update(label=update.label, value=update.value, max=update.max) + if update.has_update(): + self.update(label=update.label, value=update.value, max=update.max) qconnect(self._backend_timer.timeout, on_progress) self._backend_timer.start() @@ -334,3 +336,8 @@ class ProgressUpdate: label: str | None = None value: int | None = None max: int | None = None + user_wants_abort: bool = False + abort: bool = False + + def has_update(self) -> bool: + return self.label is not None or self.value is not None or self.max is not None diff --git a/qt/aqt/taskman.py b/qt/aqt/taskman.py index 13d984100..283153ee1 100644 --- a/qt/aqt/taskman.py +++ b/qt/aqt/taskman.py @@ -94,7 +94,7 @@ class TaskManager(QObject): def with_backend_progress( self, task: Callable, - progress_update: Callable[[Progress], ProgressUpdate | None], + progress_update: Callable[[Progress, ProgressUpdate], None], on_done: Callable[[Future], None] | None = None, parent: QWidget | None = None, start_label: str | None = None,