Close browser before full sync or colpkg import/export

Closes #1797
This commit is contained in:
Damien Elmes 2022-04-19 17:10:34 +10:00
parent 856d4763a9
commit a7cb5e210e
5 changed files with 31 additions and 10 deletions

View file

@ -897,6 +897,7 @@ class Browser(QMainWindow):
gui_hooks.operation_did_execute.append(self.on_operation_did_execute) gui_hooks.operation_did_execute.append(self.on_operation_did_execute)
gui_hooks.focus_did_change.append(self.on_focus_change) gui_hooks.focus_did_change.append(self.on_focus_change)
gui_hooks.flag_label_did_change.append(self._update_flag_labels) gui_hooks.flag_label_did_change.append(self._update_flag_labels)
gui_hooks.collection_will_temporarily_close.append(self._on_temporary_close)
def teardownHooks(self) -> None: def teardownHooks(self) -> None:
gui_hooks.undo_state_did_change.remove(self.on_undo_state_change) gui_hooks.undo_state_did_change.remove(self.on_undo_state_change)
@ -905,6 +906,11 @@ class Browser(QMainWindow):
gui_hooks.operation_did_execute.remove(self.on_operation_did_execute) gui_hooks.operation_did_execute.remove(self.on_operation_did_execute)
gui_hooks.focus_did_change.remove(self.on_focus_change) gui_hooks.focus_did_change.remove(self.on_focus_change)
gui_hooks.flag_label_did_change.remove(self._update_flag_labels) gui_hooks.flag_label_did_change.remove(self._update_flag_labels)
gui_hooks.collection_will_temporarily_close.remove(self._on_temporary_close)
def _on_temporary_close(self, col: Collection) -> None:
# we could reload browser columns in the future; for now we just close
self.close()
# Undo # Undo
###################################################################### ######################################################################

View file

@ -15,6 +15,7 @@ from anki import hooks
from anki.cards import CardId from anki.cards import CardId
from anki.decks import DeckId from anki.decks import DeckId
from anki.exporting import Exporter, exporters from anki.exporting import Exporter, exporters
from aqt import gui_hooks
from aqt.errors import show_exception from aqt.errors import show_exception
from aqt.qt import * from aqt.qt import *
from aqt.utils import ( from aqt.utils import (
@ -181,6 +182,8 @@ class ExportDialog(QDialog):
else: else:
self.on_export_finished() self.on_export_finished()
if self.isVerbatim:
gui_hooks.collection_will_temporarily_close(self.mw.col)
self.mw.progress.start() self.mw.progress.start()
hooks.media_files_did_export.append(exported_media) hooks.media_files_did_export.append(exported_media)

View file

@ -575,8 +575,9 @@ class AnkiQt(QMainWindow):
self.col = Collection(cpath, backend=self.backend) self.col = Collection(cpath, backend=self.backend)
self.setEnabled(True) self.setEnabled(True)
def reopen(self) -> None: def reopen(self, after_full_sync: bool = False) -> None:
self.col.reopen() self.col.reopen(after_full_sync=after_full_sync)
gui_hooks.collection_did_temporarily_close(self.col)
def unloadCollection(self, onsuccess: Callable) -> None: def unloadCollection(self, onsuccess: Callable) -> None:
def after_media_sync() -> None: def after_media_sync() -> None:
@ -629,11 +630,6 @@ class AnkiQt(QMainWindow):
if corrupt: if corrupt:
showWarning(tr.qt_misc_your_collection_file_appears_to_be()) showWarning(tr.qt_misc_your_collection_file_appears_to_be())
def _close_for_full_download(self) -> None:
"Backup and prepare collection to be overwritten."
self.create_backup_now()
self.col.close_for_full_sync()
def apply_collection_options(self) -> None: def apply_collection_options(self) -> None:
"Setup audio after collection loaded." "Setup audio after collection loaded."
aqt.sound.av_player.interrupt_current_audio = self.col.get_config_bool( aqt.sound.av_player.interrupt_current_audio = self.col.get_config_bool(

View file

@ -14,6 +14,7 @@ from anki.errors import Interrupted, SyncError, SyncErrorKind
from anki.lang import without_unicode_isolation from anki.lang import without_unicode_isolation
from anki.sync import SyncOutput, SyncStatus from anki.sync import SyncOutput, SyncStatus
from anki.utils import plat_desc from anki.utils import plat_desc
from aqt import gui_hooks
from aqt.qt import ( from aqt.qt import (
QDialog, QDialog,
QDialogButtonBox, QDialogButtonBox,
@ -181,13 +182,17 @@ def full_download(mw: aqt.main.AnkiQt, on_done: Callable[[], None]) -> None:
qconnect(timer.timeout, on_timer) qconnect(timer.timeout, on_timer)
timer.start(150) timer.start(150)
# hook needs to be called early, on the main thread
gui_hooks.collection_will_temporarily_close(mw.col)
def download() -> None: def download() -> None:
mw._close_for_full_download() mw.create_backup_now()
mw.col.close_for_full_sync()
mw.col.full_download(mw.pm.sync_auth()) mw.col.full_download(mw.pm.sync_auth())
def on_future_done(fut: Future) -> None: def on_future_done(fut: Future) -> None:
timer.stop() timer.stop()
mw.col.reopen(after_full_sync=True) mw.reopen(after_full_sync=True)
mw.reset() mw.reset()
try: try:
fut.result() fut.result()
@ -204,6 +209,7 @@ def full_download(mw: aqt.main.AnkiQt, on_done: Callable[[], None]) -> None:
def full_upload(mw: aqt.main.AnkiQt, on_done: Callable[[], None]) -> None: def full_upload(mw: aqt.main.AnkiQt, on_done: Callable[[], None]) -> None:
gui_hooks.collection_will_temporarily_close(mw.col)
mw.col.close_for_full_sync() mw.col.close_for_full_sync()
def on_timer() -> None: def on_timer() -> None:
@ -215,7 +221,7 @@ def full_upload(mw: aqt.main.AnkiQt, on_done: Callable[[], None]) -> None:
def on_future_done(fut: Future) -> None: def on_future_done(fut: Future) -> None:
timer.stop() timer.stop()
mw.col.reopen(after_full_sync=True) mw.reopen(after_full_sync=True)
mw.reset() mw.reset()
try: try:
fut.result() fut.result()

View file

@ -688,6 +688,16 @@ gui_hooks.webview_did_inject_style_into_page.append(mytest)
""", """,
), ),
Hook(name="profile_will_close", legacy_hook="unloadProfile"), Hook(name="profile_will_close", legacy_hook="unloadProfile"),
Hook(
name="collection_will_temporarily_close",
args=["col: anki.collection.Collection"],
doc="""Called before one-way syncs and colpkg imports/exports.""",
),
Hook(
name="collection_did_temporarily_close",
args=["col: anki.collection.Collection"],
doc="""Called after one-way syncs and colpkg imports/exports.""",
),
Hook( Hook(
name="collection_did_load", name="collection_did_load",
args=["col: anki.collection.Collection"], args=["col: anki.collection.Collection"],