diff --git a/aqt/main.py b/aqt/main.py index e00c7500f..c3ea36957 100755 --- a/aqt/main.py +++ b/aqt/main.py @@ -65,7 +65,6 @@ class AnkiQt(QMainWindow): self.setupAutoUpdate() self.setupCardStats() self.setupSchema() - self.setupEmptyCardDel() self.updateTitleBar() # screens self.setupDeckBrowser() @@ -768,6 +767,7 @@ upload, overwriting any changes either here or on AnkiWeb. Proceed?""")): self.connect(m.actionDonate, s, self.onDonate) self.connect(m.actionFullSync, s, self.onFullSync) self.connect(m.actionStudyDeck, s, self.onStudyDeck) + self.connect(m.actionEmptyCards, s, self.onEmptyCards) def updateTitleBar(self): self.setWindowTitle("Anki") @@ -825,18 +825,6 @@ you next synchronize your collection. If you have reviews or other changes \ waiting on another device that haven't been synchronized here yet, they \ will be lost. Continue?""")) - # Empty card deletion - ########################################################################## - - def setupEmptyCardDel(self): - addHook("remEmptyCards", self.onEmptyCards) - - def onEmptyCards(self, flag, cnt): - if flag and askUser(_("""\ -Your edits have left %d cards empty. Do you want to delete them?""" % cnt)): - return flag - return False - # Advanced features ########################################################################## @@ -906,6 +894,27 @@ Your edits have left %d cards empty. Do you want to delete them?""" % cnt)): from aqt.studydeck import StudyDeck StudyDeck(self) + def onEmptyCards(self): + self.progress.start(immediate=True) + cids = self.col.emptyCids() + if not cids: + self.progress.finish() + tooltip(_("No empty cards.")) + return + report = self.col.emptyCardReport(cids) + self.progress.finish() + diag, box = showText( + _("%d cards to delete:\n\n%s") % (len(cids), report), run=False) + box.addButton(_("Delete Cards"), QDialogButtonBox.AcceptRole) + box.button(QDialogButtonBox.Close).setDefault(True) + def onDelete(): + QDialog.accept(diag) + self.checkpoint(_("Delete Empty")) + self.col.remCards(cids) + tooltip(_("%d cards deleted.") % len(cids)) + diag.connect(box, SIGNAL("accepted()"), onDelete) + diag.exec_() + # System specific code ########################################################################## diff --git a/aqt/utils.py b/aqt/utils.py index f9a5a875d..5635c1427 100644 --- a/aqt/utils.py +++ b/aqt/utils.py @@ -47,7 +47,7 @@ def showInfo(text, parent=None, help="", type="info"): b.setAutoDefault(False) return mb.exec_() -def showText(txt, parent=None, type="text"): +def showText(txt, parent=None, type="text", run=True): if not parent: parent = aqt.mw.app.activeWindow() or aqt.mw diag = QDialog(parent) @@ -66,7 +66,10 @@ def showText(txt, parent=None, type="text"): diag.connect(box, SIGNAL("rejected()"), diag, SLOT("reject()")) diag.setMinimumHeight(400) diag.setMinimumWidth(500) - diag.exec_() + if run: + diag.exec_() + else: + return diag, box def askUser(text, parent=None, help="", defaultno=False): "Show a yes/no question. Return true if yes." diff --git a/designer/main.ui b/designer/main.ui index 114a3bb24..1d29b1296 100644 --- a/designer/main.ui +++ b/designer/main.ui @@ -101,13 +101,20 @@ + + + Maintenance + + + + + + - - - + @@ -259,6 +266,11 @@ / + + + Empty Cards... + +