export in a background thread

This commit is contained in:
Damien Elmes 2020-03-06 14:19:25 +10:00
parent 7986a79530
commit 53952ba131

View file

@ -6,6 +6,7 @@ from __future__ import annotations
import os import os
import re import re
import time import time
from concurrent.futures import Future
from typing import List, Optional from typing import List, Optional
import aqt import aqt
@ -131,7 +132,7 @@ class ExportDialog(QDialog):
break break
self.hide() self.hide()
if file: if file:
self.mw.progress.start(immediate=True) # check we can write to file
try: try:
f = open(file, "wb") f = open(file, "wb")
f.close() f.close()
@ -139,16 +140,34 @@ class ExportDialog(QDialog):
showWarning(_("Couldn't save file: %s") % str(e)) showWarning(_("Couldn't save file: %s") % str(e))
else: else:
os.unlink(file) os.unlink(file)
exportedMedia = lambda cnt: self.mw.progress.update(
# progress handler
def exported_media(cnt):
self.mw.taskman.run_on_main(
lambda: self.mw.progress.update(
label=ngettext( label=ngettext(
"Exported %d media file", "Exported %d media files", cnt "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) self.exporter.exportInto(file)
hooks.media_files_did_export.remove(exportedMedia)
period = 3000 def on_done(future: Future):
self.mw.progress.finish()
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: if self.isVerbatim:
msg = _("Collection exported.") msg = _("Collection exported.")
self.mw.reopen() self.mw.reopen()
@ -156,22 +175,16 @@ class ExportDialog(QDialog):
if self.isTextNote: if self.isTextNote:
msg = ( msg = (
ngettext( ngettext(
"%d note exported.", "%d note exported.", "%d notes exported.", self.exporter.count,
"%d notes exported.",
self.exporter.count,
) )
% self.exporter.count % self.exporter.count
) )
else: else:
msg = ( msg = (
ngettext( ngettext(
"%d card exported.", "%d card exported.", "%d cards exported.", self.exporter.count,
"%d cards exported.",
self.exporter.count,
) )
% self.exporter.count % self.exporter.count
) )
tooltip(msg, period=period) tooltip(msg, period=3000)
finally: QDialog.reject(self)
self.mw.progress.finish()
QDialog.accept(self)