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): def closeAll(self):
for (n, (klass, obj)) in self.modelessDialogs.items(): for (n, (klass, obj)) in self.modelessDialogs.items():
if obj: if obj:
obj.hide() obj.forceClose = True
obj.close()
self.close(n) self.close(n)
# since we load the graphs dynamically, we need a proxy for this # since we load the graphs dynamically, we need a proxy for this

View file

@ -27,6 +27,7 @@ class AddCards(QDialog):
self.setupStatus() self.setupStatus()
self.modelChanged(self.parent.deck.currentModel) self.modelChanged(self.parent.deck.currentModel)
self.addedItems = 0 self.addedItems = 0
self.forceClose = False
restoreGeom(self, "add") restoreGeom(self, "add")
restoreSplitter(self.dialog.splitter, "add") restoreSplitter(self.dialog.splitter, "add")
self.show() self.show()
@ -152,9 +153,10 @@ question or answer on all cards."""), parent=self)
def onClose(self): def onClose(self):
# stop anything playing # stop anything playing
clearAudioQueue() clearAudioQueue()
if (self.editor.fieldsAreBlank() or if (self.forceClose or self.editor.fieldsAreBlank() or
ui.utils.askUser(_("Close and lose current input?"), ui.utils.askUser(_("Close and lose current input?"),
self)): self)):
self.editor.close()
ui.dialogs.close("AddCards") ui.dialogs.close("AddCards")
self.parent.deck.s.flush() self.parent.deck.s.flush()
self.parent.deck.rebuildCSS() self.parent.deck.rebuildCSS()

View file

@ -18,7 +18,7 @@ from ankiqt.ui.utils import saveHeader, restoreHeader
from anki.errors import * from anki.errors import *
from anki.db import * from anki.db import *
from anki.stats import CardStats from anki.stats import CardStats
from anki.hooks import runHook, addHook from anki.hooks import runHook, addHook, removeHook
CARD_ID = 0 CARD_ID = 0
CARD_QUESTION = 1 CARD_QUESTION = 1
@ -284,6 +284,7 @@ class EditDeck(QMainWindow):
self.parent = parent self.parent = parent
self.deck = self.parent.deck self.deck = self.parent.deck
self.config = parent.config self.config = parent.config
self.forceClose = False
self.origModTime = parent.deck.modified self.origModTime = parent.deck.modified
self.currentRow = None self.currentRow = None
self.dialog = ankiqt.forms.cardlist.Ui_MainWindow() self.dialog = ankiqt.forms.cardlist.Ui_MainWindow()
@ -552,17 +553,20 @@ class EditDeck(QMainWindow):
def onClose(self): def onClose(self):
saveSplitter(self.dialog.splitter, "editor") saveSplitter(self.dialog.splitter, "editor")
self.editor.saveFieldsNow() self.editor.saveFieldsNow()
if not self.factValid: if not self.forceClose:
ui.utils.showInfo(_( if not self.factValid:
"Some fields are missing or not unique."), ui.utils.showInfo(_(
parent=self, help="AddItems#AddError") "Some fields are missing or not unique."),
return parent=self, help="AddItems#AddError")
return
self.editor.setFact(None) self.editor.setFact(None)
self.editor.close()
saveGeom(self, "editor") saveGeom(self, "editor")
saveHeader(self.dialog.tableView.horizontalHeader(), "editor") saveHeader(self.dialog.tableView.horizontalHeader(), "editor")
self.hide() self.hide()
ui.dialogs.close("CardList") ui.dialogs.close("CardList")
self.parent.moveToState("auto") self.parent.moveToState("auto")
self.teardownUndo()
return True return True
def closeEvent(self, evt): def closeEvent(self, evt):
@ -807,6 +811,9 @@ where id in %s""" % ids2str(sf))
def setupUndo(self): def setupUndo(self):
addHook("postUndoRedo", self.postUndoRedo) addHook("postUndoRedo", self.postUndoRedo)
def teardownUndo(self):
removeHook("postUndoRedo", self.postUndoRedo)
def postUndoRedo(self): def postUndoRedo(self):
self.updateFilterLabel() self.updateFilterLabel()
self.updateSearch() self.updateSearch()

View file

@ -13,7 +13,7 @@ import anki.sound
from ankiqt import ui from ankiqt import ui
import ankiqt import ankiqt
from ankiqt.ui.utils import mungeQA, saveGeom, restoreGeom from ankiqt.ui.utils import mungeQA, saveGeom, restoreGeom
from anki.hooks import addHook from anki.hooks import addHook, removeHook
from sqlalchemy.exceptions import InvalidRequestError from sqlalchemy.exceptions import InvalidRequestError
clozeColour = "#0000ff" clozeColour = "#0000ff"
@ -41,6 +41,10 @@ class FactEditor(object):
addHook("deckClosed", self.deckClosedHook) addHook("deckClosed", self.deckClosedHook)
addHook("guiReset", self.refresh) addHook("guiReset", self.refresh)
def close(self):
removeHook("deckClosed", self.deckClosedHook)
removeHook("guiReset", self.refresh)
def setFact(self, fact, noFocus=False, check=False): def setFact(self, fact, noFocus=False, check=False):
"Make FACT the current fact." "Make FACT the current fact."
self.fact = 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): def saveAndClose(self, hideWelcome=False):
"(Auto)save and close. Prompt if necessary. True if okay to proceed." "(Auto)save and close. Prompt if necessary. True if okay to proceed."
self.hideWelcome = hideWelcome self.hideWelcome = hideWelcome
self.closeAllDeckWindows()
if self.deck is not None: if self.deck is not None:
if self.deck.reviewEarly: if self.deck.reviewEarly:
self.deck.resetAfterReviewEarly() self.deck.resetAfterReviewEarly()
@ -725,8 +726,6 @@ To upgrade an old deck, download Anki 0.9.8.7."""))
self.deck = None self.deck = None
if not hideWelcome: if not hideWelcome:
self.moveToState("noDeck") self.moveToState("noDeck")
else:
self.closeAllDeckWindows()
return True return True
def inMainWindow(self): def inMainWindow(self):
@ -1586,6 +1585,8 @@ it to your friends.
if self.deck is None and self.deckPath is None: if self.deck is None and self.deckPath is None:
# qt on linux incorrectly accepts shortcuts for disabled actions # qt on linux incorrectly accepts shortcuts for disabled actions
return return
# hide all deck-associated dialogs
self.closeAllDeckWindows()
if self.deck: if self.deck:
# save first, so we can rollback on failure # save first, so we can rollback on failure
self.deck.save() self.deck.save()
@ -1603,8 +1604,6 @@ it to your friends.
self.deck.close() self.deck.close()
self.deck = None self.deck = None
self.loadAfterSync = reload self.loadAfterSync = reload
# hide all deck-associated dialogs
self.closeAllDeckWindows()
# bug triggered by preferences dialog - underlying c++ widgets are not # bug triggered by preferences dialog - underlying c++ widgets are not
# garbage collected until the middle of the child thread # garbage collected until the middle of the child thread
import gc; gc.collect() import gc; gc.collect()