card deletion, progress on genCards

This commit is contained in:
Damien Elmes 2011-04-13 03:27:12 +09:00
parent a84cc55819
commit 5831309280

View file

@ -96,14 +96,20 @@ class DeckModel(QAbstractTableModel):
# Filtering # Filtering
###################################################################### ######################################################################
def search(self, txt): def search(self, txt, reset=True):
self.beginReset() if reset:
self.beginReset()
t = time.time() t = time.time()
# the db progress handler may cause a refresh, so we need to zero out
# old data first
self.cards = []
self.cards = self.deck.findCards(txt) self.cards = self.deck.findCards(txt)
print "fetch cards in %dms" % ((time.time() - t)*1000) print "fetch cards in %dms" % ((time.time() - t)*1000)
self.endReset() if reset:
self.endReset()
def beginReset(self): def beginReset(self):
self.browser.editor.saveNow()
self.browser.mw.progress.start() self.browser.mw.progress.start()
self.saveSelection() self.saveSelection()
self.beginResetModel() self.beginResetModel()
@ -125,7 +131,10 @@ class DeckModel(QAbstractTableModel):
def saveSelection(self): def saveSelection(self):
cards = self.browser.selectedCards() cards = self.browser.selectedCards()
self.selectedCards = dict([(id, True) for id in cards]) self.selectedCards = dict([(id, True) for id in cards])
self.focusedCard = getattr(self.browser, 'card', None) if getattr(self.browser, 'card', None):
self.focusedCard = self.browser.card.id
else:
self.focusedCard = None
def restoreSelection(self): def restoreSelection(self):
if not self.cards: if not self.cards:
@ -145,7 +154,7 @@ class DeckModel(QAbstractTableModel):
if not first: if not first:
first = idx first = idx
# note idx of focused card # note idx of focused card
if self.focusedCard and self.focusedCard.id == id: if self.focusedCard:
focused = idx focused = idx
# avoid further comparisons # avoid further comparisons
self.focusedCard = None self.focusedCard = None
@ -198,6 +207,8 @@ class DeckModel(QAbstractTableModel):
elif type == "cardIvl": elif type == "cardIvl":
return fmtTimeSpan(c.ivl*86400) return fmtTimeSpan(c.ivl*86400)
elif type == "cardEase": elif type == "cardEase":
if c.type == 0:
return _("(new)")
return "%d%%" % (c.factor/10) return "%d%%" % (c.factor/10)
# def intervalColumn(self, index): # def intervalColumn(self, index):
@ -223,7 +234,7 @@ class DeckModel(QAbstractTableModel):
def nextDue(self, c, index): def nextDue(self, c, index):
if c.type == 0: if c.type == 0:
return _("(new card)") return _("(new)")
elif c.type == 1: elif c.type == 1:
date = c.due date = c.due
elif c.type == 2: elif c.type == 2:
@ -402,9 +413,9 @@ class Browser(QMainWindow):
self.onSearch) self.onSearch)
self.setTabOrder(self.form.searchEdit, self.form.tableView) self.setTabOrder(self.form.searchEdit, self.form.tableView)
def onSearch(self): def onSearch(self, reset=True):
txt = unicode(self.form.searchEdit.text()).strip() txt = unicode(self.form.searchEdit.text()).strip()
self.model.search(txt) self.model.search(txt, reset)
if not self.model.cards: if not self.model.cards:
# no row change will fire # no row change will fire
self.onRowChanged(None, None) self.onRowChanged(None, None)
@ -690,15 +701,11 @@ 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()]))
def resetDeck(self):
"Signal the queue needs rebuilding."
# do we need this? # for operations that change models we'll need to reset immediately,
def updateAfterCardChange(self): # but otherwise we can put it off until the user starts studying again
"Refresh info like stats on current card, and rebuild mw queue." print "fixme: resetDeck()"
self.currentRow = self.form.tableView.currentIndex()
self.rowChanged(self.currentRow, None)
self.model.reset()
self.mw.reset()
# Card generation # Card generation
###################################################################### ######################################################################
@ -709,31 +716,17 @@ where id in %s""" % ids2str(
# Menu options # Menu options
###################################################################### ######################################################################
def cardRow(self):
try:
return self.model.cards.index(self.card.id)
except:
return -1
def deleteCards(self): def deleteCards(self):
cards = self.selectedCards() self.mw.checkpoint(_("Delete Cards"))
n = _("Delete Cards") self.model.beginReset()
try: oldRow = self.form.tableView.selectionModel().currentIndex().row()
new = self.cardRow() + 1 self.deck.delCards(self.selectedCards())
except: self.onSearch(reset=False)
# card has been deleted if len(self.model.cards):
return new = min(oldRow, len(self.model.cards) - 1)
# ensure the change timer doesn't fire after deletion but before reset self.model.focusedCard = self.model.cards[new]
self.editor.saveNow() self.model.endReset()
self.editor.fact = None self.resetDeck()
self.form.tableView.setFocus()
self.deck.setUndoStart(n)
self.deck.deleteCards(cards)
self.deck.setUndoEnd(n)
new = min(max(0, new), len(self.model.cards) - 1)
self.form.tableView.selectRow(new)
self.onSearch()
self.updateAfterCardChange()
def addTags(self, tags=None, label=None): def addTags(self, tags=None, label=None):
# focus lost hook may not have chance to fire # focus lost hook may not have chance to fire
@ -748,7 +741,7 @@ where id in %s""" % ids2str(
self.deck.setUndoStart(label) self.deck.setUndoStart(label)
self.deck.addTags(self.selectedFacts(), tags) self.deck.addTags(self.selectedFacts(), tags)
self.deck.setUndoEnd(label) self.deck.setUndoEnd(label)
self.updateAfterCardChange() self.onSearch()
def deleteTags(self, tags=None, label=None): def deleteTags(self, tags=None, label=None):
# focus lost hook may not have chance to fire # focus lost hook may not have chance to fire
@ -763,7 +756,7 @@ where id in %s""" % ids2str(
self.deck.setUndoStart(label) self.deck.setUndoStart(label)
self.deck.deleteTags(self.selectedFacts(), tags) self.deck.deleteTags(self.selectedFacts(), tags)
self.deck.setUndoEnd(label) self.deck.setUndoEnd(label)
self.updateAfterCardChange() self.onSearch()
def updateToggles(self): def updateToggles(self):
self.form.actionToggleSuspend.setChecked(self.isSuspended()) self.form.actionToggleSuspend.setChecked(self.isSuspended())
@ -787,7 +780,7 @@ where id in %s""" % ids2str(
self.mw.reset() self.mw.reset()
self.deck.setUndoEnd(n) self.deck.setUndoEnd(n)
self.model.reset() self.model.reset()
self.updateAfterCardChange() self.resetDeck()
def _onUnsuspend(self): def _onUnsuspend(self):
n = _("Unsuspend") n = _("Unsuspend")
@ -796,7 +789,7 @@ where id in %s""" % ids2str(
self.mw.reset() self.mw.reset()
self.deck.setUndoEnd(n) self.deck.setUndoEnd(n)
self.model.reset() self.model.reset()
self.updateAfterCardChange() self.resetDeck()
def isMarked(self): def isMarked(self):
return self.card and self.card.fact().hasTag("Marked") return self.card and self.card.fact().hasTag("Marked")
@ -837,7 +830,7 @@ where id in %s""" % ids2str(
finally: finally:
self.deck.reset() self.deck.reset()
self.deck.setUndoEnd(n) self.deck.setUndoEnd(n)
self.updateAfterCardChange() self.resetDeck()
def cram(self): def cram(self):
self.close() self.close()
@ -862,7 +855,7 @@ where id in %s""" % ids2str(sf))
self.deck.changeModel(sf, *d.ret) self.deck.changeModel(sf, *d.ret)
self.deck.setUndoEnd(n) self.deck.setUndoEnd(n)
self.onSearch() self.onSearch()
self.updateAfterCardChange() self.resetDeck()
# Edit: selection # Edit: selection
###################################################################### ######################################################################
@ -969,7 +962,6 @@ where id in %s""" % ids2str(sf))
self.deck.finishProgress() self.deck.finishProgress()
self.mw.reset() self.mw.reset()
self.onSearch() self.onSearch()
self.updateAfterCardChange()
if changed is not None: if changed is not None:
ui.utils.showInfo(ngettext("%(a)d of %(b)d fact updated", "%(a)d of %(b)d facts updated", len(sf)) % { ui.utils.showInfo(ngettext("%(a)d of %(b)d fact updated", "%(a)d of %(b)d facts updated", len(sf)) % {
'a': changed, 'a': changed,
@ -1175,9 +1167,12 @@ where id in %s""" % ids2str(self.fids))
mw = self.browser.mw mw = self.browser.mw
mw.checkpoint(_("Generate Cards")) mw.checkpoint(_("Generate Cards"))
mw.progress.start() mw.progress.start()
for fid in self.fids: for c, fid in enumerate(self.fids):
f = mw.deck.getFact(fid) f = mw.deck.getFact(fid)
mw.deck.genCards(f, tplates) mw.deck.genCards(f, tplates)
if c % 100 == 0:
mw.progress.update()
mw.progress.finish()
self.browser.onSearch() self.browser.onSearch()
def onHelp(self): def onHelp(self):