card generation

This commit is contained in:
Damien Elmes 2011-04-13 02:29:43 +09:00
parent 7da7894c89
commit 437297c9b5

View file

@ -12,7 +12,8 @@ import anki, anki.utils, aqt.forms
from anki.utils import fmtTimeSpan, parseTags, hasTag, addTags, delTags, \ from anki.utils import fmtTimeSpan, parseTags, hasTag, addTags, delTags, \
ids2str, stripHTMLMedia ids2str, stripHTMLMedia
from aqt.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter, \ from aqt.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter, \
saveHeader, restoreHeader, saveState, restoreState, applyStyles saveHeader, restoreHeader, saveState, restoreState, applyStyles, getTag, \
showInfo
from anki.errors import * from anki.errors import *
from anki.db import * from anki.db import *
from anki.hooks import runHook, addHook, removeHook from anki.hooks import runHook, addHook, removeHook
@ -317,7 +318,7 @@ class Browser(QMainWindow):
c(f.actionDeleteTag, s, self.deleteTags) c(f.actionDeleteTag, s, self.deleteTags)
c(f.actionReschedule, s, self.reschedule) c(f.actionReschedule, s, self.reschedule)
c(f.actionCram, s, self.cram) c(f.actionCram, s, self.cram)
c(f.actionAddCards, s, self.addCards) c(f.actionAddCards, s, self.genCards)
c(f.actionChangeModel, s, self.onChangeModel) c(f.actionChangeModel, s, self.onChangeModel)
c(f.actionToggleSuspend, SIGNAL("triggered(bool)"), self.onSuspend) c(f.actionToggleSuspend, SIGNAL("triggered(bool)"), self.onSuspend)
c(f.actionToggleMark, SIGNAL("triggered(bool)"), self.onMark) c(f.actionToggleMark, SIGNAL("triggered(bool)"), self.onMark)
@ -689,6 +690,9 @@ where id in %s""" % ids2str(
"select id from cards where fid in (%s)" % "select id from cards where fid in (%s)" %
",".join([str(s) for s in self.selectedFacts()])) ",".join([str(s) for s in self.selectedFacts()]))
# do we need this?
def updateAfterCardChange(self): def updateAfterCardChange(self):
"Refresh info like stats on current card, and rebuild mw queue." "Refresh info like stats on current card, and rebuild mw queue."
self.currentRow = self.form.tableView.currentIndex() self.currentRow = self.form.tableView.currentIndex()
@ -696,6 +700,12 @@ where id in %s""" % ids2str(
self.model.reset() self.model.reset()
self.mw.reset() self.mw.reset()
# Card generation
######################################################################
def genCards(self):
GenCards(self)
# Menu options # Menu options
###################################################################### ######################################################################
@ -829,42 +839,6 @@ where id in %s""" % ids2str(
self.deck.setUndoEnd(n) self.deck.setUndoEnd(n)
self.updateAfterCardChange() self.updateAfterCardChange()
def addCards(self):
sf = self.selectedFacts()
if not sf:
return
mods = self.deck.db.column0("""
select distinct modelId from facts
where id in %s""" % ids2str(sf))
if not len(mods) == 1:
ui.utils.showInfo(
_("Can only operate on one model at a time."),
parent=self)
return
# get cards to enable
cms = [x.id for x in self.deck.db.query(Fact).get(sf[0]).\
model.cardModels]
d = AddCardChooser(self, cms)
if not d.exec_():
return
# for each fact id, generate
n = _("Generate Cards")
self.deck.startProgress()
self.deck.setUndoStart(n)
facts = self.deck.db.query(Fact).filter(
text("id in %s" % ids2str(sf))).order_by(Fact.created).all()
self.deck.updateProgress(_("Generating Cards..."))
ids = []
for c, fact in enumerate(facts):
ids.extend(self.deck.addCards(fact, d.selectedCms))
if c % 50 == 0:
self.deck.updateProgress()
self.deck.flushMod()
self.deck.finishProgress()
self.deck.setUndoEnd(n)
self.onSearch()
self.updateAfterCardChange()
def cram(self): def cram(self):
self.close() self.close()
self.mw.onCram(self.selectedCards()) self.mw.onCram(self.selectedCards())
@ -1140,48 +1114,72 @@ select fm.id, fm.name from fieldmodels fm""")
def onHelp(self): def onHelp(self):
aqt.openHelp("Browser") aqt.openHelp("Browser")
# Generate card dialog # Generate cards
###################################################################### ######################################################################
class AddCardChooser(QDialog): class GenCards(QDialog):
def __init__(self, parent, cms): def __init__(self, browser):
QDialog.__init__(self, parent, Qt.Window) self.browser = browser
self.parent = parent if not self.canShow():
self.cms = cms return
QDialog.__init__(self, browser)
self.form = aqt.forms.addcardmodels.Ui_Dialog() self.form = aqt.forms.addcardmodels.Ui_Dialog()
self.form.setupUi(self) self.form.setupUi(self)
self.connect(self.form.buttonBox, SIGNAL("helpRequested()"), self.connect(self.form.buttonBox, SIGNAL("helpRequested()"),
self.onHelp) self.onHelp)
self.displayCards()
restoreGeom(self, "addCardModels") restoreGeom(self, "addCardModels")
self.getSelection()
def displayCards(self): def canShow(self):
self.cms = self.parent.deck.db.all(""" b = self.browser
select id, name, active from cardModels self.fids = b.selectedFacts()
where id in %s if not self.fids:
order by ordinal""" % ids2str(self.cms)) return
mods = b.deck.db.scalar("""
select count(distinct mid) from facts
where id in %s""" % ids2str(self.fids))
if mods > 1:
showInfo(_("Please select cards from only one model."))
return
return True
def getSelection(self):
# get cards to enable
f = self.browser.deck.getFact(self.fids[0])
self.model = f.model()
self.items = [] self.items = []
for cm in self.cms: for t in self.model.templates:
item = QListWidgetItem(cm[1], self.form.list) item = QListWidgetItem(t['name'], self.form.list)
self.form.list.addItem(item) self.form.list.addItem(item)
self.items.append(item) self.items.append(item)
idx = self.form.list.indexFromItem(item) idx = self.form.list.indexFromItem(item)
if cm[2]: if t['actv']:
mode = QItemSelectionModel.Select mode = QItemSelectionModel.Select
else: else:
mode = QItemSelectionModel.Deselect mode = QItemSelectionModel.Deselect
self.form.list.selectionModel().select(idx, mode) self.form.list.selectionModel().select(idx, mode)
self.show()
def accept(self): def accept(self):
self.selectedCms = [] tplates = []
for i, item in enumerate(self.items): for i, item in enumerate(self.items):
idx = self.form.list.indexFromItem(item) idx = self.form.list.indexFromItem(item)
if self.form.list.selectionModel().isSelected(idx): if self.form.list.selectionModel().isSelected(idx):
self.selectedCms.append(self.cms[i][0]) tplates.append(self.model.templates[i])
self.genCards(tplates)
saveGeom(self, "addCardModels") saveGeom(self, "addCardModels")
QDialog.accept(self) QDialog.accept(self)
def genCards(self, tplates):
mw = self.browser.mw
mw.checkpoint(_("Generate Cards"))
mw.progress.start()
for fid in self.fids:
f = mw.deck.getFact(fid)
mw.deck.genCards(f, tplates)
self.browser.onSearch()
def onHelp(self): def onHelp(self):
aqt.openHelp("Browser#GenerateCards") aqt.openHelp("Browser#GenerateCards")