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