close(not hide) deck windows before deck close, remove stale hooks

This commit is contained in:
Damien Elmes 2009-03-28 22:51:38 +09:00
parent a48f0fd649
commit a601268d4c
5 changed files with 26 additions and 13 deletions

View file

@ -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

View file

@ -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()

View file

@ -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()

View file

@ -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

View file

@ -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()