update preferences

This commit is contained in:
Damien Elmes 2011-03-29 20:16:45 +09:00
parent 6bab81c180
commit 37d04c1831
4 changed files with 104 additions and 390 deletions

View file

@ -52,7 +52,7 @@ defaultConf = {
'showProgress': True,
'showTimer': True,
'showToolbar': True,
'splitQA': True,
'centerQA': True,
'stripHTML': True,
'studyOptionsTab': 0,
'suppressEstimates': False,

View file

@ -17,7 +17,7 @@ from anki.utils import addTags, parseTags, canonifyTags, stripHTML, checksum
from anki.hooks import runHook, addHook, removeHook
import anki.consts
import aqt, aqt.facteditor, aqt.progress, aqt.webview, aqt.stats, aqt.studyopts
import aqt, aqt.progress, aqt.webview
from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \
saveState, restoreState, getOnlyText, askUser, GetTextDialog, \
askUserDialog, applyStyles, getText, showText, showCritical
@ -634,9 +634,11 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
self.moveToState("editCurrentFact")
def setupCardStats(self):
import aqt.stats
self.cardStats = aqt.stats.CardStats(self)
def onStudyOptions(self):
import aqt.studyopts
aqt.studyopts.StudyOptions(self)
def onOverview(self):
@ -663,7 +665,8 @@ Debug info:\n%s""") % traceback.format_exc(), help="DeckErrors")
self.deckProperties = aqt.deckproperties.DeckProperties(self, self.deck)
def onPrefs(self):
aqt.preferences.Preferences(self, self.config)
import aqt.preferences
aqt.preferences.Preferences(self)
def onAbout(self):
aqt.about.show(self)

View file

@ -2,70 +2,25 @@
# Copyright: Damien Elmes <anki@ichi2.net>
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
import copy, sys, os
import os
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import anki, anki.utils
from anki.facts import Fact
from aqt import ui
import aqt.forms
tabs = ("Display",
"Network",
"Saving",
"Advanced")
from anki.lang import langs
from aqt.utils import openFolder
import aqt
class Preferences(QDialog):
def __init__(self, parent, config):
QDialog.__init__(self, parent, Qt.Window)
self.origConfig = config
self.parent = parent
self.config = copy.copy(self.origConfig)
def __init__(self, mw):
QDialog.__init__(self, mw, Qt.Window)
self.mw = mw
self.config = mw.config
self.origInterfaceLang = self.config['interfaceLang']
self.dialog = aqt.forms.preferences.Ui_Preferences()
self.dialog.setupUi(self)
self.needDeckClose = False
self.supportedLanguages = [
(u"Bahasa Melayu", "ms"),
(u"Dansk", "da"),
(u"Deutsch", "de"),
(u"Eesti", "et"),
(u"English", "en"),
(u"Español", "es"),
(u"Esperanto", "eo"),
(u"Français", "fr"),
(u"Italiano", "it"),
(u"Latviešu Valoda", "lv"),
(u"Magyar", "hu"),
(u"Nederlands","nl"),
(u"Norsk","nb"),
(u"Occitan","oc"),
(u"Polski", "pl"),
(u"Português Brasileiro", "pt_BR"),
(u"Português", "pt"),
(u"Româneşte", "ro"),
(u"Slovenščina", "sl"),
(u"Suomi", "fi"),
(u"Svenska", "sv"),
(u"Tiếng Việt", "vi"),
(u"Türkçe", "tr"),
(u"Čeština", "cs"),
(u"Ελληνικά", "el"),
(u"Български", "bg"),
(u"Монгол хэл","mn"),
(u"русский язык", "ru"),
(u"українська мова", "uk"),
(u"עִבְרִית", "he"),
(u"العربية", "ar"),
(u"فارسی", "fa"),
(u"日本語", "ja"),
(u"简体中文", "zh_CN"),
(u"繁體中文", "zh_TW"),
(u"한국어", "ko"),
]
self.supportedLanguages.sort()
self.connect(self.dialog.buttonBox, SIGNAL("helpRequested()"), self.helpRequested)
self.connect(self.dialog.buttonBox, SIGNAL("helpRequested()"),
lambda: aqt.openHelp("Preferences"))
self.setupLang()
self.setupNetwork()
self.setupSave()
@ -78,14 +33,12 @@ class Preferences(QDialog):
self.updateSave()
self.updateAdvanced()
self.updateMedia()
self.config['interfaceLang'] = self.origConfig['interfaceLang']
self.origConfig.update(self.config)
self.origConfig.save()
self.parent.setLang()
self.config.save()
self.mw.setupLang()
if self.needDeckClose:
self.parent.close(parent=self)
self.mw.close()
else:
self.parent.reset()
self.mw.reset()
self.done(0)
def reject(self):
@ -93,17 +46,18 @@ class Preferences(QDialog):
def setupLang(self):
# interface lang
for (lang, code) in self.supportedLanguages:
for (lang, code) in langs:
self.dialog.interfaceLang.addItem(lang)
self.dialog.interfaceLang.setCurrentIndex(
self.codeToIndex(self.config['interfaceLang']))
self.connect(self.dialog.interfaceLang,
SIGNAL("currentIndexChanged(QString)"),
self.interfaceLangChanged)
self.dialog.interfaceLang.setCurrentIndex(self.codeToIndex(self.config['interfaceLang']))
def interfaceLangChanged(self):
self.origConfig['interfaceLang'] = (
self.supportedLanguages[self.dialog.interfaceLang.currentIndex()])[1]
self.parent.setLang()
self.config['interfaceLang'] = (
langs[self.dialog.interfaceLang.currentIndex()])[1]
self.mw.setupLang()
self.dialog.retranslateUi(self)
def setupMedia(self):
@ -138,20 +92,16 @@ class Preferences(QDialog):
mpl.setShown(False)
def setupNetwork(self):
self.dialog.syncOnOpen.setChecked(self.config['syncOnLoad'])
self.dialog.syncOnProgramOpen.setChecked(self.config['syncOnProgramOpen'])
self.dialog.disableWhenMoved.setChecked(self.config['syncDisableWhenMoved'])
self.dialog.syncUser.setText(self.config['syncUsername'])
self.dialog.syncPass.setText(self.config['syncPassword'])
self.dialog.proxyHost.setText(self.config['proxyHost'])
self.dialog.proxyPort.setMinimum(1)
self.dialog.proxyPort.setMaximum(65535)
self.dialog.proxyPort.setValue(self.config['proxyPort'])
self.dialog.proxyUser.setText(self.config['proxyUser'])
self.dialog.proxyPass.setText(self.config['proxyPass'])
def updateNetwork(self):
self.config['syncOnLoad'] = self.dialog.syncOnOpen.isChecked()
self.config['syncOnProgramOpen'] = self.dialog.syncOnProgramOpen.isChecked()
self.config['syncDisableWhenMoved'] = self.dialog.disableWhenMoved.isChecked()
self.config['syncUsername'] = unicode(self.dialog.syncUser.text())
@ -162,11 +112,6 @@ class Preferences(QDialog):
self.config['proxyPass'] = unicode(self.dialog.proxyPass.text())
def setupSave(self):
self.dialog.saveAfterEveryNum.setValue(self.config['saveAfterAnswerNum'])
self.dialog.saveAfterEvery.setChecked(self.config['saveAfterAnswer'])
self.dialog.saveAfterAdding.setChecked(self.config['saveAfterAdding'])
self.dialog.saveAfterAddingNum.setValue(self.config['saveAfterAddingNum'])
self.dialog.saveWhenClosing.setChecked(self.config['saveOnClose'])
self.dialog.numBackups.setValue(self.config['numBackups'])
self.connect(self.dialog.openBackupFolder,
SIGNAL("linkActivated(QString)"),
@ -174,12 +119,7 @@ class Preferences(QDialog):
def onOpenBackup(self):
path = os.path.join(self.config.confDir, "backups")
if sys.platform == "win32":
anki.utils.call(["explorer", path.encode(
sys.getfilesystemencoding())],
wait=False)
else:
QDesktopServices.openUrl(QUrl("file://" + path))
openFolder(path)
def updateMedia(self):
orig = self.origMediaChoice
@ -198,54 +138,31 @@ class Preferences(QDialog):
self.needDeckClose = True
def updateSave(self):
self.config['saveAfterAnswer'] = self.dialog.saveAfterEvery.isChecked()
self.config['saveAfterAnswerNum'] = self.dialog.saveAfterEveryNum.value()
self.config['saveAfterAdding'] = self.dialog.saveAfterAdding.isChecked()
self.config['saveAfterAddingNum'] = self.dialog.saveAfterAddingNum.value()
self.config['saveOnClose'] = self.dialog.saveWhenClosing.isChecked()
self.config['numBackups'] = self.dialog.numBackups.value()
def setupAdvanced(self):
self.dialog.colourTimes.setChecked(self.config['colourTimes'])
self.dialog.showEstimates.setChecked(not self.config['suppressEstimates'])
self.dialog.showStudyOptions.setChecked(self.config['showStudyScreen'])
self.dialog.showTimer.setChecked(self.config['showTimer'])
self.dialog.showDivider.setChecked(self.config['qaDivider'])
self.dialog.splitQA.setChecked(self.config['splitQA'])
self.dialog.centerQA.setChecked(self.config['centerQA'])
self.dialog.showProgress.setChecked(self.config['showProgress'])
self.dialog.openLastDeck.setChecked(self.config['loadLastDeck'])
self.dialog.deckBrowserOrder.setChecked(self.config['deckBrowserOrder'])
self.dialog.deleteMedia.setChecked(self.config['deleteMedia'])
self.dialog.stripHTML.setChecked(self.config['stripHTML'])
self.dialog.autoplaySounds.setChecked(self.config['autoplaySounds'])
self.dialog.deckBrowserLen.setValue(self.config['deckBrowserNameLength'])
def updateAdvanced(self):
self.config['colourTimes'] = self.dialog.colourTimes.isChecked()
self.config['showTimer'] = self.dialog.showTimer.isChecked()
self.config['suppressEstimates'] = not self.dialog.showEstimates.isChecked()
self.config['showStudyScreen'] = self.dialog.showStudyOptions.isChecked()
self.config['qaDivider'] = self.dialog.showDivider.isChecked()
self.config['splitQA'] = self.dialog.splitQA.isChecked()
self.config['centerQA'] = self.dialog.centerQA.isChecked()
self.config['showProgress'] = self.dialog.showProgress.isChecked()
self.config['stripHTML'] = self.dialog.stripHTML.isChecked()
self.config['autoplaySounds'] = self.dialog.autoplaySounds.isChecked()
self.config['loadLastDeck'] = self.dialog.openLastDeck.isChecked()
if self.dialog.deckBrowserOrder.isChecked():
self.config['deckBrowserOrder'] = 1
else:
self.config['deckBrowserOrder'] = 0
self.config['deleteMedia'] = self.dialog.deleteMedia.isChecked()
self.config['deckBrowserNameLength'] = self.dialog.deckBrowserLen.value()
def codeToIndex(self, code):
n = 0
for (lang, type) in self.supportedLanguages:
for (lang, type) in langs:
if code == type:
return n
n += 1
# default to english
return self.codeToIndex("en")
def helpRequested(self):
aqt.openHelp("Preferences")

View file

@ -20,7 +20,7 @@
<enum>Qt::StrongFocus</enum>
</property>
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="tab_1">
<attribute name="title">
@ -58,50 +58,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
<property name="text">
<string>&lt;b&gt;Reviewing&lt;/b&gt;</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showDivider">
<property name="text">
<string>Show divider between question and answer</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="splitQA">
<property name="text">
<string>Put space between question and answer</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showEstimates">
<property name="text">
<string>Show next time before answer</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showProgress">
<property name="text">
<string>Show due count and progress during review</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="preventEdits">
<property name="text">
<string>Prevent edits until answer shown</string>
</property>
</widget>
</item>
<item>
@ -111,6 +70,27 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="centerQA">
<property name="text">
<string>Center question and answer</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showEstimates">
<property name="text">
<string>Show next times</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="showProgress">
<property name="text">
<string>Show due count and progress</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="text">
@ -218,23 +198,13 @@
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="syncOnOpen">
<property name="text">
<string>Sync on deck open/close</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="syncOnProgramOpen">
<property name="text">
<string>Sync on program open/close</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="disableWhenMoved">
<property name="text">
<string>Disable sync when deck moved</string>
@ -269,30 +239,6 @@
<item row="0" column="1">
<widget class="QLineEdit" name="proxyHost"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Username</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="proxyUser"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Password</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="proxyPass">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_15">
<property name="text">
@ -308,6 +254,39 @@
<height>0</height>
</size>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>8080</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Username</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="proxyUser"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Password</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="proxyPass">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
</layout>
@ -339,90 +318,12 @@
</widget>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Saving</string>
<string>Backups</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>&lt;b&gt;Autosaving&lt;/b&gt;</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QCheckBox" name="saveAfterEvery">
<property name="text">
<string>Save after answering</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="saveAfterEveryNum">
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="saveAfterAdding">
<property name="text">
<string>Save after adding</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="saveAfterAddingNum">
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="saveWhenClosing">
<property name="text">
<string>Save when closing</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>cards</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_7">
<property name="text">
<string>facts</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_9">
<property name="text">
@ -487,6 +388,16 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Note that your media folders are &lt;b&gt;not&lt;/b&gt; backed up. It's recommended you keep your media in DropBox to avoid data loss.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
@ -519,128 +430,29 @@
<layout class="QVBoxLayout">
<item>
<layout class="QGridLayout">
<item row="4" column="0">
<widget class="QCheckBox" name="showTimer">
<property name="text">
<string>Show timer</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="alternativeTheme">
<property name="text">
<string>Alternative theme</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="showStudyOptions">
<property name="text">
<string>Show study options on deck load</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="showTray">
<property name="text">
<string>Show tray icon</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QCheckBox" name="addZeroSpace">
<property name="text">
<string>Add hidden char to text (fixes Thai on OSX)</string>
</property>
</widget>
</item>
<item row="8" column="0">
<item row="1" column="0">
<widget class="QCheckBox" name="openLastDeck">
<property name="text">
<string>Always open last deck on startup</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QCheckBox" name="deckBrowserOrder">
<property name="text">
<string>Show decks with cards due first in browser</string>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QCheckBox" name="deleteMedia">
<property name="text">
<string>Delete original media on add</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="colourTimes">
<property name="text">
<string>Colour next times</string>
</property>
</widget>
</item>
<item row="6" column="0">
<item row="0" column="0">
<widget class="QCheckBox" name="stripHTML">
<property name="text">
<string>Strip HTML when pasting text</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="optimizeSmall">
<item row="2" column="0">
<widget class="QCheckBox" name="deleteMedia">
<property name="text">
<string>Optimize for small screens</string>
<string>Delete original media on add</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_22">
<property name="text">
<string>Max deck name length in deck browser:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="deckBrowserLen"/>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer>
<property name="orientation">
@ -683,42 +495,24 @@
<tabstops>
<tabstop>tabWidget</tabstop>
<tabstop>interfaceLang</tabstop>
<tabstop>label_2</tabstop>
<tabstop>showDivider</tabstop>
<tabstop>splitQA</tabstop>
<tabstop>autoplaySounds</tabstop>
<tabstop>centerQA</tabstop>
<tabstop>showEstimates</tabstop>
<tabstop>showProgress</tabstop>
<tabstop>preventEdits</tabstop>
<tabstop>autoplaySounds</tabstop>
<tabstop>mediaChoice</tabstop>
<tabstop>mediaPath</tabstop>
<tabstop>syncUser</tabstop>
<tabstop>syncPass</tabstop>
<tabstop>syncOnOpen</tabstop>
<tabstop>syncOnProgramOpen</tabstop>
<tabstop>disableWhenMoved</tabstop>
<tabstop>proxyHost</tabstop>
<tabstop>proxyPort</tabstop>
<tabstop>proxyUser</tabstop>
<tabstop>proxyPass</tabstop>
<tabstop>saveAfterEvery</tabstop>
<tabstop>saveAfterEveryNum</tabstop>
<tabstop>saveAfterAdding</tabstop>
<tabstop>saveAfterAddingNum</tabstop>
<tabstop>saveWhenClosing</tabstop>
<tabstop>numBackups</tabstop>
<tabstop>alternativeTheme</tabstop>
<tabstop>colourTimes</tabstop>
<tabstop>showTimer</tabstop>
<tabstop>showTray</tabstop>
<tabstop>stripHTML</tabstop>
<tabstop>showStudyOptions</tabstop>
<tabstop>openLastDeck</tabstop>
<tabstop>deckBrowserOrder</tabstop>
<tabstop>optimizeSmall</tabstop>
<tabstop>deleteMedia</tabstop>
<tabstop>addZeroSpace</tabstop>
<tabstop>deckBrowserLen</tabstop>
<tabstop>buttonBox</tabstop>
</tabstops>
<resources/>