add card stats

This commit is contained in:
Damien Elmes 2011-03-24 12:06:15 +09:00
parent 3c8763602c
commit 437da036ea
3 changed files with 109 additions and 32 deletions

View file

@ -19,7 +19,7 @@ class DeckBrowser(object):
self.web = mw.web
self._browserLastRefreshed = 0
self._decks = []
addHook("deckClosing", self.onClose)
addHook("deckClosing", self._onClose)
def show(self, _init=True):
if _init:
@ -37,7 +37,7 @@ class DeckBrowser(object):
# show
self._renderPage()
def onClose(self, deck):
def _onClose(self):
print "onClose"
return
if deck.finishScheduler:

View file

@ -17,7 +17,7 @@ from anki.utils import addTags, parseTags, canonifyTags, stripHTML, checksum
from anki.hooks import runHook, addHook, removeHook
import anki.consts
import aqt, aqt.dockable, aqt.facteditor, aqt.progress, aqt.webview
import aqt, aqt.facteditor, aqt.progress, aqt.webview, aqt.stats
from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \
saveState, restoreState, getOnlyText, askUser, GetTextDialog, \
askUserDialog, applyStyles, getText, showText
@ -76,6 +76,7 @@ class AnkiQt(QMainWindow):
self.setupVersion()
self.setupMisc()
self.setupAutoUpdate()
self.setupCardStats()
# screens
self.setupDeckBrowser()
self.setupOverview()
@ -106,10 +107,6 @@ class AnkiQt(QMainWindow):
runHook("deckLoading", self.deck)
self.moveToState("overview")
def _deckClosingState(self, oldState):
"Run once, before a deck is closed."
runHook("deckClosing", self.deck)
def _overviewState(self, oldState):
self.overview.show()
@ -331,7 +328,8 @@ Please do not file a bug report with Anki.<br>""")
self.resize(500, 500)
def closeAllDeckWindows(self):
aqt.dialogs.closeAll()
print "closealldeckwindows()"
#aqt.dialogs.closeAll()
# to port
# elif self.state == "studyScreen":
@ -554,8 +552,8 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
"(Auto)save and close. Prompt if necessary. True if okay to proceed."
if not self.deck:
return
# allow any focusOut()s to run first
self.setFocus()
runHook("deckClosing")
print "focusOut() should be handled with deckClosing now"
self.closeAllDeckWindows()
self.deck.close()
self.deck = None
@ -1169,33 +1167,35 @@ learnt today")
tb = self.form.toolBar
self.config['showToolbar'] = tb.isVisible()
# Tools - statistics
# Dockable widgets
##########################################################################
def onDeckStats(self):
txt = anki.stats.DeckStats(self.deck).report()
self.help.showText(txt)
def addDockable(self, title, w):
dock = QDockWidget(title, self)
dock.setObjectName(title)
dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
dock.setFeatures(QDockWidget.DockWidgetClosable)
dock.setWidget(w)
self.addDockWidget(Qt.RightDockWidgetArea, dock)
return dock
def rmDockable(self, dock):
self.removeDockWidget(dock)
# Card & deck stats
##########################################################################
def setupCardStats(self):
self.cardStats = aqt.stats.CardStats(self)
def onCardStats(self):
addHook("showQuestion", self.onCardStats)
addHook("deckFinished", self.onCardStats)
txt = ""
if self.reviewer.card:
txt += _("<h1>Current card</h1>")
txt += self.deck.cardStats(self.reviewer.card)
lc = self.reviewer.lastCard()
if lc:
txt += _("<h1>Last card</h1>")
txt += self.deck.cardStats(lc)
if not txt:
txt = _("No current card or last card.")
print txt
#self.help.showText(txt, py={'hide': self.removeCardStatsHook})
self.cardStats.show()
def removeCardStatsHook(self):
"Remove the update hook if the help menu was changed."
removeHook("showQuestion", self.onCardStats)
removeHook("deckFinished", self.onCardStats)
def onDeckStats(self):
aqt.stats.DeckStats(self)
# Graphs
##########################################################################
def onShowGraph(self):
self.setStatus(_("Loading graphs (may take time)..."))

77
aqt/stats.py Normal file
View file

@ -0,0 +1,77 @@
# Copyright: Damien Elmes <anki@ichi2.net>
# -*- coding: utf-8 -*-
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from aqt.webview import AnkiWebView
from anki.hooks import addHook
# Card stats
######################################################################
class CardStats(object):
def __init__(self, mw):
self.mw = mw
self.shown = False
addHook("showQuestion", self._update)
addHook("deckClosing", self.hide)
def show(self):
if not self.shown:
self.web = AnkiWebView(self.mw)
self.web.setMaximumWidth(400)
self.shown = self.mw.addDockable(_("Card Statistics"), self.web)
self.shown.connect(self.shown, SIGNAL("visibilityChanged(bool)"),
self._visChange)
self._update()
def hide(self):
if self.shown:
self.mw.rmDockable(self.shown)
self.shown = None
def _visChange(self, vis):
if not vis:
# schedule removal for after evt has finished
self.mw.progress.timer(100, self.hide, False)
def _update(self):
if not self.shown:
return
txt = ""
r = self.mw.reviewer
d = self.mw.deck
if r.card:
txt += _("<h1>Current card</h1>")
txt += d.cardStats(r.card)
lc = r.lastCard()
if lc:
txt += _("<h1>Last card</h1>")
txt += d.cardStats(lc)
if not txt:
txt = _("No current card or last card.")
print txt
self.web.setHtml("""
<html><head>
<style>table { font-size: 12px; } h1 { font-size: 14px; }</style>
</head><body><center>%s</center></body></html>"""%txt)
# Deck stats
######################################################################
class DeckStats(QDialog):
def __init__(self, mw):
self.mw = mw
QDialog.__init__(self, mw)
self.setModal(True)
self.mw.progress.start()
self.web = AnkiWebView(self)
stats = self.mw.deck.deckStats()
l = QVBoxLayout(self)
l.addWidget(self.web)
self.setLayout(l)
self.web.setHtml(stats)
self.mw.progress.finish()
self.exec_()