anki/aqt/preferences.py
Christian Krause a65c20b3ad Avoid exception on exit
Closing anki when the preferences dialog
is open will cause an exception since
self.mw.col in Preferences is not available
anymore.

Avoid the exception by checking self.mw.col
again on accept().
2015-04-26 12:31:54 +02:00

159 lines
5.5 KiB
Python

# -*- coding: utf-8 -*-
# Copyright: Damien Elmes <anki@ichi2.net>
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import datetime, time
from aqt.qt import *
from aqt.utils import openFolder, showWarning, getText, openHelp, showInfo
import aqt
class Preferences(QDialog):
def __init__(self, mw):
if not mw.col:
showInfo(_("Please open a profile first."))
return
QDialog.__init__(self, mw, Qt.Window)
self.mw = mw
self.prof = self.mw.pm.profile
self.form = aqt.forms.preferences.Ui_Preferences()
self.form.setupUi(self)
self.form.buttonBox.button(QDialogButtonBox.Help).setAutoDefault(False)
self.form.buttonBox.button(QDialogButtonBox.Close).setAutoDefault(False)
self.connect(self.form.buttonBox, SIGNAL("helpRequested()"),
lambda: openHelp("profileprefs"))
self.setupCollection()
self.setupNetwork()
self.setupBackup()
self.setupOptions()
self.show()
def accept(self):
# avoid exception if main window is already closed
if not self.mw.col:
return
self.updateCollection()
self.updateNetwork()
self.updateBackup()
self.updateOptions()
self.mw.pm.save()
self.mw.reset()
self.done(0)
def reject(self):
self.accept()
# Collection options
######################################################################
def setupCollection(self):
import anki.consts as c
f = self.form
qc = self.mw.col.conf
self.startDate = datetime.datetime.fromtimestamp(self.mw.col.crt)
f.dayOffset.setValue(self.startDate.hour)
f.lrnCutoff.setValue(qc['collapseTime']/60.0)
f.timeLimit.setValue(qc['timeLim']/60.0)
f.showEstimates.setChecked(qc['estTimes'])
f.showProgress.setChecked(qc['dueCounts'])
f.newSpread.addItems(c.newCardSchedulingLabels().values())
f.newSpread.setCurrentIndex(qc['newSpread'])
f.useCurrent.setCurrentIndex(int(not qc.get("addToCur", True)))
def updateCollection(self):
f = self.form
d = self.mw.col
qc = d.conf
qc['dueCounts'] = f.showProgress.isChecked()
qc['estTimes'] = f.showEstimates.isChecked()
qc['newSpread'] = f.newSpread.currentIndex()
qc['timeLim'] = f.timeLimit.value()*60
qc['collapseTime'] = f.lrnCutoff.value()*60
qc['addToCur'] = not f.useCurrent.currentIndex()
hrs = f.dayOffset.value()
old = self.startDate
date = datetime.datetime(
old.year, old.month, old.day, hrs)
d.crt = int(time.mktime(date.timetuple()))
d.setMod()
# Network
######################################################################
def setupNetwork(self):
self.form.syncOnProgramOpen.setChecked(
self.prof['autoSync'])
self.form.syncMedia.setChecked(
self.prof['syncMedia'])
if not self.prof['syncKey']:
self._hideAuth()
else:
self.form.syncUser.setText(self.prof.get('syncUser', ""))
self.connect(self.form.syncDeauth, SIGNAL("clicked()"),
self.onSyncDeauth)
def _hideAuth(self):
self.form.syncDeauth.setVisible(False)
self.form.syncUser.setText("")
self.form.syncLabel.setText(_("""\
<b>Synchronization</b><br>
Not currently enabled; click the sync button in the main window to enable."""))
def onSyncDeauth(self):
self.prof['syncKey'] = None
self.mw.col.media.forceResync()
self._hideAuth()
def updateNetwork(self):
self.prof['autoSync'] = self.form.syncOnProgramOpen.isChecked()
self.prof['syncMedia'] = self.form.syncMedia.isChecked()
if self.form.fullSync.isChecked():
self.mw.col.modSchema(check=False)
self.mw.col.setMod()
# Backup
######################################################################
def setupBackup(self):
self.form.numBackups.setValue(self.prof['numBackups'])
self.form.compressBackups.setChecked(self.prof.get("compressBackups", True))
self.connect(self.form.openBackupFolder,
SIGNAL("linkActivated(QString)"),
self.onOpenBackup)
def onOpenBackup(self):
openFolder(self.mw.pm.backupFolder())
def updateBackup(self):
self.prof['numBackups'] = self.form.numBackups.value()
self.prof['compressBackups'] = self.form.compressBackups.isChecked()
# Basic & Advanced Options
######################################################################
def setupOptions(self):
self.form.stripHTML.setChecked(self.prof['stripHTML'])
self.form.pastePNG.setChecked(self.prof.get("pastePNG", False))
self.connect(
self.form.profilePass, SIGNAL("clicked()"),
self.onProfilePass)
def updateOptions(self):
self.prof['stripHTML'] = self.form.stripHTML.isChecked()
self.prof['pastePNG'] = self.form.pastePNG.isChecked()
def onProfilePass(self):
pw, ret = getText(_("""\
Lock account with password, or leave blank:"""))
if not ret:
return
if not pw:
self.prof['key'] = None
return
pw2, ret = getText(_("Confirm password:"))
if not ret:
return
if pw != pw2:
showWarning(_("Passwords didn't match"))
self.prof['key'] = self.mw.pm._pwhash(pw)