diff --git a/aqt/deckbrowser.py b/aqt/deckbrowser.py index cc8f404eb..4ce302a18 100644 --- a/aqt/deckbrowser.py +++ b/aqt/deckbrowser.py @@ -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: diff --git a/aqt/main.py b/aqt/main.py index a01b1488d..525749231 100755 --- a/aqt/main.py +++ b/aqt/main.py @@ -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.
""") 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 += _("

Current card

") - txt += self.deck.cardStats(self.reviewer.card) - lc = self.reviewer.lastCard() - if lc: - txt += _("

Last card

") - 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)...")) diff --git a/aqt/stats.py b/aqt/stats.py new file mode 100644 index 000000000..94ac5306c --- /dev/null +++ b/aqt/stats.py @@ -0,0 +1,77 @@ +# Copyright: Damien Elmes +# -*- 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 += _("

Current card

") + txt += d.cardStats(r.card) + lc = r.lastCard() + if lc: + txt += _("

Last card

") + txt += d.cardStats(lc) + if not txt: + txt = _("No current card or last card.") + print txt + self.web.setHtml(""" + + +
%s
"""%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_()