Components/Converter: add ValueToPixmap converter to convert a given path or language...
[enigma2.git] / lib / python / Screens / VirtualKeyBoard.py
1 # -*- coding: UTF-8 -*-
2 from Components.Language import language
3 from Components.ActionMap import ActionMap
4 from Components.Sources.StaticText import StaticText
5 from Components.Label import Label
6 from Components.Pixmap import Pixmap
7 from Components.MenuList import MenuList
8 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
9 from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_CENTER, RT_VALIGN_CENTER
10 from Screen import Screen
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"],
101                         {
102                                 "ok": self.okClicked,
103                                 "cancel": self.exit,
104                                 "left": self.left,
105                                 "right": self.right,
106                                 "up": self.up,
107                                 "down": self.down,
108                                 "red": self.backClicked,
109                                 "green": self.ok,
110                                 "yellow": self.switchLang
111                         }, -2)
112                 self.setLanq()
113                 self.onLayoutFinish.append(self.buildVirtualKeyBoard)
114         
115         def switchLang(self):
116                 self.lang = self.nextLang
117                 self.setLanq()
118                 self.buildVirtualKeyBoard()
119
120         def setLanq(self):
121                 if self.lang == 'de_DE':
122                         self.keys_list = [
123                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
124                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ü", u"+"],
125                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"],
126                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
127                                 [u"SHIFT", u"SPACE", u"@", u"ß", u"OK"]]
128                         self.shiftkeys_list = [
129                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
130                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ü", u"*"],
131                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"],
132                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
133                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"OK"]]
134                         self.nextLang = 'es_ES'
135                 elif self.lang == 'es_ES':
136                         #still missing keys (u"ùÙ")
137                         self.keys_list = [
138                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
139                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"],
140                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ó", u"á", u"#"],
141                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
142                                 [u"SHIFT", u"SPACE", u"@", u"Ł", u"ŕ", u"é", u"č", u"í", u"ě", u"ń", u"ň", u"OK"]]
143                         self.shiftkeys_list = [
144                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
145                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ú", u"*"],
146                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ó", u"Á", u"'"],
147                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
148                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"Ŕ", u"É", u"Č", u"Í", u"Ě", u"Ń", u"Ň", u"OK"]]
149                         self.nextLang = 'fi_FI'
150                 elif self.lang == 'fi_FI':
151                         self.keys_list = [
152                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
153                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"],
154                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"],
155                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
156                                 [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK"]]
157                         self.shiftkeys_list = [
158                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
159                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"],
160                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"],
161                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
162                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK"]]
163                         self.nextLang = 'sv_SE'
164                 elif self.lang == 'sv_SE':
165                         self.keys_list = [
166                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
167                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"],
168                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"],
169                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
170                                 [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK"]]
171                         self.shiftkeys_list = [
172                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
173                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"],
174                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"],
175                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
176                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK"]]
177                         self.nextLang = 'sk_SK'
178                 elif self.lang =='sk_SK':
179                         self.keys_list = [
180                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
181                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"],
182                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ľ", u"@", u"#"],
183                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
184                                 [u"SHIFT", u"SPACE", u"š", u"č", u"ž", u"ý", u"á", u"í", u"é", u"OK"]]
185                         self.shiftkeys_list = [
186                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
187                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*"],
188                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"],
189                                 [u"Á", u"É", u"Ď", u"Í", u"Ý", u"Ó", u"Ú", u"Ž", u"Š", u"Č", u"Ť", u"Ň"],
190                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
191                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"ä", u"ö", u"ü", u"ô", u"ŕ", u"ĺ", u"OK"]]
192                         self.nextLang = 'cs_CZ'
193                 elif self.lang == 'cs_CZ':
194                         self.keys_list = [
195                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
196                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"],
197                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ů", u"@", u"#"],
198                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
199                                 [u"SHIFT", u"SPACE", u"ě", u"š", u"č", u"ř", u"ž", u"ý", u"á", u"í", u"é", u"OK"]]
200                         self.shiftkeys_list = [
201                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
202                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*"],
203                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"],
204                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
205                                 [u"SHIFT", u"SPACE", u"?", u"\\", u"Č", u"Ř", u"Š", u"Ž", u"Ú", u"Á", u"É", u"OK"]]
206                         self.nextLang = 'en_EN'
207                 else:
208                         self.keys_list = [
209                                 [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"],
210                                 [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"+", u"@"],
211                                 [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"#", u"\\"],
212                                 [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"CLEAR"],
213                                 [u"SHIFT", u"SPACE", u"OK"]]
214                         self.shiftkeys_list = [
215                                 [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"],
216                                 [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"*"],
217                                 [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"'", u"?"],
218                                 [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"],
219                                 [u"SHIFT", u"SPACE", u"OK"]]
220                         self.lang = 'en_EN'
221                         self.nextLang = 'de_DE'         
222                 self["country"].setText(self.lang)
223                 self.max_key=47+len(self.keys_list[4])
224
225         def buildVirtualKeyBoard(self, selectedKey=0):
226                 list = []
227                 
228                 if self.shiftMode:
229                         self.k_list = self.shiftkeys_list
230                         for keys in self.k_list:
231                                 if selectedKey < 12 and selectedKey > -1:
232                                         list.append(VirtualKeyBoardEntryComponent(keys, selectedKey,True))
233                                 else:
234                                         list.append(VirtualKeyBoardEntryComponent(keys, -1,True))
235                                 selectedKey -= 12
236                 else:
237                         self.k_list = self.keys_list
238                         for keys in self.k_list:
239                                 if selectedKey < 12 and selectedKey > -1:
240                                         list.append(VirtualKeyBoardEntryComponent(keys, selectedKey))
241                                 else:
242                                         list.append(VirtualKeyBoardEntryComponent(keys, -1))
243                                 selectedKey -= 12
244                 
245                 self["list"].setList(list)
246         
247         def backClicked(self):
248                 self.text = self["text"].getText()[:-1]
249                 self["text"].setText(self.text)
250                         
251         def okClicked(self):
252                 if self.shiftMode:
253                         list = self.shiftkeys_list
254                 else:
255                         list = self.keys_list
256                 
257                 selectedKey = self.selectedKey
258
259                 text = None
260
261                 for x in list:
262                         if selectedKey < 12:
263                                 if selectedKey < len(x):
264                                         text = x[selectedKey]
265                                 break
266                         else:
267                                 selectedKey -= 12
268
269                 if text is None:
270                         return
271
272                 text = text.encode("UTF-8")
273
274                 if text == "EXIT":
275                         self.close(None)
276                 
277                 elif text == "BACKSPACE":
278                         self.text = self["text"].getText()[:-1]
279                         self["text"].setText(self.text)
280                 
281                 elif text == "CLEAR":
282                         self.text = ""
283                         self["text"].setText(self.text)
284                 
285                 elif text == "SHIFT":
286                         if self.shiftMode:
287                                 self.shiftMode = False
288                         else:
289                                 self.shiftMode = True
290                         
291                         self.buildVirtualKeyBoard(self.selectedKey)
292                 
293                 elif text == "SPACE":
294                         self.text += " "
295                         self["text"].setText(self.text)
296                 
297                 elif text == "OK":
298                         self.close(self["text"].getText())
299                 
300                 else:
301                         self.text = self["text"].getText()
302                         self.text += text
303                         self["text"].setText(self.text)
304
305         def ok(self):
306                 self.close(self["text"].getText())
307
308         def exit(self):
309                 self.close(None)
310
311         def left(self):
312                 self.selectedKey -= 1
313                 
314                 if self.selectedKey == -1:
315                         self.selectedKey = 11
316                 elif self.selectedKey == 11:
317                         self.selectedKey = 23
318                 elif self.selectedKey == 23:
319                         self.selectedKey = 35
320                 elif self.selectedKey == 35:
321                         self.selectedKey = 47
322                 elif self.selectedKey == 47:
323                         self.selectedKey = self.max_key
324                 
325                 self.showActiveKey()
326
327         def right(self):
328                 self.selectedKey += 1
329                 
330                 if self.selectedKey == 12:
331                         self.selectedKey = 0
332                 elif self.selectedKey == 24:
333                         self.selectedKey = 12
334                 elif self.selectedKey == 36:
335                         self.selectedKey = 24
336                 elif self.selectedKey == 48:
337                         self.selectedKey = 36
338                 elif self.selectedKey > self.max_key:
339                         self.selectedKey = 48
340                 
341                 self.showActiveKey()
342
343         def up(self):
344                 self.selectedKey -= 12
345                 
346                 if (self.selectedKey < 0) and (self.selectedKey > (self.max_key-60)):
347                         self.selectedKey += 48
348                 elif self.selectedKey < 0:
349                         self.selectedKey += 60  
350                 
351                 self.showActiveKey()
352
353         def down(self):
354                 self.selectedKey += 12
355                 
356                 if (self.selectedKey > self.max_key) and (self.selectedKey > 59):
357                         self.selectedKey -= 60
358                 elif self.selectedKey > self.max_key:
359                         self.selectedKey -= 48
360                 
361                 self.showActiveKey()
362
363         def showActiveKey(self):
364                 self.buildVirtualKeyBoard(self.selectedKey)