From 40f270c3865dbd7eaf533e40136d519779dd491c Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Tue, 30 Jun 2020 17:08:10 +1000 Subject: [PATCH] shift+click on the graphs button to access old graphs for now --- qt/aqt/__init__.py | 1 + qt/aqt/main.py | 6 ++- qt/aqt/stats.py | 100 +++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 99 insertions(+), 8 deletions(-) diff --git a/qt/aqt/__init__.py b/qt/aqt/__init__.py index 48ceb839a..96615ee00 100644 --- a/qt/aqt/__init__.py +++ b/qt/aqt/__init__.py @@ -76,6 +76,7 @@ class DialogManager: "Browser": [browser.Browser, None], "EditCurrent": [editcurrent.EditCurrent, None], "DeckStats": [stats.DeckStats, None], + "NewDeckStats": [stats.NewDeckStats, None], "About": [about.show, None], "Preferences": [preferences.Preferences, None], "sync_log": [mediasync.MediaSyncDialog, None], diff --git a/qt/aqt/main.py b/qt/aqt/main.py index 639f114d6..ffdf8f9cf 100644 --- a/qt/aqt/main.py +++ b/qt/aqt/main.py @@ -1060,7 +1060,11 @@ title="%s" %s>%s""" % ( deck = self._selectedDeck() if not deck: return - aqt.dialogs.open("DeckStats", self) + want_old = self.app.queryKeyboardModifiers() & Qt.ShiftModifier + if want_old: + aqt.dialogs.open("DeckStats", self) + else: + aqt.dialogs.open("NewDeckStats", self) def onPrefs(self): aqt.dialogs.open("Preferences", self) diff --git a/qt/aqt/stats.py b/qt/aqt/stats.py index 747054d21..5ac56afb6 100644 --- a/qt/aqt/stats.py +++ b/qt/aqt/stats.py @@ -19,11 +19,10 @@ from aqt.utils import ( tooltip, ) -# Deck Stats -###################################################################### +class NewDeckStats(QDialog): + """New deck stats.""" -class DeckStats(QDialog): def __init__(self, mw: aqt.main.AnkiQt): QDialog.__init__(self, mw, Qt.Window) mw.setupDialogGC(self) @@ -36,8 +35,6 @@ class DeckStats(QDialog): self.setMinimumWidth(700) f = self.form f.setupUi(self) - # no night mode support yet - f.web._page.setBackgroundColor(QColor("white")) f.groupBox.setVisible(False) f.groupBox_2.setVisible(False) restoreGeom(self, self.name) @@ -53,7 +50,7 @@ class DeckStats(QDialog): def reject(self): self.form.web = None saveGeom(self, self.name) - aqt.dialogs.markClosed("DeckStats") + aqt.dialogs.markClosed("NewDeckStats") QDialog.reject(self) def closeWithCallback(self, callback): @@ -92,4 +89,93 @@ class DeckStats(QDialog): extra = "#night" else: extra = "" - self.form.web.load(QUrl(f"{self.mw.serverURL()}_anki/graphs.html"+extra)) + self.form.web.load(QUrl(f"{self.mw.serverURL()}_anki/graphs.html" + extra)) + + +class DeckStats(QDialog): + """Legacy deck stats, used by some add-ons.""" + + def __init__(self, mw): + QDialog.__init__(self, mw, Qt.Window) + mw.setupDialogGC(self) + self.mw = mw + self.name = "deckStats" + self.period = 0 + self.form = aqt.forms.stats.Ui_Dialog() + self.oldPos = None + self.wholeCollection = False + self.setMinimumWidth(700) + f = self.form + if theme_manager.night_mode and not theme_manager.macos_dark_mode(): + # the grouping box renders incorrectly in the fusion theme. 5.9+ + # 5.13 behave differently to 5.14, but it looks bad in either case, + # and adjusting the top margin makes the 'save PDF' button show in + # the wrong place, so for now we just disable the border instead + self.setStyleSheet("QGroupBox { border: 0; }") + f.setupUi(self) + restoreGeom(self, self.name) + b = f.buttonBox.addButton(_("Save PDF"), QDialogButtonBox.ActionRole) + qconnect(b.clicked, self.saveImage) + b.setAutoDefault(False) + qconnect(f.groups.clicked, lambda: self.changeScope("deck")) + f.groups.setShortcut("g") + qconnect(f.all.clicked, lambda: self.changeScope("collection")) + qconnect(f.month.clicked, lambda: self.changePeriod(0)) + qconnect(f.year.clicked, lambda: self.changePeriod(1)) + qconnect(f.life.clicked, lambda: self.changePeriod(2)) + maybeHideClose(self.form.buttonBox) + addCloseShortcut(self) + self.show() + self.refresh() + self.activateWindow() + + def reject(self): + self.form.web = None + saveGeom(self, self.name) + aqt.dialogs.markClosed("DeckStats") + QDialog.reject(self) + + def closeWithCallback(self, callback): + self.reject() + callback() + + def _imagePath(self): + name = time.strftime("-%Y-%m-%d@%H-%M-%S.pdf", time.localtime(time.time())) + name = "anki-" + _("stats") + name + file = getSaveFile( + self, + title=_("Save PDF"), + dir_description="stats", + key="stats", + ext=".pdf", + fname=name, + ) + return file + + def saveImage(self): + path = self._imagePath() + if not path: + return + self.form.web.page().printToPdf(path) + tooltip(_("Saved.")) + + def changePeriod(self, n): + self.period = n + self.refresh() + + def changeScope(self, type): + self.wholeCollection = type == "collection" + self.refresh() + + def refresh(self): + self.mw.progress.start(parent=self) + stats = self.mw.col.stats() + stats.wholeCollection = self.wholeCollection + self.report = stats.report(type=self.period) + self.form.web.title = "deck stats" + self.form.web.stdHtml( + "" + self.report + "", + js=["jquery.js", "plot.js"], + context=self, + ) + self.mw.progress.finish()