-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCard_Info_During_Review.py
105 lines (92 loc) · 3.01 KB
/
Card_Info_During_Review.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# -*- coding: utf-8 -*-
# Copyright: Damien Elmes <[email protected]>
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
#
# Show statistics about the current and previous card while reviewing.
# Activate from the tools menu.
#
from anki.hooks import addHook
from aqt import mw
from aqt.qt import *
from aqt.webview import AnkiWebView
import aqt.stats
class CardStats(object):
def __init__(self, mw):
self.mw = mw
self.shown = False
addHook("showQuestion", self._update)
addHook("deckClosing", self.hide)
addHook("reviewCleanup", self.hide)
def _addDockable(self, title, w):
class DockableWithClose(QDockWidget):
closed = pyqtSignal()
def closeEvent(self, evt):
self.closed.emit()
QDockWidget.closeEvent(self, evt)
dock = DockableWithClose(title, mw)
dock.setObjectName(title)
dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
dock.setFeatures(QDockWidget.DockWidgetClosable)
dock.setWidget(w)
if mw.width() < 600:
mw.resize(QSize(600, mw.height()))
mw.addDockWidget(Qt.RightDockWidgetArea, dock)
return dock
def _remDockable(self, dock):
mw.removeDockWidget(dock)
def show(self):
if not self.shown:
class ThinAnkiWebView(AnkiWebView):
def sizeHint(self):
return QSize(200, 100)
self.web = ThinAnkiWebView()
self.shown = self._addDockable(_("Card Info"), self.web)
self.shown.closed.connect(self._onClosed)
self._update()
def hide(self):
if self.shown:
self._remDockable(self.shown)
self.shown = None
#actionself.mw.form.actionCstats.setChecked(False)
def toggle(self):
if self.shown:
self.hide()
else:
self.show()
def _onClosed(self):
# 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.col
if r.card:
txt += _("<h3>Current</h3>")
txt += d.cardStats(r.card)
lc = r.lastCard()
if lc:
txt += _("<h3>Last</h3>")
txt += d.cardStats(lc)
if not txt:
txt = _("No current card or last card.")
style = self._style()
self.web.setHtml("""
<html><head>
</head><style>%s</style>
<body><center>%s</center></body></html>"""% (style, txt))
def _style(self):
from anki import version
if version.startswith("2.0."):
return ""
return "td { font-size: 80%; }"
_cs = CardStats(mw)
def cardStats(on):
_cs.toggle()
action = QAction(mw)
action.setText("Card Stats")
action.setCheckable(True)
action.setShortcut(QKeySequence("Ctrl+Alt+C"))
mw.form.menuTools.addAction(action)
action.toggled.connect(cardStats)