add proxy config & numBackups to preferences, based on richard's plugin

This commit is contained in:
Damien Elmes 2009-06-04 05:26:25 +09:00
parent e9f08517e9
commit 8e91cde377
5 changed files with 340 additions and 109 deletions

View file

@ -91,6 +91,10 @@ class Config(dict):
'recentColours': ["#000000", "#0000ff"],
'preventEditUntilAnswer': False,
'numBackups': 30,
'proxyHost': '',
'proxyPort': 8080,
'proxyUser': '',
'proxyPass': '',
}
for (k,v) in fields.items():
if not self.has_key(k):

View file

@ -50,6 +50,9 @@ class GetShared(QDialog):
def fetchData(self):
h = QHttp(self)
h.connect(h, SIGNAL("requestFinished(int,bool)"), self.onReqFin)
h.connect(h, SIGNAL("proxyAuthenticationRequired(QNetworkProxy,"
"QAuthenticator*)"),
self.onProxyAuth)
h.setHost("anki.ichi2.net")
#h.setHost("localhost", 8001)
self.conId = h.get("/file/search?t=%d" % self.type)
@ -57,6 +60,10 @@ class GetShared(QDialog):
self.parent.setProgressParent(self)
self.parent.startProgress()
def onProxyAuth(self, proxy, auth):
auth.setUser(self.parent.config['proxyUser'])
auth.setPassword(self.parent.config['proxyPass'])
def onReqFin(self, id, err):
"List fetched."
if id != self.conId:
@ -158,6 +165,9 @@ class GetShared(QDialog):
def accept(self):
h = QHttp(self)
h.connect(h, SIGNAL("requestFinished(int,bool)"), self.onReqFin2)
h.connect(h, SIGNAL("proxyAuthenticationRequired(QNetworkProxy,"
"QAuthenticator*)"),
self.onProxyAuth)
h.setHost("anki.ichi2.net")
#h.setHost("localhost", 8001)
self.conId = h.get("/file/get?id=%d" % self.curRow[R_ID])

View file

@ -46,6 +46,7 @@ class AnkiQt(QMainWindow):
self.setLang()
self.setupFonts()
self.setupBackupDir()
self.setupProxy()
self.setupMainWindow()
self.setupSystemHacks()
self.setupSound()
@ -2480,6 +2481,34 @@ Consider backing up your media directory first."""))
self.mainWin.optionsBox.layout().setSpacing(10)
self.mainWin.optionsBox.layout().setContentsMargins(4, 10, 4, 4)
# Proxy support
##########################################################################
def setupProxy(self):
from PyQt4.QtNetwork import QNetworkProxy
import urllib2
if self.config['proxyHost']:
# qt
proxy = QNetworkProxy()
proxy.setType(QNetworkProxy.HttpProxy)
proxy.setHostName(self.config['proxyHost'])
proxy.setPort(self.config['proxyPort'])
if self.config['proxyUser']:
proxy.setUser(self.config['proxyUser'])
proxy.setPass(self.config['proxyPass'])
QNetworkProxy.setApplicationProxy(proxy)
# python
proxy = "http://"
if self.config['proxyUser']:
proxy += (self.config['proxyUser'] + ":" +
self.config['proxyPass'] + "@")
proxy += (self.config['proxyHost'] + ":" +
str(self.config['proxyPort']))
os.environ["http_proxy"] = proxy
proxy_handler = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
# Misc
##########################################################################

View file

@ -2,7 +2,7 @@
# Copyright: Damien Elmes <anki@ichi2.net>
# License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html
import copy, sys
import copy, sys, os
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import anki, anki.utils
@ -12,7 +12,8 @@ from ankiqt import ui
import ankiqt.forms
tabs = ("Display",
"SaveAndSync",
"Network",
"Saving",
"Advanced")
class Preferences(QDialog):
@ -47,13 +48,13 @@ class Preferences(QDialog):
self.supportedLanguages.sort()
self.connect(self.dialog.buttonBox, SIGNAL("helpRequested()"), self.helpRequested)
self.setupLang()
self.setupSync()
self.setupNetwork()
self.setupSave()
self.setupAdvanced()
self.show()
def accept(self):
self.updateSync()
self.updateNetwork()
self.updateSave()
self.updateAdvanced()
self.config['interfaceLang'] = self.origConfig['interfaceLang']
@ -81,17 +82,27 @@ class Preferences(QDialog):
self.parent.setLang()
self.dialog.retranslateUi(self)
def setupSync(self):
def setupNetwork(self):
self.dialog.syncOnOpen.setChecked(self.config['syncOnLoad'])
self.dialog.syncOnClose.setChecked(self.config['syncOnClose'])
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 updateSync(self):
def updateNetwork(self):
self.config['syncOnLoad'] = self.dialog.syncOnOpen.isChecked()
self.config['syncOnClose'] = self.dialog.syncOnClose.isChecked()
self.config['syncUsername'] = unicode(self.dialog.syncUser.text())
self.config['syncPassword'] = unicode(self.dialog.syncPass.text())
self.config['proxyHost'] = unicode(self.dialog.proxyHost.text())
self.config['proxyPort'] = int(self.dialog.proxyPort.value())
self.config['proxyUser'] = unicode(self.dialog.proxyUser.text())
self.config['proxyPass'] = unicode(self.dialog.proxyPass.text())
def setupSave(self):
self.dialog.saveAfterEveryNum.setValue(self.config['saveAfterAnswerNum'])
@ -99,6 +110,19 @@ class Preferences(QDialog):
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)"),
self.onOpenBackup)
def onOpenBackup(self):
path = os.path.join(self.config.configPath, "backups")
if sys.platform == "win32":
anki.latex.call(["explorer", path.encode(
sys.getfilesystemencoding())],
wait=False)
else:
QDesktopServices.openUrl(QUrl("file://" + path))
def updateSave(self):
self.config['saveAfterAnswer'] = self.dialog.saveAfterEvery.isChecked()
@ -106,6 +130,7 @@ class Preferences(QDialog):
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.showEstimates.setChecked(not self.config['suppressEstimates'])

View file

@ -6,7 +6,7 @@
<x>0</x>
<y>0</y>
<width>320</width>
<height>399</height>
<height>419</height>
</rect>
</property>
<property name="windowTitle" >
@ -130,19 +130,16 @@
</widget>
<widget class="QWidget" name="tab_2" >
<attribute name="title" >
<string>Save &amp;&amp; Sync</string>
<string>Network</string>
</attribute>
<layout class="QVBoxLayout" >
<layout class="QVBoxLayout" name="verticalLayout_4" >
<property name="spacing" >
<number>6</number>
</property>
<property name="margin" >
<number>9</number>
<number>10</number>
</property>
<item>
<layout class="QHBoxLayout" >
<property name="spacing" >
<number>6</number>
<number>10</number>
</property>
<property name="margin" >
<number>0</number>
@ -155,23 +152,6 @@
<property name="margin" >
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_4" >
<property name="text" >
<string>&lt;h1>Autosaving&lt;/h1></string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="saveWhenClosing" >
<property name="text" >
<string>Save when closing</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" >
<property name="margin" >
@ -180,46 +160,6 @@
<property name="spacing" >
<number>6</number>
</property>
<item row="1" 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="1" column="1" >
<widget class="QSpinBox" name="saveAfterEveryNum" />
</item>
<item row="1" column="2" >
<widget class="QLabel" name="label_5" >
<property name="text" >
<string>cards</string>
</property>
</widget>
</item>
<item row="2" 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="2" column="1" >
<widget class="QSpinBox" name="saveAfterAddingNum" />
</item>
<item row="2" column="2" >
<widget class="QLabel" name="label_7" >
<property name="text" >
<string>facts</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
@ -293,6 +233,71 @@
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_13" >
<property name="text" >
<string>&lt;h1>Proxy&lt;/h1></string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_3" >
<property name="verticalSpacing" >
<number>6</number>
</property>
<item row="0" column="0" >
<widget class="QLabel" name="label_14" >
<property name="text" >
<string>Host</string>
</property>
</widget>
</item>
<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" >
<string>Port</string>
</property>
</widget>
</item>
<item row="0" column="3" >
<widget class="QSpinBox" name="proxyPort" >
<property name="minimumSize" >
<size>
<width>60</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2" >
<property name="orientation" >
@ -306,6 +311,191 @@
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_12" >
<property name="text" >
<string>Some settings will take effect after you restart Anki.</string>
</property>
<property name="alignment" >
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab" >
<attribute name="title" >
<string>Saving</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;h1>Autosaving&lt;/h1></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" >
<string>&lt;h1>Backups&lt;/h1>Decks are backed up when they are opened, and only if they have been modified since the last backup.</string>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_2" >
<item row="0" column="0" >
<widget class="QLabel" name="label_10" >
<property name="text" >
<string>Keep</string>
</property>
</widget>
</item>
<item row="0" column="1" >
<widget class="QSpinBox" name="numBackups" >
<property name="minimumSize" >
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="maximumSize" >
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="0" column="2" >
<widget class="QLabel" name="label_11" >
<property name="text" >
<string>backups of each deck</string>
</property>
</widget>
</item>
<item row="0" column="3" >
<spacer name="horizontalSpacer" >
<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>
<widget class="QLabel" name="openBackupFolder" >
<property name="text" >
<string>&lt;a href="backups">Open backup folder&lt;/a></string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4" >
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0" >
<size>
<width>20</width>
<height>59</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_21" >
<property name="text" >
<string>Some settings will take effect after you restart Anki.</string>
</property>
<property name="alignment" >
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3" >
@ -415,7 +605,6 @@
</layout>
</widget>
<tabstops>
<tabstop>tabWidget</tabstop>
<tabstop>interfaceLang</tabstop>
<tabstop>label_2</tabstop>
<tabstop>showDivider</tabstop>
@ -423,21 +612,27 @@
<tabstop>showEstimates</tabstop>
<tabstop>showProgress</tabstop>
<tabstop>preventEdits</tabstop>
<tabstop>saveWhenClosing</tabstop>
<tabstop>saveAfterEvery</tabstop>
<tabstop>saveAfterEveryNum</tabstop>
<tabstop>saveAfterAdding</tabstop>
<tabstop>saveAfterAddingNum</tabstop>
<tabstop>syncUser</tabstop>
<tabstop>syncPass</tabstop>
<tabstop>syncOnOpen</tabstop>
<tabstop>syncOnClose</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>showTimer</tabstop>
<tabstop>showTray</tabstop>
<tabstop>showStudyOptions</tabstop>
<tabstop>addZeroSpace</tabstop>
<tabstop>buttonBox</tabstop>
<tabstop>tabWidget</tabstop>
</tabstops>
<resources/>
<connections>
@ -473,37 +668,5 @@
</hint>
</hints>
</connection>
<connection>
<sender>saveAfterEvery</sender>
<signal>toggled(bool)</signal>
<receiver>saveAfterEveryNum</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>113</x>
<y>68</y>
</hint>
<hint type="destinationlabel" >
<x>116</x>
<y>68</y>
</hint>
</hints>
</connection>
<connection>
<sender>saveAfterAdding</sender>
<signal>toggled(bool)</signal>
<receiver>saveAfterAddingNum</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>99</x>
<y>68</y>
</hint>
<hint type="destinationlabel" >
<x>116</x>
<y>68</y>
</hint>
</hints>
</connection>
</connections>
</ui>