9e1eaacc06
This reverts commit62600051ae
, reversing changes made to88553acb0d
. - Standard graphs render incorrectly on latest version - the wrong number of days are shown, and the grid lines look wrong. Any version after 0.8.3 seems to suffer from this problem. - Pie graphs and stack graphs don't render - they are provided in separate files, and plot.js in previous Anki versions has them included in the one file. To maintain compatibility with add-ons, we'd need to create a single file as before, instead of importing multiple files. If the above issues are fixed I'd be happy to merge this in again, but as the old graphs are on the way out, it's probably not worth the effort.
184 lines
5.4 KiB
Python
184 lines
5.4 KiB
Python
# Copyright: Ankitects Pty Ltd and contributors
|
|
# -*- coding: utf-8 -*-
|
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
from __future__ import annotations
|
|
|
|
import time
|
|
|
|
import aqt
|
|
from aqt import gui_hooks
|
|
from aqt.qt import *
|
|
from aqt.theme import theme_manager
|
|
from aqt.utils import (
|
|
TR,
|
|
addCloseShortcut,
|
|
getSaveFile,
|
|
maybeHideClose,
|
|
restoreGeom,
|
|
saveGeom,
|
|
tooltip,
|
|
tr,
|
|
)
|
|
|
|
|
|
class NewDeckStats(QDialog):
|
|
"""New deck stats."""
|
|
|
|
def __init__(self, mw: aqt.main.AnkiQt):
|
|
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
|
|
f.setupUi(self)
|
|
f.groupBox.setVisible(False)
|
|
f.groupBox_2.setVisible(False)
|
|
restoreGeom(self, self.name)
|
|
b = f.buttonBox.addButton(
|
|
tr(TR.STATISTICS_SAVE_PDF), QDialogButtonBox.ActionRole
|
|
)
|
|
qconnect(b.clicked, self.saveImage)
|
|
b.setAutoDefault(False)
|
|
maybeHideClose(self.form.buttonBox)
|
|
addCloseShortcut(self)
|
|
gui_hooks.stats_dialog_will_show(self)
|
|
self.show()
|
|
self.refresh()
|
|
self.activateWindow()
|
|
|
|
def reject(self):
|
|
self.form.web = None
|
|
saveGeom(self, self.name)
|
|
aqt.dialogs.markClosed("NewDeckStats")
|
|
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-" + tr(TR.STATISTICS_STATS) + name
|
|
file = getSaveFile(
|
|
self,
|
|
title=tr(TR.STATISTICS_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(tr(TR.STATISTICS_SAVED))
|
|
|
|
def changePeriod(self, n):
|
|
pass
|
|
|
|
def changeScope(self, type):
|
|
pass
|
|
|
|
def refresh(self):
|
|
self.form.web.load_ts_page("graphs")
|
|
|
|
|
|
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(
|
|
tr(TR.STATISTICS_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)
|
|
gui_hooks.stats_dialog_old_will_show(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-" + tr(TR.STATISTICS_STATS) + name
|
|
file = getSaveFile(
|
|
self,
|
|
title=tr(TR.STATISTICS_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(tr(TR.STATISTICS_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(
|
|
"<html><body>" + self.report + "</body></html>",
|
|
js=["js/vendor/jquery.min.js", "js/vendor/plot.js"],
|
|
context=self,
|
|
)
|
|
self.mw.progress.finish()
|