From 53952ba1319a1c88a97e23b8fcd69abc0b7a6590 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Fri, 6 Mar 2020 14:19:25 +1000 Subject: [PATCH] export in a background thread --- qt/aqt/exporting.py | 79 ++++++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/qt/aqt/exporting.py b/qt/aqt/exporting.py index 2e63e65e7..0b2bfdf21 100644 --- a/qt/aqt/exporting.py +++ b/qt/aqt/exporting.py @@ -6,6 +6,7 @@ from __future__ import annotations import os import re import time +from concurrent.futures import Future from typing import List, Optional import aqt @@ -131,7 +132,7 @@ class ExportDialog(QDialog): break self.hide() if file: - self.mw.progress.start(immediate=True) + # check we can write to file try: f = open(file, "wb") f.close() @@ -139,39 +140,51 @@ class ExportDialog(QDialog): showWarning(_("Couldn't save file: %s") % str(e)) else: os.unlink(file) - exportedMedia = lambda cnt: self.mw.progress.update( - label=ngettext( - "Exported %d media file", "Exported %d media files", cnt + + # progress handler + def exported_media(cnt): + self.mw.taskman.run_on_main( + lambda: self.mw.progress.update( + label=ngettext( + "Exported %d media file", "Exported %d media files", cnt + ) + % cnt ) - % cnt ) - hooks.media_files_did_export.append(exportedMedia) + + def do_export(): self.exporter.exportInto(file) - hooks.media_files_did_export.remove(exportedMedia) - period = 3000 - if self.isVerbatim: - msg = _("Collection exported.") - self.mw.reopen() - else: - if self.isTextNote: - msg = ( - ngettext( - "%d note exported.", - "%d notes exported.", - self.exporter.count, - ) - % self.exporter.count - ) - else: - msg = ( - ngettext( - "%d card exported.", - "%d cards exported.", - self.exporter.count, - ) - % self.exporter.count - ) - tooltip(msg, period=period) - finally: + + def on_done(future: Future): self.mw.progress.finish() - QDialog.accept(self) + hooks.media_files_did_export.remove(exported_media) + # raises if exporter failed + future.result() + self.on_export_finished() + + self.mw.progress.start(immediate=True) + hooks.media_files_did_export.append(exported_media) + + self.mw.taskman.run_in_background(do_export, on_done) + + def on_export_finished(self): + if self.isVerbatim: + msg = _("Collection exported.") + self.mw.reopen() + else: + if self.isTextNote: + msg = ( + ngettext( + "%d note exported.", "%d notes exported.", self.exporter.count, + ) + % self.exporter.count + ) + else: + msg = ( + ngettext( + "%d card exported.", "%d cards exported.", self.exporter.count, + ) + % self.exporter.count + ) + tooltip(msg, period=3000) + QDialog.reject(self)