diff --git a/aqt/config.py b/aqt/config.py index aa6cad179..9b3be50f3 100644 --- a/aqt/config.py +++ b/aqt/config.py @@ -52,7 +52,7 @@ defaultConf = { 'showProgress': True, 'showTimer': True, 'showToolbar': True, - 'splitQA': True, + 'centerQA': True, 'stripHTML': True, 'studyOptionsTab': 0, 'suppressEstimates': False, diff --git a/aqt/main.py b/aqt/main.py index c3001ea7a..0607d6782 100755 --- a/aqt/main.py +++ b/aqt/main.py @@ -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) diff --git a/aqt/preferences.py b/aqt/preferences.py index e14577746..7444d274c 100644 --- a/aqt/preferences.py +++ b/aqt/preferences.py @@ -2,70 +2,25 @@ # Copyright: Damien Elmes # 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") diff --git a/designer/preferences.ui b/designer/preferences.ui index a1542583a..f2eb6f7c1 100644 --- a/designer/preferences.ui +++ b/designer/preferences.ui @@ -20,7 +20,7 @@ Qt::StrongFocus - 1 + 0 @@ -58,50 +58,9 @@ 0 - - Qt::TabFocus - <b>Reviewing</b> - - false - - - - - - - Show divider between question and answer - - - - - - - Put space between question and answer - - - - - - - Show next time before answer - - - - - - - Show due count and progress during review - - - - - - - Prevent edits until answer shown - @@ -111,6 +70,27 @@ + + + + Center question and answer + + + + + + + Show next times + + + + + + + Show due count and progress + + + @@ -218,23 +198,13 @@ - - - Sync on deck open/close - - - true - - - - Sync on program open/close - + Disable sync when deck moved @@ -269,30 +239,6 @@ - - - - Username - - - - - - - - - - Password - - - - - - - QLineEdit::Password - - - @@ -308,6 +254,39 @@ 0 + + 1 + + + 65535 + + + 8080 + + + + + + + Username + + + + + + + + + + Password + + + + + + + QLineEdit::Password + @@ -339,90 +318,12 @@ - Saving + Backups 10 - - - - <b>Autosaving</b> - - - - - - - 6 - - - - - Save after answering - - - true - - - - - - - - 60 - 16777215 - - - - - - - - Save after adding - - - true - - - - - - - - 60 - 16777215 - - - - - - - - Save when closing - - - true - - - - - - - cards - - - - - - - facts - - - - - @@ -487,6 +388,16 @@ + + + + Note that your media folders are <b>not</b> backed up. It's recommended you keep your media in DropBox to avoid data loss. + + + true + + + @@ -519,128 +430,29 @@ - - - - Show timer - - - - - - - Alternative theme - - - - - - - Show study options on deck load - - - - - - - Show tray icon - - - - - - - Add hidden char to text (fixes Thai on OSX) - - - - + Always open last deck on startup - - - - Show decks with cards due first in browser - - - - - - - Delete original media on add - - - - - - - Colour next times - - - - + Strip HTML when pasting text - - + + - Optimize for small screens + Delete original media on add - - - - Qt::Vertical - - - QSizePolicy::Preferred - - - - 20 - 10 - - - - - - - - - - Max deck name length in deck browser: - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - @@ -683,42 +495,24 @@ tabWidget interfaceLang - label_2 - showDivider - splitQA + autoplaySounds + centerQA showEstimates showProgress - preventEdits - autoplaySounds mediaChoice mediaPath syncUser syncPass - syncOnOpen syncOnProgramOpen disableWhenMoved proxyHost proxyPort proxyUser proxyPass - saveAfterEvery - saveAfterEveryNum - saveAfterAdding - saveAfterAddingNum - saveWhenClosing numBackups - alternativeTheme - colourTimes - showTimer - showTray stripHTML - showStudyOptions openLastDeck - deckBrowserOrder - optimizeSmall deleteMedia - addZeroSpace - deckBrowserLen buttonBox