mirror of
https://github.com/ankitects/anki.git
synced 2025-12-13 23:00:58 -05:00
remember graph choices and periods
This commit is contained in:
parent
852cb4ece9
commit
2636d6e4c3
1 changed files with 88 additions and 53 deletions
|
|
@ -25,16 +25,9 @@ class AnkiFigureCanvas (FigureCanvas):
|
||||||
|
|
||||||
FigureCanvas.setSizePolicy(self,
|
FigureCanvas.setSizePolicy(self,
|
||||||
QSizePolicy.Expanding,
|
QSizePolicy.Expanding,
|
||||||
QSizePolicy.Expanding)
|
QSizePolicy.Fixed)
|
||||||
FigureCanvas.updateGeometry(self)
|
FigureCanvas.updateGeometry(self)
|
||||||
|
|
||||||
def sizeHint(self):
|
|
||||||
w, h = self.get_width_height()
|
|
||||||
return QSize(w+30, h+30)
|
|
||||||
|
|
||||||
def minimumSizeHint(self):
|
|
||||||
return QSize(10, 10)
|
|
||||||
|
|
||||||
# bug in matplotlib
|
# bug in matplotlib
|
||||||
def keyReleaseEvent(self, evt):
|
def keyReleaseEvent(self, evt):
|
||||||
evt.ignore()
|
evt.ignore()
|
||||||
|
|
@ -44,17 +37,22 @@ class AnkiFigureCanvas (FigureCanvas):
|
||||||
|
|
||||||
class AdjustableFigure(QWidget):
|
class AdjustableFigure(QWidget):
|
||||||
|
|
||||||
def __init__(self, figureFunc, range=None):
|
def __init__(self, config, name, figureFunc, choices=None):
|
||||||
QWidget.__init__(self)
|
QWidget.__init__(self)
|
||||||
|
self.config = config
|
||||||
|
self.name = name
|
||||||
self.vbox = QVBoxLayout()
|
self.vbox = QVBoxLayout()
|
||||||
self.vbox.setSpacing(2)
|
self.vbox.setSpacing(2)
|
||||||
self.range = range
|
self.range = None
|
||||||
|
self.choices = choices
|
||||||
self.figureFunc = figureFunc
|
self.figureFunc = figureFunc
|
||||||
self.setLayout(self.vbox)
|
self.setLayout(self.vbox)
|
||||||
self.updateTimer = None
|
self.updateTimer = None
|
||||||
self.hbox = QHBoxLayout()
|
self.hbox = QHBoxLayout()
|
||||||
self.hbox.addSpacing(10)
|
self.hbox.addSpacing(10)
|
||||||
self.hbox.addStretch(1)
|
self.hbox.addStretch(1)
|
||||||
|
if self.choices:
|
||||||
|
self.addCombo()
|
||||||
|
|
||||||
def addWidget(self, widget):
|
def addWidget(self, widget):
|
||||||
self.vbox.addWidget(widget)
|
self.vbox.addWidget(widget)
|
||||||
|
|
@ -76,29 +74,20 @@ class AdjustableFigure(QWidget):
|
||||||
self.vbox.insertWidget(idx, self.figureCanvas)
|
self.vbox.insertWidget(idx, self.figureCanvas)
|
||||||
self.setUpdatesEnabled(True)
|
self.setUpdatesEnabled(True)
|
||||||
|
|
||||||
def addSlider(self, label, choices):
|
def addCombo(self):
|
||||||
self.choices = choices
|
self.periodCombo = QComboBox()
|
||||||
self.labelText = label
|
self.periodCombo.addItems(QStringList(
|
||||||
self.label = QLabel()
|
[anki.utils.fmtTimeSpan(x*86400) for x in self.choices]))
|
||||||
self.label.setFixedWidth(110)
|
self.hbox.addWidget(self.periodCombo)
|
||||||
self.updateLabel()
|
idx = self.config.get('graphs.period.' + self.name, 1)
|
||||||
self.slider = QScrollBar(Qt.Horizontal)
|
self.periodCombo.setCurrentIndex(idx)
|
||||||
self.slider.setFixedWidth(150)
|
self.connect(self.periodCombo, SIGNAL("currentIndexChanged(int)"),
|
||||||
self.slider.setRange(0, len(choices) - 1)
|
self.onPeriodChange)
|
||||||
self.slider.setValue(choices.index(self.range))
|
self.onPeriodChange(idx)
|
||||||
self.slider.setFocusPolicy(Qt.TabFocus)
|
|
||||||
self.hbox.addWidget(self.label)
|
|
||||||
self.hbox.addWidget(self.slider)
|
|
||||||
self.connect(self.slider, SIGNAL("valueChanged(int)"),
|
|
||||||
self.sliderChanged)
|
|
||||||
|
|
||||||
def updateLabel(self):
|
def onPeriodChange(self, index):
|
||||||
self.label.setText("%s: %s" % (self.labelText,
|
self.config['graphs.period.' + self.name] = index
|
||||||
anki.utils.fmtTimeSpan(self.range*86400)))
|
|
||||||
|
|
||||||
def sliderChanged(self, index):
|
|
||||||
self.range = self.choices[index]
|
self.range = self.choices[index]
|
||||||
self.updateLabel()
|
|
||||||
self.scheduleUpdate()
|
self.scheduleUpdate()
|
||||||
|
|
||||||
def scheduleUpdate(self):
|
def scheduleUpdate(self):
|
||||||
|
|
@ -116,6 +105,10 @@ class AdjustableFigure(QWidget):
|
||||||
self.hbox.insertWidget(1, self.explanation)
|
self.hbox.insertWidget(1, self.explanation)
|
||||||
self.vbox.addLayout(self.hbox)
|
self.vbox.addLayout(self.hbox)
|
||||||
|
|
||||||
|
def showHide(self):
|
||||||
|
shown = self.config.get('graphs.shown.' + self.name, True)
|
||||||
|
self.setVisible(shown)
|
||||||
|
|
||||||
class IntervalGraph(QDialog):
|
class IntervalGraph(QDialog):
|
||||||
|
|
||||||
def __init__(self, parent, *args):
|
def __init__(self, parent, *args):
|
||||||
|
|
@ -129,6 +122,7 @@ class IntervalGraph(QDialog):
|
||||||
QDialog.reject(self)
|
QDialog.reject(self)
|
||||||
|
|
||||||
def intervalGraph(parent, deck):
|
def intervalGraph(parent, deck):
|
||||||
|
widgets = []
|
||||||
dg = anki.graphs.DeckGraphs(deck)
|
dg = anki.graphs.DeckGraphs(deck)
|
||||||
# dialog setup
|
# dialog setup
|
||||||
d = IntervalGraph(parent)
|
d = IntervalGraph(parent)
|
||||||
|
|
@ -152,67 +146,108 @@ def intervalGraph(parent, deck):
|
||||||
range = [7, 30, 90, 180, 365, 730, 1095, 1460, 1825]
|
range = [7, 30, 90, 180, 365, 730, 1095, 1460, 1825]
|
||||||
|
|
||||||
# views
|
# views
|
||||||
nextDue = AdjustableFigure(dg.nextDue, 30)
|
nextDue = AdjustableFigure(parent.config, 'due', dg.nextDue, range)
|
||||||
nextDue.addWidget(QLabel(_("<h1>Due cards</h1>")))
|
nextDue.addWidget(QLabel(_("<h1>Due</h1>")))
|
||||||
nextDue.addFigure()
|
nextDue.addFigure()
|
||||||
nextDue.addSlider(_("Period"), range)
|
|
||||||
nextDue.addExplanation(_("The number of cards due each day over the "
|
nextDue.addExplanation(_("The number of cards due each day over the "
|
||||||
"period.\n"
|
"period.\n"
|
||||||
"Today is 0; cards less than zero are overdue."))
|
"Today is 0; cards less than zero are overdue."))
|
||||||
|
|
||||||
vbox.addWidget(nextDue)
|
vbox.addWidget(nextDue)
|
||||||
|
widgets.append(nextDue)
|
||||||
|
|
||||||
cumDue = AdjustableFigure(dg.cumulativeDue, 30)
|
cumDue = AdjustableFigure(parent.config, 'cum', dg.cumulativeDue, range)
|
||||||
cumDue.addWidget(QLabel(_("<h1>Cumulative view of due cards</h1>")))
|
cumDue.addWidget(QLabel(_("<h1>Cumulative Due</h1>")))
|
||||||
cumDue.addFigure()
|
cumDue.addFigure()
|
||||||
cumDue.addSlider(_("Period"), range)
|
|
||||||
cumDue.addExplanation(_("The number of cards due each day, assuming "
|
cumDue.addExplanation(_("The number of cards due each day, assuming "
|
||||||
"no study."))
|
"no study."))
|
||||||
|
|
||||||
vbox.addWidget(cumDue)
|
vbox.addWidget(cumDue)
|
||||||
|
widgets.append(cumDue)
|
||||||
|
|
||||||
interval = AdjustableFigure(dg.intervalPeriod, 30)
|
interval = AdjustableFigure(parent.config, 'interval', dg.intervalPeriod, range)
|
||||||
interval.addWidget(QLabel(_("<h1>Card intervals</h1>")))
|
interval.addWidget(QLabel(_("<h1>Intervals</h1>")))
|
||||||
interval.addFigure()
|
interval.addFigure()
|
||||||
interval.addSlider(_("Period"), range)
|
|
||||||
interval.addExplanation(_("The number of cards scheduled for a given "
|
interval.addExplanation(_("The number of cards scheduled for a given "
|
||||||
"number of days."))
|
"number of days."))
|
||||||
vbox.addWidget(interval)
|
vbox.addWidget(interval)
|
||||||
|
widgets.append(interval)
|
||||||
|
|
||||||
added = AdjustableFigure(dg.addedRecently, 30)
|
added = AdjustableFigure(parent.config, 'added', dg.addedRecently, range)
|
||||||
added.addWidget(QLabel(_("<h1>Added cards</h1>")))
|
added.addWidget(QLabel(_("<h1>Added</h1>")))
|
||||||
added.addFigure()
|
added.addFigure()
|
||||||
added.addSlider(_("Period"), range)
|
|
||||||
added.addExplanation(_("The number of cards added on a given day."))
|
added.addExplanation(_("The number of cards added on a given day."))
|
||||||
vbox.addWidget(added)
|
vbox.addWidget(added)
|
||||||
|
widgets.append(added)
|
||||||
|
|
||||||
answered = AdjustableFigure(lambda *args: apply(
|
answered = AdjustableFigure(parent.config, 'answered', lambda *args: apply(
|
||||||
dg.addedRecently, args + ('firstAnswered',)), 30)
|
dg.addedRecently, args + ('firstAnswered',)), range)
|
||||||
answered.addWidget(QLabel(_("<h1>First answered</h1>")))
|
answered.addWidget(QLabel(_("<h1>First Answered</h1>")))
|
||||||
answered.addFigure()
|
answered.addFigure()
|
||||||
answered.addSlider(_("Period"), range)
|
|
||||||
answered.addExplanation(_("The number of cards first answered on a "
|
answered.addExplanation(_("The number of cards first answered on a "
|
||||||
"given day.\nThis will be different to "
|
"given day.\nThis will be different to "
|
||||||
"'added cards' if you are\nusing a "
|
"'added cards' if you are\nusing a "
|
||||||
"pre-made deck."))
|
"pre-made deck."))
|
||||||
vbox.addWidget(answered)
|
vbox.addWidget(answered)
|
||||||
|
widgets.append(answered)
|
||||||
|
|
||||||
eases = AdjustableFigure(dg.easeBars)
|
eases = AdjustableFigure(parent.config, 'eases', dg.easeBars)
|
||||||
eases.addWidget(QLabel(_("<h1>Card ease</h1>")))
|
eases.addWidget(QLabel(_("<h1>Eases</h1>")))
|
||||||
eases.addFigure()
|
eases.addFigure()
|
||||||
eases.addExplanation(_("The amount of times you answered a card at "
|
eases.addExplanation(_("The amount of times you answered a card at "
|
||||||
"each ease level."))
|
"each ease level."))
|
||||||
vbox.addWidget(eases)
|
vbox.addWidget(eases)
|
||||||
|
widgets.append(eases)
|
||||||
|
|
||||||
scroll.setWidget(frame)
|
scroll.setWidget(frame)
|
||||||
|
|
||||||
|
hbox = QHBoxLayout()
|
||||||
|
|
||||||
|
def showHideAll():
|
||||||
|
for w in widgets:
|
||||||
|
w.showHide()
|
||||||
|
frame.adjustSize()
|
||||||
|
|
||||||
|
def onShowHideToggle(b, w):
|
||||||
|
key = 'graphs.shown.' + w.name
|
||||||
|
parent.config[key] = not parent.config.get(key, True)
|
||||||
|
showHideAll()
|
||||||
|
|
||||||
|
def onShowHide():
|
||||||
|
nameMap = {
|
||||||
|
'due': _("Due"),
|
||||||
|
'cum': _("Cumulative"),
|
||||||
|
'interval': _("Interval"),
|
||||||
|
'added': _("Added"),
|
||||||
|
'answered': _("First Answered"),
|
||||||
|
'eases': _("Eases"),
|
||||||
|
}
|
||||||
|
m = QMenu(parent)
|
||||||
|
for graph in widgets:
|
||||||
|
name = graph.name
|
||||||
|
shown = parent.config.get('graphs.shown.' + name, True)
|
||||||
|
action = QAction(parent)
|
||||||
|
action.setCheckable(True)
|
||||||
|
action.setChecked(shown)
|
||||||
|
action.setText(nameMap[name])
|
||||||
|
action.connect(action, SIGNAL("toggled(bool)"),
|
||||||
|
lambda b, g=graph: onShowHideToggle(b, g))
|
||||||
|
m.addAction(action)
|
||||||
|
m.exec_(showhide.mapToGlobal(QPoint(0,0)))
|
||||||
|
|
||||||
|
showhide = QPushButton(_("Show/Hide"))
|
||||||
|
hbox.addWidget(showhide)
|
||||||
|
showhide.connect(showhide, SIGNAL("clicked()"),
|
||||||
|
onShowHide)
|
||||||
|
|
||||||
buttonBox = QDialogButtonBox(d)
|
buttonBox = QDialogButtonBox(d)
|
||||||
buttonBox.setOrientation(Qt.Horizontal)
|
buttonBox.setOrientation(Qt.Horizontal)
|
||||||
close = buttonBox.addButton(QDialogButtonBox.Close)
|
close = buttonBox.addButton(QDialogButtonBox.Close)
|
||||||
close.setDefault(True)
|
close.setDefault(True)
|
||||||
|
|
||||||
d.connect(buttonBox, SIGNAL("rejected()"), d.close)
|
d.connect(buttonBox, SIGNAL("rejected()"), d.close)
|
||||||
|
hbox.addWidget(buttonBox)
|
||||||
|
|
||||||
topBox.addWidget(buttonBox)
|
topBox.addLayout(hbox)
|
||||||
|
|
||||||
|
showHideAll()
|
||||||
|
|
||||||
d.show()
|
d.show()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue