refactor graphs into class

This commit is contained in:
Damien Elmes 2009-02-21 18:37:03 +09:00
parent f763a3d06b
commit 92482e3167

View file

@ -139,147 +139,148 @@ class IntervalGraph(QDialog):
ui.dialogs.close("Graphs") ui.dialogs.close("Graphs")
QDialog.reject(self) QDialog.reject(self)
def intervalGraph(parent, deck): class GraphWindow(object):
widgets = []
dg = anki.graphs.DeckGraphs(deck) nameMap = {
# dialog setup 'due': _("Due"),
d = IntervalGraph(parent) 'cum': _("Cumulative"),
d.setWindowTitle(_("Deck Graphs")) 'interval': _("Interval"),
if parent.config.get('graphsGeom'): 'added': _("Added"),
restoreGeom(d, "graphs") 'answered': _("First Answered"),
else: 'eases': _("Eases"),
if sys.platform.startswith("darwin"): 'reps': _("Reps"),
d.setMinimumSize(740, 680) 'times': _("Review Time"),
}
def __init__(self, parent, deck):
self.parent = parent
self.deck = deck
self.widgets = []
self.dg = anki.graphs.DeckGraphs(deck)
self.diag = IntervalGraph(parent)
self.diag.setWindowTitle(_("Deck Graphs"))
if parent.config.get('graphsGeom'):
restoreGeom(self.diag, "graphs")
else: else:
d.setMinimumSize(690, 715) if sys.platform.startswith("darwin"):
scroll = QScrollArea(d) self.diag.setMinimumSize(740, 680)
topBox = QVBoxLayout(d) else:
topBox.addWidget(scroll) self.diag.setMinimumSize(690, 715)
frame = QWidget(scroll) scroll = QScrollArea(self.diag)
vbox = QVBoxLayout(frame) topBox = QVBoxLayout(self.diag)
vbox.setMargin(0) topBox.addWidget(scroll)
vbox.setSpacing(0) self.frame = QWidget(scroll)
frame.setLayout(vbox) self.vbox = QVBoxLayout(self.frame)
self.vbox.setMargin(0)
self.vbox.setSpacing(0)
self.frame.setLayout(self.vbox)
self.range = [7, 30, 90, 180, 365, 730, 1095, 1460, 1825]
scroll.setWidget(self.frame)
self.hbox = QHBoxLayout()
topBox.addLayout(self.hbox)
self.setupGraphs()
self.setupButtons()
self.showHideAll()
self.diag.show()
range = [7, 30, 90, 180, 365, 730, 1095, 1460, 1825] def setupGraphs(self):
nextDue = AdjustableFigure(self.parent.config, 'due', self.dg.nextDue, self.range)
nextDue.addWidget(QLabel(_("<h1>Due</h1>")))
self.vbox.addWidget(nextDue)
self.widgets.append(nextDue)
# views workload = AdjustableFigure(self.parent.config, 'reps', self.dg.workDone, self.range)
nextDue = AdjustableFigure(parent.config, 'due', dg.nextDue, range) workload.addWidget(QLabel(_("<h1>Reps</h1>")))
nextDue.addWidget(QLabel(_("<h1>Due</h1>"))) self.vbox.addWidget(workload)
vbox.addWidget(nextDue) self.widgets.append(workload)
widgets.append(nextDue)
workload = AdjustableFigure(parent.config, 'reps', dg.workDone, range) times = AdjustableFigure(self.parent.config, 'times', self.dg.timeSpent, self.range)
workload.addWidget(QLabel(_("<h1>Reps</h1>"))) times.addWidget(QLabel(_("<h1>Review Time</h1>")))
vbox.addWidget(workload) self.vbox.addWidget(times)
widgets.append(workload) self.widgets.append(times)
times = AdjustableFigure(parent.config, 'times', dg.timeSpent, range) added = AdjustableFigure(self.parent.config, 'added', self.dg.addedRecently, self.range)
times.addWidget(QLabel(_("<h1>Review Time</h1>"))) added.addWidget(QLabel(_("<h1>Added</h1>")))
vbox.addWidget(times) self.vbox.addWidget(added)
widgets.append(times) self.widgets.append(added)
added = AdjustableFigure(parent.config, 'added', dg.addedRecently, range) answered = AdjustableFigure(self.parent.config, 'answered', lambda *args: apply(
added.addWidget(QLabel(_("<h1>Added</h1>"))) self.dg.addedRecently, args + ('firstAnswered',)), self.range)
vbox.addWidget(added) answered.addWidget(QLabel(_("<h1>First Answered</h1>")))
widgets.append(added) self.vbox.addWidget(answered)
self.widgets.append(answered)
answered = AdjustableFigure(parent.config, 'answered', lambda *args: apply( cumDue = AdjustableFigure(self.parent.config, 'cum', self.dg.cumulativeDue, self.range)
dg.addedRecently, args + ('firstAnswered',)), range) cumDue.addWidget(QLabel(_("<h1>Cumulative Due</h1>")))
answered.addWidget(QLabel(_("<h1>First Answered</h1>"))) self.vbox.addWidget(cumDue)
vbox.addWidget(answered) self.widgets.append(cumDue)
widgets.append(answered)
cumDue = AdjustableFigure(parent.config, 'cum', dg.cumulativeDue, range) interval = AdjustableFigure(self.parent.config, 'interval', self.dg.intervalPeriod, self.range)
cumDue.addWidget(QLabel(_("<h1>Cumulative Due</h1>"))) interval.addWidget(QLabel(_("<h1>Intervals</h1>")))
vbox.addWidget(cumDue) self.vbox.addWidget(interval)
widgets.append(cumDue) self.widgets.append(interval)
interval = AdjustableFigure(parent.config, 'interval', dg.intervalPeriod, range) eases = AdjustableFigure(self.parent.config, 'eases', self.dg.easeBars)
interval.addWidget(QLabel(_("<h1>Intervals</h1>"))) eases.addWidget(QLabel(_("<h1>Eases</h1>")))
vbox.addWidget(interval) self.vbox.addWidget(eases)
widgets.append(interval) self.widgets.append(eases)
eases = AdjustableFigure(parent.config, 'eases', dg.easeBars) def setupButtons(self):
eases.addWidget(QLabel(_("<h1>Eases</h1>"))) self.showhide = QPushButton(_("Show/Hide"))
vbox.addWidget(eases) self.hbox.addWidget(self.showhide)
widgets.append(eases) self.showhide.connect(self.showhide, SIGNAL("clicked()"),
self.onShowHide)
refresh = QPushButton(_("Refresh"))
self.hbox.addWidget(refresh)
self.showhide.connect(refresh, SIGNAL("clicked()"),
self.onRefresh)
buttonBox = QDialogButtonBox(self.diag)
buttonBox.setOrientation(Qt.Horizontal)
close = buttonBox.addButton(QDialogButtonBox.Close)
close.setDefault(True)
self.diag.connect(buttonBox, SIGNAL("rejected()"), self.diag.close)
help = buttonBox.addButton(QDialogButtonBox.Help)
self.diag.connect(buttonBox, SIGNAL("helpRequested()"),
self.onHelp)
self.hbox.addWidget(buttonBox)
scroll.setWidget(frame) def showHideAll(self):
self.deck.startProgress(len(self.widgets))
hbox = QHBoxLayout() for w in self.widgets:
self.deck.updateProgress(_("Processing..."))
def showHideAll():
deck.startProgress(len(widgets))
for w in widgets:
deck.updateProgress(_("Processing..."))
w.showHide() w.showHide()
frame.adjustSize() self.frame.adjustSize()
deck.finishProgress() self.deck.finishProgress()
def onShowHideToggle(b, w): def onShowHideToggle(self, b, w):
key = 'graphs.shown.' + w.name key = 'graphs.shown.' + w.name
parent.config[key] = not parent.config.get(key, True) self.parent.config[key] = not self.parent.config.get(key, True)
showHideAll() self.showHideAll()
def onShowHide(): def onShowHide(self):
nameMap = { m = QMenu(self.parent)
'due': _("Due"), for graph in self.widgets:
'cum': _("Cumulative"),
'interval': _("Interval"),
'added': _("Added"),
'answered': _("First Answered"),
'eases': _("Eases"),
'reps': _("Reps"),
'times': _("Review Time"),
}
m = QMenu(parent)
for graph in widgets:
name = graph.name name = graph.name
shown = parent.config.get('graphs.shown.' + name, True) shown = self.parent.config.get('graphs.shown.' + name, True)
action = QAction(parent) action = QAction(self.parent)
action.setCheckable(True) action.setCheckable(True)
action.setChecked(shown) action.setChecked(shown)
action.setText(nameMap[name]) action.setText(self.nameMap[name])
action.connect(action, SIGNAL("toggled(bool)"), action.connect(action, SIGNAL("toggled(bool)"),
lambda b, g=graph: onShowHideToggle(b, g)) lambda b, g=graph: self.onShowHideToggle(b, g))
m.addAction(action) m.addAction(action)
m.exec_(showhide.mapToGlobal(QPoint(0,0))) m.exec_(self.showhide.mapToGlobal(QPoint(0,0)))
def onHelp(): def onHelp(self):
QDesktopServices.openUrl(QUrl(ankiqt.appWiki + "Graphs")) QDesktopServices.openUrl(QUrl(ankiqt.appWiki + "Graphs"))
def onRefresh(): def onRefresh(self):
deck.startProgress(len(widgets)) self.deck.startProgress(len(self.widgets))
dg.stats = None self.dg.stats = None
for w in widgets: for w in self.widgets:
deck.updateProgress(_("Processing...")) self.deck.updateProgress(_("Processing..."))
w.updateFigure() w.updateFigure()
deck.finishProgress() self.deck.finishProgress()
showhide = QPushButton(_("Show/Hide")) def intervalGraph(*args):
hbox.addWidget(showhide) return GraphWindow(*args)
showhide.connect(showhide, SIGNAL("clicked()"),
onShowHide)
refresh = QPushButton(_("Refresh"))
hbox.addWidget(refresh)
showhide.connect(refresh, SIGNAL("clicked()"),
onRefresh)
buttonBox = QDialogButtonBox(d)
buttonBox.setOrientation(Qt.Horizontal)
close = buttonBox.addButton(QDialogButtonBox.Close)
close.setDefault(True)
d.connect(buttonBox, SIGNAL("rejected()"), d.close)
help = buttonBox.addButton(QDialogButtonBox.Help)
d.connect(buttonBox, SIGNAL("helpRequested()"),
onHelp)
hbox.addWidget(buttonBox)
topBox.addLayout(hbox)
showHideAll()
d.show()