fix stats, start work on revamped overview

This commit is contained in:
Damien Elmes 2011-11-26 13:20:55 +09:00
parent 67c2ccc954
commit 5f1b762a15
9 changed files with 57 additions and 66 deletions

View file

@ -25,8 +25,7 @@ class DeckBrowser(object):
else: else:
cmd = url cmd = url
if cmd == "open": if cmd == "open":
deck = self._decks[int(arg)] self._selDeck(arg)
self._selDeck(deck)
elif cmd == "opts": elif cmd == "opts":
self._optsForRow(int(arg)) self._optsForRow(int(arg))
elif cmd == "download": elif cmd == "download":
@ -42,8 +41,9 @@ class DeckBrowser(object):
elif cmd == "refresh": elif cmd == "refresh":
self.refresh() self.refresh()
def _selDeck(self, rec): def _selDeck(self, did):
print rec self.mw.col.decks.select(did)
self.mw.moveToState("overview")
# HTML generation # HTML generation
########################################################################## ##########################################################################

View file

@ -190,7 +190,7 @@ Are you sure?"""):
self.onSync() self.onSync()
# then load collection and launch into the deck browser # then load collection and launch into the deck browser
self.col = Collection(self.pm.collectionPath()) self.col = Collection(self.pm.collectionPath())
self.moveToState("deckBrowser") self.moveToState("overview")
def unloadProfile(self): def unloadProfile(self):
self.col = None self.col = None
@ -227,6 +227,7 @@ Are you sure?"""):
self.reviewer.show() self.reviewer.show()
def _reviewCleanup(self, newState): def _reviewCleanup(self, newState):
print "rethink cleanup code?"
if newState != "resetRequired": if newState != "resetRequired":
self.reviewer.cleanup() self.reviewer.cleanup()

View file

@ -15,7 +15,7 @@ class ModelChooser(QHBoxLayout):
QHBoxLayout.__init__(self) QHBoxLayout.__init__(self)
self.widget = widget self.widget = widget
self.mw = mw self.mw = mw
self.deck = mw.deck self.deck = mw.col
self.handleCards = cards self.handleCards = cards
self.label = label self.label = label
self._ignoreReset = False self._ignoreReset = False
@ -151,7 +151,7 @@ class AddModel(QDialog):
def __init__(self, mw, parent=None): def __init__(self, mw, parent=None):
self.parent = parent or mw self.parent = parent or mw
self.mw = mw self.mw = mw
self.deck = mw.deck self.deck = mw.col
QDialog.__init__(self, self.parent, Qt.Window) QDialog.__init__(self, self.parent, Qt.Window)
self.model = None self.model = None
self.dialog = aqt.forms.addmodel.Ui_Dialog() self.dialog = aqt.forms.addmodel.Ui_Dialog()
@ -191,7 +191,7 @@ class AddModel(QDialog):
self.model = model(self.deck) self.model = model(self.deck)
else: else:
# add copy to deck # add copy to deck
self.mw.deck.addModel(model) self.mw.col.addModel(model)
self.model = model self.model = model
QDialog.accept(self) QDialog.accept(self)

View file

@ -10,7 +10,7 @@ class Models(QDialog):
self.mw = mw self.mw = mw
self.parent = parent or mw self.parent = parent or mw
QDialog.__init__(self, self.parent, Qt.Window) QDialog.__init__(self, self.parent, Qt.Window)
self.deck = mw.deck self.deck = mw.col
self.mw.checkpoint(_("Models")) self.mw.checkpoint(_("Models"))
self.form = aqt.forms.models.Ui_Dialog() self.form = aqt.forms.models.Ui_Dialog()
self.form.setupUi(self) self.form.setupUi(self)

View file

@ -17,7 +17,6 @@ class Overview(object):
addHook("reset", self.refresh) addHook("reset", self.refresh)
def show(self): def show(self):
self._setupToolbar()
self.web.setKeyHandler(self._keyHandler) self.web.setKeyHandler(self._keyHandler)
self.web.setLinkHandler(self._linkHandler) self.web.setLinkHandler(self._linkHandler)
self.refresh() self.refresh()
@ -41,11 +40,11 @@ class Overview(object):
def _linkHandler(self, url): def _linkHandler(self, url):
print "link", url print "link", url
if url == "study": if url == "study":
self.mw.deck.reset() self.mw.col.reset()
self.mw.moveToState("review") self.mw.moveToState("review")
elif url == "cram": elif url == "cram":
return showInfo("not yet implemented") return showInfo("not yet implemented")
#self.mw.deck.cramGroups() #self.mw.col.cramGroups()
#self.mw.moveToState("review") #self.mw.moveToState("review")
elif url == "opts": elif url == "opts":
self.mw.onStudyOptions() self.mw.onStudyOptions()
@ -60,18 +59,28 @@ class Overview(object):
fc = self._ovForecast() fc = self._ovForecast()
tbl = self._overviewTable() tbl = self._overviewTable()
but = self.mw.button but = self.mw.button
deck = self.mw.col.decks.current()
dname = deck['name']
sid = deck.get("sharedFrom")
if True: # sid:
shareLink = '<a class=smallLink href="review">Reviews and Updates</a>'
else:
shareLink = ""
self.web.stdHtml(self._overviewBody % dict( self.web.stdHtml(self._overviewBody % dict(
title=_("Overview"), title=_("Overview"),
table=tbl, table=tbl,
fcsub=_("Reviews over next two weeks"), fcsub=_("Reviews over next two weeks"),
deck=deck['name'],
shareLink=shareLink,
desc="",
fcdata=fc, fcdata=fc,
), css) ), css)
_overviewBody = """ _overviewBody = """
<center> <center>
<h1>%(title)s</h1> <h3>%(deck)s</h3>
<p> %(shareLink)s
%(table)s %(desc)s
<p> <p>
<div id="placeholder" style="width:350px; height:100px;"></div> <div id="placeholder" style="width:350px; height:100px;"></div>
<span class=sub>%(fcsub)s</span> <span class=sub>%(fcsub)s</span>
@ -101,10 +110,12 @@ $(function () {
.due { text-align: right; } .due { text-align: right; }
.new { text-align: right; } .new { text-align: right; }
.sub { font-size: 80%; color: #555; } .sub { font-size: 80%; color: #555; }
.smallLink { font-size: 12px; }
h3 { margin-bottom: 0; }
""" """
def _overviewTable(self): def _overviewTable(self):
counts = self._ovCounts() return ""
but = self.mw.button but = self.mw.button
buf = "<table cellspacing=0 cellpadding=3 width=400>" buf = "<table cellspacing=0 cellpadding=3 width=400>"
buf += "<tr><th></th><th align=right>%s</th>" % _("Due") buf += "<tr><th></th><th align=right>%s</th>" % _("Due")
@ -129,27 +140,8 @@ $(function () {
# Data # Data
########################################################################## ##########################################################################
def _ovCounts(self):
# we have the limited count already
selcnt = [0,0,0] #self.mw.deck.sched.selCounts()
allcnt = [0,0,0] #self.mw.deck.sched.allCounts()
return [
limitedCount(selcnt[1] + selcnt[2]),
selcnt[0],
limitedCount(allcnt[1] + allcnt[2]),
allcnt[0],
]
def _ovForecast(self): def _ovForecast(self):
fc = self.mw.deck.sched.dueForecast(14) fc = self.mw.col.sched.dueForecast(14)
if not sum(fc): if not sum(fc):
return "'%s'" % _('No cards due in next two weeks') return "'%s'" % _('No cards due in next two weeks')
return simplejson.dumps(tuple(enumerate(fc))) return simplejson.dumps(tuple(enumerate(fc)))
# Toolbar
##########################################################################
def _setupToolbar(self):
if not self.mw.config['showToolbar']:
return
self.mw.form.toolBar.show()

View file

@ -37,7 +37,7 @@ class Reviewer(object):
def lastCard(self): def lastCard(self):
if self._answeredIds: if self._answeredIds:
if not self.card or self._answeredIds[-1] != self.card.id: if not self.card or self._answeredIds[-1] != self.card.id:
return self.mw.deck.getCard(self._answeredIds[-1]) return self.mw.col.getCard(self._answeredIds[-1])
def cleanup(self): def cleanup(self):
self._hideStatus() self._hideStatus()
@ -52,7 +52,7 @@ class Reviewer(object):
# a card has been retrieved from undo # a card has been retrieved from undo
c = self.cardQueue.pop() c = self.cardQueue.pop()
else: else:
c = self.mw.deck.sched.getCard() c = self.mw.col.sched.getCard()
self.card = c self.card = c
clearAudioQueue() clearAudioQueue()
if c: if c:
@ -65,7 +65,7 @@ class Reviewer(object):
else: else:
self._hideStatus() self._hideStatus()
self.mw.disableCardMenuItems() self.mw.disableCardMenuItems()
if self.mw.deck.cardCount(): if self.mw.col.cardCount():
self._showCongrats() self._showCongrats()
else: else:
self._showEmpty() self._showEmpty()
@ -184,7 +184,7 @@ $(".ansbut").focus();
if self.mw.config['autoplaySounds']: if self.mw.config['autoplaySounds']:
playFromText(q) playFromText(q)
# render # render
esc = self.mw.deck.media.escapeImages esc = self.mw.col.media.escapeImages
q=esc(mungeQA(q)) + self.typeAnsInput() q=esc(mungeQA(q)) + self.typeAnsInput()
a=esc(mungeQA(a)) a=esc(mungeQA(a))
self.web.eval("_updateQA(%s);" % simplejson.dumps( self.web.eval("_updateQA(%s);" % simplejson.dumps(
@ -208,13 +208,13 @@ $(".ansbut").focus();
########################################################################## ##########################################################################
def _defaultEase(self): def _defaultEase(self):
if self.mw.deck.sched.answerButtons(self.card) == 4: if self.mw.col.sched.answerButtons(self.card) == 4:
return 3 return 3
else: else:
return 2 return 2
def _answerButtons(self): def _answerButtons(self):
if self.mw.deck.sched.answerButtons(self.card) == 4: if self.mw.col.sched.answerButtons(self.card) == 4:
labels = (_("Again"), _("Hard"), _("Good"), _("Easy")) labels = (_("Again"), _("Hard"), _("Good"), _("Easy"))
else: else:
labels = (_("Again"), _("Good"), _("Easy")) labels = (_("Again"), _("Good"), _("Easy"))
@ -240,7 +240,7 @@ $(".ansbut").focus();
def _buttonTime(self, i, green): def _buttonTime(self, i, green):
if self.mw.config['suppressEstimates']: if self.mw.config['suppressEstimates']:
return "" return ""
txt = self.mw.deck.sched.nextIvlStr(self.card, i+1, True) txt = self.mw.col.sched.nextIvlStr(self.card, i+1, True)
if i == 0: if i == 0:
txt = '<span style="color: #700">%s</span>' % txt txt = '<span style="color: #700">%s</span>' % txt
elif i == green: elif i == green:
@ -252,7 +252,7 @@ $(".ansbut").focus();
def _answerCard(self, ease): def _answerCard(self, ease):
"Reschedule card and show next." "Reschedule card and show next."
self.mw.deck.sched.answerCard(self.card, ease) self.mw.col.sched.answerCard(self.card, ease)
self._answeredIds.append(self.card.id) self._answeredIds.append(self.card.id)
self.mw.autosave() self.mw.autosave()
self.nextCard() self.nextCard()
@ -373,7 +373,7 @@ div#filler {
def _styles(self): def _styles(self):
css = self.mw.sharedCSS css = self.mw.sharedCSS
css += self.mw.deck.models.css() css += self.mw.col.models.css()
css += self._css css += self._css
return css return css
@ -401,7 +401,7 @@ div#filler {
def processTypedAns(self, given): def processTypedAns(self, given):
ord = self.typeAns() ord = self.typeAns()
try: try:
cor = self.mw.deck.media.strip( cor = self.mw.col.media.strip(
stripHTML(self.card.note().fields[ord])) stripHTML(self.card.note().fields[ord]))
except IndexError: except IndexError:
self.card.template()['typeAns'] = None self.card.template()['typeAns'] = None
@ -481,7 +481,7 @@ div#filler {
<p> <p>
%s %s
<script>$("#ov").focus();</script> <script>$("#ov").focus();</script>
</center>""" % (self.mw.deck.sched.finishedMsg(), </center>""" % (self.mw.col.sched.finishedMsg(),
self.mw.button(key="o", name=_("Overview"), link="ov", id='ov')) self.mw.button(key="o", name=_("Overview"), link="ov", id='ov'))
self.web.stdHtml(buf, css=self.mw.sharedCSS) self.web.stdHtml(buf, css=self.mw.sharedCSS)
runHook('deckFinished') runHook('deckFinished')
@ -574,8 +574,8 @@ div#filler {
# fixme: only show progress for reviews, and only when revs due? # fixme: only show progress for reviews, and only when revs due?
def _updateRemaining(self): def _updateRemaining(self):
counts = list(self.mw.deck.sched.repCounts()) counts = list(self.mw.col.sched.repCounts())
idx = self.mw.deck.sched.countIdx(self.card) idx = self.mw.col.sched.countIdx(self.card)
counts[idx] = "<u>%s</u>" % (counts[idx]+1) counts[idx] = "<u>%s</u>" % (counts[idx]+1)
space = "&nbsp;" * 2 space = "&nbsp;" * 2
ctxt = '<font color="#000099">%s</font>' % counts[0] ctxt = '<font color="#000099">%s</font>' % counts[0]

View file

@ -45,7 +45,7 @@ class CardStats(object):
return return
txt = "" txt = ""
r = self.mw.reviewer r = self.mw.reviewer
d = self.mw.deck d = self.mw.col
if r.card: if r.card:
txt += _("<h1>Current</h1>") txt += _("<h1>Current</h1>")
txt += d.cardStats(r.card) txt += d.cardStats(r.card)
@ -70,9 +70,9 @@ class DeckStats(QDialog):
self.mw = mw self.mw = mw
self.name = "deckStats" self.name = "deckStats"
self.period = 0 self.period = 0
self.sel = True
self.form = aqt.forms.stats.Ui_Dialog() self.form = aqt.forms.stats.Ui_Dialog()
self.oldPos = None self.oldPos = None
self.wholeCollection = False
f = self.form f = self.form
f.setupUi(self) f.setupUi(self)
restoreGeom(self, self.name) restoreGeom(self, self.name)
@ -82,9 +82,9 @@ class DeckStats(QDialog):
b.setAutoDefault(False) b.setAutoDefault(False)
c = self.connect c = self.connect
s = SIGNAL("clicked()") s = SIGNAL("clicked()")
c(f.groups, s, lambda: self.changeSel(True)) c(f.groups, s, lambda: self.changeScope("deck"))
f.groups.setShortcut("g") f.groups.setShortcut("g")
c(f.all, s, lambda: self.changeSel(False)) c(f.all, s, lambda: self.changeScope("collection"))
c(f.month, s, lambda: self.changePeriod(0)) c(f.month, s, lambda: self.changePeriod(0))
c(f.year, s, lambda: self.changePeriod(1)) c(f.year, s, lambda: self.changePeriod(1))
c(f.life, s, lambda: self.changePeriod(2)) c(f.life, s, lambda: self.changePeriod(2))
@ -115,10 +115,8 @@ class DeckStats(QDialog):
self.period = n self.period = n
self.refresh() self.refresh()
def changeSel(self, sel): def changeScope(self, type):
self.sel = sel self.wholeCollection = type == "collection"
if sel:
self.mw.onGroups(self)
self.refresh() self.refresh()
def loadFin(self, b): def loadFin(self, b):
@ -127,8 +125,8 @@ class DeckStats(QDialog):
def refresh(self): def refresh(self):
self.mw.progress.start(immediate=True) self.mw.progress.start(immediate=True)
self.oldPos = self.form.web.page().mainFrame().scrollPosition() self.oldPos = self.form.web.page().mainFrame().scrollPosition()
self.report = self.mw.deck.stats().report( stats = self.mw.col.stats()
type=self.period) stats.wholeCollection = self.wholeCollection
self.report = stats.report(type=self.period)
self.form.web.setHtml(self.report) self.form.web.setHtml(self.report)
self.mw.progress.finish() self.mw.progress.finish()

View file

@ -30,7 +30,7 @@ class StudyOptions(QDialog):
def load(self): def load(self):
f = self.form f = self.form
d = self.mw.deck d = self.mw.col
qc = d.conf qc = d.conf
f.newPerDay.setValue(qc['newPerDay']) f.newPerDay.setValue(qc['newPerDay'])
f.newOrder.setCurrentIndex(qc['newOrder']) f.newOrder.setCurrentIndex(qc['newOrder'])
@ -47,7 +47,7 @@ class StudyOptions(QDialog):
def accept(self): def accept(self):
f = self.form f = self.form
d = self.mw.deck d = self.mw.col
qc = d.conf qc = d.conf
old = qc['newOrder'] old = qc['newOrder']
qc['newOrder'] = f.newOrder.currentIndex() qc['newOrder'] = f.newOrder.currentIndex()
@ -71,7 +71,7 @@ class StudyOptions(QDialog):
return return
self.mw.progress.start() self.mw.progress.start()
if new == 1: if new == 1:
self.mw.deck.sched.orderCards() self.mw.col.sched.orderCards()
else: else:
self.mw.deck.sched.randomizeCards() self.mw.col.sched.randomizeCards()
self.mw.progress.finish() self.mw.progress.finish()

View file

@ -59,7 +59,7 @@
<item> <item>
<widget class="QRadioButton" name="groups"> <widget class="QRadioButton" name="groups">
<property name="text"> <property name="text">
<string>groups</string> <string>deck</string>
</property> </property>
<property name="checked"> <property name="checked">
<bool>true</bool> <bool>true</bool>
@ -69,7 +69,7 @@
<item> <item>
<widget class="QRadioButton" name="all"> <widget class="QRadioButton" name="all">
<property name="text"> <property name="text">
<string>all</string> <string>collection</string>
</property> </property>
</widget> </widget>
</item> </item>