Helpviewer/HelpLanguagesDialog.py

changeset 0
de9c2efb9d02
child 7
c679fb30c8f3
equal deleted inserted replaced
-1:000000000000 0:de9c2efb9d02
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2009 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog to configure the preferred languages.
8 """
9
10 from PyQt4.QtCore import *
11 from PyQt4.QtGui import *
12
13 from Ui_HelpLanguagesDialog import Ui_HelpLanguagesDialog
14
15 import Preferences
16
17 class HelpLanguagesDialog(QDialog, Ui_HelpLanguagesDialog):
18 """
19 Class implementing a dialog to configure the preferred languages.
20 """
21 def __init__(self, parent = None):
22 """
23 Constructor
24
25 @param parent reference to the parent widget (QWidget)
26 """
27 QDialog.__init__(self, parent)
28 self.setupUi(self)
29
30 self.__model = QStringListModel()
31 self.languagesList.setModel(self.__model)
32 self.connect(self.languagesList.selectionModel(),
33 SIGNAL("currentChanged(const QModelIndex&, const QModelIndex&)"),
34 self.__currentChanged)
35
36 languages = Preferences.Prefs.settings.value(
37 "Help/AcceptLanguages", QVariant(self.defaultAcceptLanguages()))\
38 .toStringList()
39 self.__model.setStringList(languages)
40
41 allLanguages = []
42 for index in range(QLocale.C + 1, QLocale.LastLanguage + 1):
43 allLanguages += self.expand(QLocale.Language(index))
44 self.__allLanguagesModel = QStringListModel()
45 self.__allLanguagesModel.setStringList(allLanguages)
46 self.addCombo.setModel(self.__allLanguagesModel)
47
48 def __currentChanged(self, current, previous):
49 """
50 Private slot to handle a change of the current selection.
51
52 @param current index of the currently selected item (QModelIndex)
53 @param previous index of the previously selected item (QModelIndex)
54 """
55 self.removeButton.setEnabled(current.isValid())
56 row = current.row()
57 self.upButton.setEnabled(row > 0)
58 self.downButton.setEnabled(row != -1 and row < self.__model.rowCount() - 1)
59
60 @pyqtSlot()
61 def on_upButton_clicked(self):
62 """
63 Private slot to move a language up.
64 """
65 currentRow = self.languagesList.currentIndex().row()
66 data = self.languagesList.currentIndex().data()
67 self.__model.removeRow(currentRow)
68 self.__model.insertRow(currentRow - 1)
69 self.__model.setData(self.__model.index(currentRow - 1), data)
70 self.languagesList.setCurrentIndex(self.__model.index(currentRow - 1))
71
72 @pyqtSlot()
73 def on_downButton_clicked(self):
74 """
75 Private slot to move a language down.
76 """
77 currentRow = self.languagesList.currentIndex().row()
78 data = self.languagesList.currentIndex().data()
79 self.__model.removeRow(currentRow)
80 self.__model.insertRow(currentRow + 1)
81 self.__model.setData(self.__model.index(currentRow + 1), data)
82 self.languagesList.setCurrentIndex(self.__model.index(currentRow + 1))
83
84 @pyqtSlot()
85 def on_removeButton_clicked(self):
86 """
87 Private slot to remove a language from the list of acceptable languages.
88 """
89 currentRow = self.languagesList.currentIndex().row()
90 self.__model.removeRow(currentRow)
91
92 @pyqtSlot()
93 def on_addButton_clicked(self):
94 """
95 Private slot to add a language to the list of acceptable languages.
96 """
97 language = self.addCombo.currentText()
98 if language in self.__model.stringList():
99 return
100
101 self.__model.insertRow(self.__model.rowCount())
102 self.__model.setData(self.__model.index(self.__model.rowCount() - 1),
103 QVariant(language))
104 self.languagesList.setCurrentIndex(
105 self.__model.index(self.__model.rowCount() - 1))
106
107 def accept(self):
108 """
109 Public method to accept the data entered.
110 """
111 result = self.__model.stringList()
112 if result == self.defaultAcceptLanguages():
113 Preferences.Prefs.settings.remove("Help/AcceptLanguages")
114 else:
115 Preferences.Prefs.settings.setValue("Help/AcceptLanguages", QVariant(result))
116 QDialog.accept(self)
117
118 @classmethod
119 def httpString(cls, languages):
120 """
121 Class method to convert a list of acceptable languages into a byte array that
122 can be sent along with the Accept-Language http header (see RFC 2616).
123
124 @param languages list of acceptable languages (list of strings)
125 @return converted list (QByteArray)
126 """
127 processed = []
128 qvalue = 1.0
129 for language in languages:
130 leftBracket = language.find('[')
131 rightBracket = language.find(']')
132 tag = language[leftBracket + 1:rightBracket]
133 if not processed:
134 processed.append(tag)
135 else:
136 processed.append("{0};q={1:.1f}".format(tag, qvalue))
137 if qvalue > 0.1:
138 qvalue -= 0.1
139
140 return QByteArray(", ".join(processed))
141
142 @classmethod
143 def defaultAcceptLanguages(cls):
144 """
145 Class method to get the list of default accept languages.
146
147 @return list of acceptable languages (list of strings)
148 """
149 language = QLocale.system().name()
150 if not language:
151 return []
152 else:
153 return cls.expand(QLocale(language).language())
154
155 @classmethod
156 def expand(self, language):
157 """
158 Class method to expand a language enum to a readable languages list.
159
160 @param language language number (QLocale.Language)
161 @return list of expanded language names (list of strings)
162 """
163 allLanguages = []
164 countries = QLocale.countriesForLanguage(language)
165 languageString = "{0} [{1}]"\
166 .format(QLocale.languageToString(language),
167 QLocale(language).name().split('_')[0])
168 allLanguages.append(languageString)
169 for country in countries:
170 languageString = "{0}/{1} [{2}]"\
171 .format(QLocale.languageToString(language),
172 QLocale.countryToString(country),
173 '-'.join(QLocale(language, country).name().split('_')).lower())
174 if languageString not in allLanguages:
175 allLanguages.append(languageString)
176
177 return allLanguages

eric ide

mercurial