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 @@
+
-
-
-
+
@@ -259,6 +266,11 @@
/
+
+
+ Empty Cards...
+
+