TranscodingSetup : fix misspelling name.
[vuplus_dvbapp] / lib / python / Screens / VirtualKeyBoard.py
1 # -*- coding: UTF-8 -*-
2 from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_CENTER, RT_VALIGN_CENTER, getPrevAsciiCode
3 from Screen import Screen
4 from Components.Language import language
5 from Components.ActionMap import ActionMap
6 from Components.Sources.StaticText import StaticText
7 from Components.Label import Label
8 from Components.Pixmap import Pixmap
9 from Components.MenuList import MenuList
10 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
11 from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
12 from Tools.LoadPixmap import LoadPixmap
13
14 class VirtualKeyBoardList(MenuList):
15         def __init__(self, list, enableWrapAround=False):
16                 MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
17                 self.l.setFont(0, gFont("Regular", 28))
18                 self.l.setItemHeight(45)
19
20 def VirtualKeyBoardEntryComponent(keys, selectedKey,shiftMode=False):
21         key_backspace = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_backspace.png"))
22         key_bg = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_bg.png"))
23         key_clr = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_clr.png"))
24         key_esc = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_esc.png"))
25         key_ok = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_ok.png"))
26         key_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_sel.png"))
27         key_shift = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift.png"))
28         key_shift_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift_sel.png"))
29         key_space = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_space.png"))
30         res = [ (keys) ]
31         
32         x = 0
33         count = 0
34         if shiftMode:
35                 shiftkey_png = key_shift_sel
36         else:
37                 shiftkey_png = key_shift
38         for key in keys:
39                 width = None
40                 if key == "EXIT":
41                         width = key_esc.size().width()
42                         res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_esc))
43                 elif key == "BACKSPACE":
44                         width = key_backspace.size().width()
45                         res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_backspace))
46                 elif key == "CLEAR":
47                         width = key_clr.size().width()
48                         res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_clr))
49                 elif key == "SHIFT":
50                         width = shiftkey_png.size().width()
51                         res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=shiftkey_png))
52                 elif key == "SPACE":
53                         width = key_space.size().width()
54                         res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_space))
55                 elif key == "OK":
56                         width = key_ok.size().width()
57                         res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_ok))
58                 #elif key == "<-":
59                 #       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_left))
60                 #elif key == "->":
61                 #       res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_right))
62                 
63                 else:
64                         width = key_bg.size().width()
65                         res.extend((
66                                 MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_bg),
67                                 MultiContentEntryText(pos=(x, 0), size=(width, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)
68                         ))
69                 
70                 if selectedKey == count:
71                         width = key_sel.size().width()
72                         res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_sel))
73
74                 if width is not None:
75                         x += width
76                 else:
77                         x += 45
78                 count += 1
79         
80         return res
81
82
83 class VirtualKeyBoard(Screen):
84
85         def __init__(self, session, title="", text=""):
86                 Screen.__init__(self, session)
87                 self.keys_list = []
88                 self.shiftkeys_list = []
89                 self.lang = language.getLanguage()
90                 self.nextLang = None
91                 self.shiftMode = False
92                 self.text = text
93                 self.selectedKey = 0
94                 
95                 self["country"] = StaticText("")
96                 self["header"] = Label(title)
97                 self["text"] = Label(self.text)
98                 self["list"] = VirtualKeyBoardList([])
99                 
100                 self["actions"] = ActionMap(["OkCancelActions", "WizardActions", "ColorActions", "KeyboardInputActions", "InputBoxActions", "InputAsciiActions"],
101                         {
102                                 "gotAsciiCode": self.keyGotAscii,
103                                 "ok": self.okClicked,
104                                 "cancel": self.exit,
105                                 "left": self.left,
106                                 "right": self.right,
107                                 "up": self.up,
108                                 "down": self.down,
109                                 "red": self.backClicked,
110                                 "green": self.ok,
111                                 "yellow": self.switchLang,
112                                 "deleteBackward": self.backClicked,
113                                 "back": self.exit                               
114                         }, -2)
115                 self.setLang()
116                 self.onExecBegin.append(self.setKeyboardModeAscii)
117                 self.onLayoutFinish.append(self.buildVirtualKeyBoard)
118         
119         def switchLang(self):
120                 self.lang = self.nextLang
121                 self.setLang()
122                 self.buildVirtualKeyBoard()
123
124         def setLang(self):
125                 if self.lang == 'de_DE':
126                         self.keys_list = [
127                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
128                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ü", u"+"],
129                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"],
130                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
131                                 [u"SHIFT", u"SPACE", u"@", u"ß", u"OK"]]
132                         self.shiftkeys_list = [
133                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
134                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ü", u"*"],
135                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"],
136                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
137                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"OK"]]
138                         self.nextLang = 'es_ES'
139                 elif self.lang == 'es_ES':
140                         #still missing keys (u"ùÙ")
141                         self.keys_list = [
142                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
143                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"],
144                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ó", u"á", u"#"],
145                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
146                                 [u"SHIFT", u"SPACE", u"@", u"Ł", u"ŕ", u"é", u"č", u"í", u"ě", u"ń", u"ň", u"OK"]]
147                         self.shiftkeys_list = [
148                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
149                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ú", u"*"],
150                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ó", u"Á", u"'"],
151                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
152                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"Ŕ", u"É", u"Č", u"Í", u"Ě", u"Ń", u"Ň", u"OK"]]
153                         self.nextLang = 'fi_FI'
154                 elif self.lang == 'fi_FI':
155                         self.keys_list = [
156                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
157                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"],
158                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"],
159                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
160                                 [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK"]]
161                         self.shiftkeys_list = [
162                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
163                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"],
164                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"],
165                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
166                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK"]]
167                         self.nextLang = 'sv_SE'
168                 elif self.lang == 'sv_SE':
169                         self.keys_list = [
170                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
171                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"],
172                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"],
173                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
174                                 [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK"]]
175                         self.shiftkeys_list = [
176                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
177                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"],
178                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"],
179                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
180                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK"]]
181                         self.nextLang = 'sk_SK'
182                 elif self.lang =='sk_SK':
183                         self.keys_list = [
184                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
185                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"],
186                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ľ", u"@", u"#"],
187                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
188                                 [u"SHIFT", u"SPACE", u"š", u"č", u"ž", u"ý", u"á", u"í", u"é", u"OK"]]
189                         self.shiftkeys_list = [
190                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
191                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*"],
192                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"],
193                                 [u"Á", u"É", u"Ď", u"Í", u"Ý", u"Ó", u"Ú", u"Ž", u"Š", u"Č", u"Ť", u"Ň"],
194                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
195                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"ä", u"ö", u"ü", u"ô", u"ŕ", u"ĺ", u"OK"]]
196                         self.nextLang = 'cs_CZ'
197                 elif self.lang == 'cs_CZ':
198                         self.keys_list = [
199                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
200                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"],
201                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ů", u"@", u"#"],
202                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
203                                 [u"SHIFT", u"SPACE", u"ě", u"š", u"č", u"ř", u"ž", u"ý", u"á", u"í", u"é", u"OK"]]
204                         self.shiftkeys_list = [
205                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
206                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*"],
207                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"],
208                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
209                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"Č", u"Ř", u"Š", u"Ž", u"Ú", u"Á", u"É", u"OK"]]
210                         self.nextLang = 'en_EN'
211                 else:
212                         self.keys_list = [
213                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
214                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"+", u"@"],
215                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"#", u"\\", u"|"],
216                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
217                                 [u"SHIFT", u"SPACE", u"OK"]]
218                         self.shiftkeys_list = [
219                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
220                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"*", u"["],
221                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"'", u"?", u"]"],
222                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
223                                 [u"SHIFT", u"SPACE", u"OK"]]
224                         self.lang = 'en_EN'
225                         self.nextLang = 'de_DE'         
226                 self["country"].setText(self.lang)
227                 self.max_key=47+len(self.keys_list[4])
228
229         def buildVirtualKeyBoard(self, selectedKey=0):
230                 list = []
231                 
232                 if self.shiftMode:
233                         self.k_list = self.shiftkeys_list
234                         for keys in self.k_list:
235                                 keyslen = len(keys)
236                                 if selectedKey < keyslen and selectedKey > -1:
237                                         list.append(VirtualKeyBoardEntryComponent(keys, selectedKey,True))
238                                 else:
239                                         list.append(VirtualKeyBoardEntryComponent(keys, -1,True))
240                                 selectedKey -= keyslen
241                 else:
242                         self.k_list = self.keys_list
243                         for keys in self.k_list:
244                                 keyslen = len(keys)
245                                 if selectedKey < keyslen and selectedKey > -1:
246                                         list.append(VirtualKeyBoardEntryComponent(keys, selectedKey))
247                                 else:
248                                         list.append(VirtualKeyBoardEntryComponent(keys, -1))
249                                 selectedKey -= keyslen
250                 
251                 self["list"].setList(list)
252         
253         def backClicked(self):
254                 self.text = self["text"].getText()[:-1]
255                 self["text"].setText(self.text)
256
257         def okClicked(self):
258                 if self.shiftMode:
259                         list = self.shiftkeys_list
260                 else:
261                         list = self.keys_list
262                 
263                 selectedKey = self.selectedKey
264
265                 text = None
266
267                 for x in list:
268                         xlen = len(x)
269                         if selectedKey < xlen:
270                                 if selectedKey < len(x):
271                                         text = x[selectedKey]
272                                 break
273                         else:
274                                 selectedKey -= xlen
275
276                 if text is None:
277                         return
278
279                 text = text.encode("UTF-8")
280
281                 if text == "EXIT":
282                         self.close(None)
283                 
284                 elif text == "BACKSPACE":
285                         self.text = self["text"].getText()[:-1]
286                         self["text"].setText(self.text)
287                 
288                 elif text == "CLEAR":
289                         self.text = ""
290                         self["text"].setText(self.text)
291                 
292                 elif text == "SHIFT":
293                         if self.shiftMode:
294                                 self.shiftMode = False
295                         else:
296                                 self.shiftMode = True
297                         
298                         self.buildVirtualKeyBoard(self.selectedKey)
299                 
300                 elif text == "SPACE":
301                         self.text += " "
302                         self["text"].setText(self.text)
303                 
304                 elif text == "OK":
305                         self.close(self["text"].getText())
306                 
307                 else:
308                         self.text = self["text"].getText()
309                         self.text += text
310                         self["text"].setText(self.text)
311
312         def ok(self):
313                 self.close(self["text"].getText())
314
315         def exit(self):
316                 self.close(None)
317
318         def left(self):
319                 self.selectedKey -= 1
320                 
321                 if self.selectedKey == -1:
322                         self.selectedKey = 11
323                 elif self.selectedKey == 11:
324                         self.selectedKey = 23
325                 elif self.selectedKey == 23:
326                         self.selectedKey = 35
327                 elif self.selectedKey == 35:
328                         self.selectedKey = 47
329                 elif self.selectedKey == 47:
330                         self.selectedKey = self.max_key
331                 
332                 self.showActiveKey()
333
334         def right(self):
335                 self.selectedKey += 1
336                 
337                 if self.selectedKey == 12:
338                         self.selectedKey = 0
339                 elif self.selectedKey == 24:
340                         self.selectedKey = 12
341                 elif self.selectedKey == 36:
342                         self.selectedKey = 24
343                 elif self.selectedKey == 48:
344                         self.selectedKey = 36
345                 elif self.selectedKey > self.max_key:
346                         self.selectedKey = 48
347                 
348                 self.showActiveKey()
349
350         def up(self):
351                 self.selectedKey -= 12
352                 
353                 if (self.selectedKey < 0) and (self.selectedKey > (self.max_key-60)):
354                         self.selectedKey += 48
355                 elif self.selectedKey < 0:
356                         self.selectedKey += 60  
357                 
358                 self.showActiveKey()
359
360         def down(self):
361                 self.selectedKey += 12
362                 
363                 if (self.selectedKey > self.max_key) and (self.selectedKey > 59):
364                         self.selectedKey -= 60
365                 elif self.selectedKey > self.max_key:
366                         self.selectedKey -= 48
367                 
368                 self.showActiveKey()
369
370         def showActiveKey(self):
371                 self.buildVirtualKeyBoard(self.selectedKey)
372
373         def inShiftKeyList(self,key):
374                 for KeyList in self.shiftkeys_list:
375                         for char in KeyList:
376                                 if char == key:
377                                         return True
378                 return False
379
380         def keyGotAscii(self):
381                 #char = str(unichr(getPrevAsciiCode()).encode('utf-8'))
382                 from Components.config import getCharValue
383                 char = getCharValue(getPrevAsciiCode())
384                 if len(str(char)) == 1:
385                         char = char.encode("utf-8")
386                 if self.inShiftKeyList(char):
387                         self.shiftMode = True
388                         list = self.shiftkeys_list
389                 else:
390                         self.shiftMode = False
391                         list = self.keys_list   
392
393                 if char == " ":
394                         char = "SPACE"
395
396                 selkey = 0
397                 for keylist in list:
398                         for key in keylist:
399                                 if key == char:
400                                         self.selectedKey = selkey
401                                         self.okClicked()
402                                         self.showActiveKey()
403                                         return
404                                 else:
405                                         selkey += 1