From b8f03c298bbfbb55b4543e7925f16bbd649dda2c Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sun, 10 Apr 2011 05:54:38 +0900 Subject: [PATCH] showing cards --- aqt/browser.py | 95 +++++++++++++++----------------------------------- 1 file changed, 28 insertions(+), 67 deletions(-) diff --git a/aqt/browser.py b/aqt/browser.py index 0ab73e049..99a6d250b 100644 --- a/aqt/browser.py +++ b/aqt/browser.py @@ -10,7 +10,7 @@ import time, types, sys, re from operator import attrgetter, itemgetter import anki, anki.utils, aqt.forms from anki.utils import fmtTimeSpan, parseTags, hasTag, addTags, delTags, \ - ids2str + ids2str, stripHTMLMedia from aqt.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter, \ saveHeader, restoreHeader, saveState, restoreState, applyStyles from anki.errors import * @@ -20,22 +20,6 @@ from anki.hooks import runHook, addHook, removeHook # - first answered needs updating -CARD_ID = 0 -CARD_QUESTION = 1 -CARD_ANSWER = 2 -CARD_DUE = 3 -CARD_REPS = 4 -CARD_FACTID = 5 -CARD_CREATED = 6 -CARD_MODIFIED = 7 -CARD_INTERVAL = 8 -CARD_EASE = 9 -CARD_NO = 10 -CARD_TYPE = 11 -CARD_TAGS = 12 -CARD_FACTCREATED = 13 -CARD_FIRSTANSWERED = 14 - COLOUR_SUSPENDED1 = "#ffffcc" COLOUR_SUSPENDED2 = "#ffffaa" COLOUR_INACTIVE1 = "#ffcccc" @@ -48,10 +32,10 @@ COLOUR_MARKED2 = "#aaaaff" class DeckModel(QAbstractTableModel): - def __init__(self, parent, deck): + def __init__(self, parent): QAbstractTableModel.__init__(self) self.parent = parent - self.deck = deck + self.deck = parent.deck self.filterTag = None self.sortKey = None # column title, display accessor, sort attr @@ -62,7 +46,7 @@ class DeckModel(QAbstractTableModel): self.searchStr = "" self.lastSearch = "" self.cards = [] - self.deleted = {} + self.cardObjs = {} # Model interface ###################################################################### @@ -78,21 +62,19 @@ class DeckModel(QAbstractTableModel): return QVariant() if role == Qt.FontRole: f = QFont() - f.setPixelSize(self.parent.config['editFontSize']) + f.setPixelSize(self.parent.mw.config['editFontSize']) return QVariant(f) if role == Qt.TextAlignmentRole and index.column() == 2: return QVariant(Qt.AlignHCenter) elif role == Qt.DisplayRole or role == Qt.EditRole: - if len(self.cards[index.row()]) == 1: - # not cached yet - self.updateCard(index) + c = self.getCard(index) s = self.columns[index.column()][1](index) s = self.limitContent(s) s = s.replace("
", u" ") s = s.replace("
", u" ") s = s.replace("\n", u" ") s = re.sub("\[sound:[^]]+\]", "", s) - s = stripHTMLAlt(s) + s = stripHTMLMedia(s) s = s.strip() return QVariant(s) else: @@ -125,56 +107,37 @@ class DeckModel(QAbstractTableModel): ###################################################################### def showMatching(self, force=True): - return + self.cards = self.deck.findCards(self.searchStr.strip(), "factFld") # if self.deck.getInt('reverseOrder'): # self.cards.reverse() self.reset() - def updateCard(self, index): - try: - self.cards[index.row()] = self.deck.db.first(""" -select id, question, answer, due, reps, factId, created, modified, -interval, factor, lapses, type, (select tags from facts where -facts.id = cards.factId), (select created from facts where -facts.id = cards.factId) from cards where id = :id""", - id=self.cards[index.row()][0]) - self.emit(SIGNAL("layoutChanged()")) - except: - # called after search changed - pass - def refresh(self): - self.cards = [[x[0]] for x in self.cards] + self.cardObjs = {} self.emit(SIGNAL("layoutChanged()")) # Tools ###################################################################### - def getCardID(self, index): - return self.cards[index.row()][0] - def getCard(self, index): - try: - return self.deck.db.query(Card).get(self.getCardID(index)) - except IndexError: - return None - - def cardIndex(self, card): - "Return the index of CARD, if currently displayed." - return self.cards.index(card) + id = self.cards[index.row()] + if not id in self.cardObjs: + self.cardObjs[id] = self.deck.getCard(id) + return self.cardObjs[id] def currentQuestion(self, index): - return self.cards[index.row()][CARD_QUESTION] + return self.getCard(index).q() def currentAnswer(self, index): - return self.cards[index.row()][CARD_ANSWER] + return self.getCard(index).a() def nextDue(self, index): - d = self.cards[index.row()][CARD_DUE] - reps = self.cards[index.row()][CARD_REPS] + c = self.getCard(index) + d = c.due + reps = c.reps secs = d - time.time() if secs <= 0: - if not reps and self.deck.newCardOrder == 0: + if not reps: return _("(new card)") else: return _("%s ago") % fmtTimeSpan(abs(secs), pad=0) @@ -262,10 +225,8 @@ class StatusDelegate(QItemDelegate): self.model = model def paint(self, painter, option, index): - if len(self.model.cards[index.row()]) == 1: - self.model.updateCard(index) - row = self.model.cards[index.row()] - if row[CARD_TYPE] < 0: + c = self.model.getCard(index) + if c.queue < 0: # custom render if index.row() % 2 == 0: brush = QBrush(QColor(COLOUR_SUSPENDED1)) @@ -274,7 +235,7 @@ class StatusDelegate(QItemDelegate): painter.save() painter.fillRect(option.rect, brush) painter.restore() - elif "Marked" in row[CARD_TAGS]: + elif c.fact().hasTag("Marked"): if index.row() % 2 == 0: brush = QBrush(QColor(COLOUR_MARKED1)) else: @@ -305,7 +266,7 @@ class Browser(QMainWindow): self.mw.config['iconSize'])) self.dialog.toolBar.toggleViewAction().setText(_("Toggle Toolbar")) # flush all changes before we load - self.model = DeckModel(self.mw, self.mw.deck) + self.model = DeckModel(self) self.dialog.tableView.setSortingEnabled(False) self.dialog.tableView.setShowGrid(False) self.dialog.tableView.setModel(self.model) @@ -543,8 +504,8 @@ class Browser(QMainWindow): self.updateAfterCardChange() else: # update list - if self.currentRow and self.model.cards: - self.model.updateCard(self.currentRow) + # if self.currentRow and self.model.cards: + # self.model.updateCard(self.currentRow) if type == "tag": self.drawTags() @@ -690,8 +651,8 @@ class Browser(QMainWindow): if not self.currentCard: self.editor.setFact(None, True) return - fact = self.currentCard.fact - self.editor.setFact(fact, True) + fact = self.currentCard.fact() + self.editor.setFact(fact) self.editor.card = self.currentCard self.showCardInfo(self.currentCard) self.onEvent() @@ -820,7 +781,7 @@ where id in (%s)""" % ",".join([ self.updateAfterCardChange() def isMarked(self): - return self.currentCard and "Marked" in self.currentCard.fact.tags + return self.currentCard and self.currentCard.fact().hasTag("Marked") def onMark(self, mark): if mark: