diff --git a/ankiqt/ui/__init__.py b/ankiqt/ui/__init__.py index 16c311861..61c0cc82d 100644 --- a/ankiqt/ui/__init__.py +++ b/ankiqt/ui/__init__.py @@ -55,7 +55,8 @@ class DialogManager(object): def closeAll(self): for (n, (klass, obj)) in self.modelessDialogs.items(): if obj: - obj.hide() + obj.forceClose = True + obj.close() self.close(n) # since we load the graphs dynamically, we need a proxy for this diff --git a/ankiqt/ui/addcards.py b/ankiqt/ui/addcards.py index 3363fa2ca..45886b895 100644 --- a/ankiqt/ui/addcards.py +++ b/ankiqt/ui/addcards.py @@ -27,6 +27,7 @@ class AddCards(QDialog): self.setupStatus() self.modelChanged(self.parent.deck.currentModel) self.addedItems = 0 + self.forceClose = False restoreGeom(self, "add") restoreSplitter(self.dialog.splitter, "add") self.show() @@ -152,9 +153,10 @@ question or answer on all cards."""), parent=self) def onClose(self): # stop anything playing clearAudioQueue() - if (self.editor.fieldsAreBlank() or + if (self.forceClose or self.editor.fieldsAreBlank() or ui.utils.askUser(_("Close and lose current input?"), self)): + self.editor.close() ui.dialogs.close("AddCards") self.parent.deck.s.flush() self.parent.deck.rebuildCSS() diff --git a/ankiqt/ui/cardlist.py b/ankiqt/ui/cardlist.py index f392d1411..4139298f2 100644 --- a/ankiqt/ui/cardlist.py +++ b/ankiqt/ui/cardlist.py @@ -18,7 +18,7 @@ from ankiqt.ui.utils import saveHeader, restoreHeader from anki.errors import * from anki.db import * from anki.stats import CardStats -from anki.hooks import runHook, addHook +from anki.hooks import runHook, addHook, removeHook CARD_ID = 0 CARD_QUESTION = 1 @@ -284,6 +284,7 @@ class EditDeck(QMainWindow): self.parent = parent self.deck = self.parent.deck self.config = parent.config + self.forceClose = False self.origModTime = parent.deck.modified self.currentRow = None self.dialog = ankiqt.forms.cardlist.Ui_MainWindow() @@ -552,17 +553,20 @@ class EditDeck(QMainWindow): def onClose(self): saveSplitter(self.dialog.splitter, "editor") self.editor.saveFieldsNow() - if not self.factValid: - ui.utils.showInfo(_( - "Some fields are missing or not unique."), - parent=self, help="AddItems#AddError") - return + if not self.forceClose: + if not self.factValid: + ui.utils.showInfo(_( + "Some fields are missing or not unique."), + parent=self, help="AddItems#AddError") + return self.editor.setFact(None) + self.editor.close() saveGeom(self, "editor") saveHeader(self.dialog.tableView.horizontalHeader(), "editor") self.hide() ui.dialogs.close("CardList") self.parent.moveToState("auto") + self.teardownUndo() return True def closeEvent(self, evt): @@ -807,6 +811,9 @@ where id in %s""" % ids2str(sf)) def setupUndo(self): addHook("postUndoRedo", self.postUndoRedo) + def teardownUndo(self): + removeHook("postUndoRedo", self.postUndoRedo) + def postUndoRedo(self): self.updateFilterLabel() self.updateSearch() diff --git a/ankiqt/ui/facteditor.py b/ankiqt/ui/facteditor.py index 1c7ac5e66..c550de74c 100644 --- a/ankiqt/ui/facteditor.py +++ b/ankiqt/ui/facteditor.py @@ -13,7 +13,7 @@ import anki.sound from ankiqt import ui import ankiqt from ankiqt.ui.utils import mungeQA, saveGeom, restoreGeom -from anki.hooks import addHook +from anki.hooks import addHook, removeHook from sqlalchemy.exceptions import InvalidRequestError clozeColour = "#0000ff" @@ -41,6 +41,10 @@ class FactEditor(object): addHook("deckClosed", self.deckClosedHook) addHook("guiReset", self.refresh) + def close(self): + removeHook("deckClosed", self.deckClosedHook) + removeHook("guiReset", self.refresh) + def setFact(self, fact, noFocus=False, check=False): "Make FACT the current fact." self.fact = fact diff --git a/ankiqt/ui/main.py b/ankiqt/ui/main.py index 86ea1565a..b543aa921 100644 --- a/ankiqt/ui/main.py +++ b/ankiqt/ui/main.py @@ -690,6 +690,7 @@ To upgrade an old deck, download Anki 0.9.8.7.""")) def saveAndClose(self, hideWelcome=False): "(Auto)save and close. Prompt if necessary. True if okay to proceed." self.hideWelcome = hideWelcome + self.closeAllDeckWindows() if self.deck is not None: if self.deck.reviewEarly: self.deck.resetAfterReviewEarly() @@ -725,8 +726,6 @@ To upgrade an old deck, download Anki 0.9.8.7.""")) self.deck = None if not hideWelcome: self.moveToState("noDeck") - else: - self.closeAllDeckWindows() return True def inMainWindow(self): @@ -1586,6 +1585,8 @@ it to your friends. if self.deck is None and self.deckPath is None: # qt on linux incorrectly accepts shortcuts for disabled actions return + # hide all deck-associated dialogs + self.closeAllDeckWindows() if self.deck: # save first, so we can rollback on failure self.deck.save() @@ -1603,8 +1604,6 @@ it to your friends. self.deck.close() self.deck = None self.loadAfterSync = reload - # hide all deck-associated dialogs - self.closeAllDeckWindows() # bug triggered by preferences dialog - underlying c++ widgets are not # garbage collected until the middle of the child thread import gc; gc.collect()