factor out loadPNG into generic LoadPixmap
[enigma2.git] / lib / python / Components / Input.py
1 from HTMLComponent import HTMLComponent
2 from GUIComponent import GUIComponent
3 from VariableText import VariableText
4
5 from enigma import eLabel
6
7 from Tools.NumericalTextInput import NumericalTextInput
8
9 class Input(VariableText, HTMLComponent, GUIComponent, NumericalTextInput):
10         TEXT = 0
11         PIN = 1
12         NUMBER = 2
13
14         def __init__(self, text="", maxSize = False, visible_width = False, type = TEXT):
15                 NumericalTextInput.__init__(self, self.right)
16                 GUIComponent.__init__(self)
17                 VariableText.__init__(self)
18                 self.type = type
19                 self.allmarked = (text != "") and (type != self.PIN)
20                 self.maxSize = maxSize
21                 self.currPos = 0
22                 self.visible_width = visible_width
23                 self.offset = 0
24                 self.overwrite = maxSize
25                 self.setText(text)
26                 
27         def __len__(self):
28                 return len(self.text)
29
30         def update(self):
31                 if self.visible_width:
32                         if self.currPos < self.offset:
33                                 self.offset = self.currPos
34                         if self.currPos >= self.offset + self.visible_width:
35                                 if self.currPos == len(self.Text):
36                                         self.offset = self.currPos - self.visible_width
37                                 else:
38                                         self.offset = self.currPos - self.visible_width + 1
39                         if self.offset > 0 and self.offset + self.visible_width > len(self.Text):
40                                 self.offset = max(0, len(self.Text) - self.visible_width)
41                 if self.allmarked:
42                         self.setMarkedPos(-2)
43                 else:
44                         self.setMarkedPos(self.currPos-self.offset)
45                 if self.visible_width:
46                         if self.type == self.PIN:
47                                 self.text = ""
48                                 for x in self.Text[self.offset:self.offset+self.visible_width]:
49                                         self.text += (x==" " and " " or "*")
50                         else:
51                                 self.text = self.Text[self.offset:self.offset+self.visible_width].encode("utf-8") + " "
52                 else:
53                         if self.type == self.PIN:
54                                 self.text = ""
55                                 for x in self.Text:
56                                         self.text += (x==" " and " " or "*")
57                         else:
58                                 self.text = self.Text.encode("utf-8") + " "
59
60         def setText(self, text):
61                 if not len(text):
62                         self.currPos = 0
63                         self.Text = u""
64                 else:
65                         try:
66                                 self.Text = text.decode("utf-8")
67                         except UnicodeDecodeError:
68                                 print "utf8 kaputt!"
69                                 self.Text = text
70                 self.update()
71
72         def getText(self):
73                 return self.Text.encode("utf-8")
74
75         def createWidget(self, parent):
76                 if self.allmarked:
77                         return eLabel(parent, -2)
78                 else:
79                         return eLabel(parent, self.currPos-self.offset)
80
81         def getSize(self):
82                 s = self.instance.calculateSize()
83                 return (s.width(), s.height())
84         
85         def right(self):
86                 if self.type == self.TEXT:
87                         self.timeout()
88                 if self.allmarked:
89                         self.currPos = 0
90                         self.allmarked = False
91                 elif self.maxSize:
92                         if self.currPos < len(self.Text)-1:
93                                 self.currPos += 1
94                 else:
95                         if self.currPos < len(self.Text):
96                                 self.currPos += 1
97                 self.update()
98
99         def left(self):
100                 if self.type == self.TEXT:
101                         self.timeout()
102                 if self.allmarked:
103                         if self.maxSize:
104                                 self.currPos = len(self.Text) - 1
105                         else:
106                                 self.currPos = len(self.Text)
107                         self.allmarked = False
108                 elif self.currPos > 0:
109                         self.currPos -= 1
110                 self.update()
111
112         def up(self):
113                 self.allmarked = False
114                 if self.type == self.TEXT:
115                         self.timeout()
116                 if self.Text[self.currPos] == "9" or self.Text[self.currPos] == " ":
117                         newNumber = "0"
118                 else:
119                         newNumber = str(int(self.Text[self.currPos]) + 1)
120                 self.Text = self.Text[0:self.currPos] + newNumber + self.Text[self.currPos + 1:]
121                 self.update()
122
123         def down(self):
124                 self.allmarked = False
125                 if self.type == self.TEXT:
126                         self.timeout()
127                 if self.Text[self.currPos] == "0" or self.Text[self.currPos] == " ":
128                         newNumber = "9"
129                 else:
130                         newNumber = str(int(self.Text[self.currPos]) - 1)
131                 self.Text = self.Text[0:self.currPos] + newNumber + self.Text[self.currPos + 1:]
132                 self.update()
133                 
134         def home(self):
135                 self.allmarked = False
136                 if self.type == self.TEXT:
137                         self.timeout()
138                 self.currPos = 0
139                 self.update()
140         
141         def end(self):
142                 self.allmarked = False
143                 if self.type == self.TEXT:
144                         self.timeout()
145                 if self.maxSize:
146                         self.currPos = len(self.Text) - 1
147                 else:
148                         self.currPos = len(self.Text)
149                 self.update()
150
151         def insertChar(self, ch, pos, owr, ins):
152                 if ins and not self.maxSize:
153                         self.Text = self.Text[0:pos] + ch + self.Text[pos:]
154                 elif owr or self.overwrite:
155                         self.Text = self.Text[0:pos] + ch + self.Text[pos + 1:]
156                 elif self.maxSize:
157                         self.Text = self.Text[0:pos] + ch + self.Text[pos:-1]
158                 else:
159                         self.Text = self.Text[0:pos] + ch + self.Text[pos:]
160
161         def deleteChar(self, pos):
162                 if not self.maxSize:
163                         self.Text = self.Text[0:pos] + self.Text[pos + 1:]
164                 elif self.overwrite:
165                         self.Text = self.Text[0:pos] + " " + self.Text[pos + 1:]
166                 else:
167                         self.Text = self.Text[0:pos] + self.Text[pos + 1:] + " "
168
169         def deleteAllChars(self):
170                 if self.maxSize:
171                         self.Text = " " * len(self.Text)
172                 else:
173                         self.Text = ""
174                 self.currPos = 0
175
176         def tab(self):
177                 if self.type == self.TEXT:
178                         self.timeout()
179                 if self.allmarked:
180                         self.deleteAllChars()
181                         self.allmarked = False
182                 else:
183                         self.insertChar(" ", self.currPos, False, True);
184                         self.currPos += 1
185                 self.update()
186
187         def delete(self):
188                 if self.type == self.TEXT:
189                         self.timeout()
190                 if self.allmarked:
191                         self.deleteAllChars()
192                         self.allmarked = False
193                 else:
194                         self.deleteChar(self.currPos);
195                         if self.maxSize and self.overwrite:
196                                 self.currPos += 1
197                 self.update()
198
199         def deleteBackward(self):
200                 if self.type == self.TEXT:
201                         self.timeout()
202                 if self.allmarked:
203                         self.deleteAllChars()
204                         self.allmarked = False
205                 else:
206                         if self.currPos > 0:
207                                 self.deleteChar(self.currPos-1);
208                                 if not self.maxSize and self.offset > 0:
209                                         self.offset -= 1
210                                 self.currPos -= 1
211                 self.update()
212
213         def toggleOverwrite(self):
214                 if self.type == self.TEXT:
215                         self.timeout()
216                 self.overwrite = not self.overwrite
217                 self.update()
218
219         def handleAscii(self, code):
220                 if self.type == self.TEXT:
221                         self.timeout()
222                 if self.allmarked:
223                         self.deleteAllChars()
224                         self.allmarked = False
225                 self.insertChar(unichr(code), self.currPos, False, False);
226                 self.right()
227
228         def number(self, number):
229                 if self.type == self.TEXT:
230                         owr = self.lastKey == number
231                         newChar = self.getKey(number)
232                 elif self.type == self.PIN or self.type == self.NUMBER:
233                         owr = False
234                         newChar = str(number)
235                 if self.allmarked:
236                         self.deleteAllChars()
237                         self.allmarked = False
238                 self.insertChar(newChar, self.currPos, owr, False);
239                 if self.type == self.PIN or self.type == self.NUMBER:
240                         self.right()
241                 self.update()