X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/13e74ce7d8fcccc12bed3ce65c4f35987f206799..67b8794397ca2ac4e05c59fc417456f4d4cac8f0:/lib/python/Components/Input.py diff --git a/lib/python/Components/Input.py b/lib/python/Components/Input.py index a3ab764e..4d3c8a1d 100644 --- a/lib/python/Components/Input.py +++ b/lib/python/Components/Input.py @@ -1,84 +1,245 @@ -from HTMLComponent import * -from GUIComponent import * -from VariableText import * +from HTMLComponent import HTMLComponent +from GUIComponent import GUIComponent +from VariableText import VariableText from enigma import eLabel from Tools.NumericalTextInput import NumericalTextInput -class Input(HTMLComponent, GUIComponent, VariableText): +class Input(VariableText, HTMLComponent, GUIComponent, NumericalTextInput): TEXT = 0 PIN = 1 - NUMBER = 2 - - def __init__(self, text="", maxSize = False, type = TEXT): + NUMBER = 2 + + def __init__(self, text="", maxSize = False, visible_width = False, type = TEXT): + NumericalTextInput.__init__(self, self.right) GUIComponent.__init__(self) VariableText.__init__(self) - self.numericalTextInput = NumericalTextInput(self.right) self.type = type + self.allmarked = (text != "") and (type != self.PIN) self.maxSize = maxSize self.currPos = 0 - self.text = text - self.update() + self.visible_width = visible_width + self.offset = 0 + self.overwrite = maxSize + self.setText(text) + + def __len__(self): + return len(self.text) def update(self): - self.setMarkedPos(self.currPos) - text = self.text - if self.type == self.PIN: - text = "*" * len(self.text) - self.setText(text) - #self.setText(self.text[0:self.currPos] + "_" + self.text[self.currPos] + "_" + self.text[self.currPos + 1:]) + if self.visible_width: + if self.currPos < self.offset: + self.offset = self.currPos + if self.currPos >= self.offset + self.visible_width: + if self.currPos == len(self.Text): + self.offset = self.currPos - self.visible_width + else: + self.offset = self.currPos - self.visible_width + 1 + if self.offset > 0 and self.offset + self.visible_width > len(self.Text): + self.offset = max(0, len(self.Text) - self.visible_width) + if self.allmarked: + self.setMarkedPos(-2) + else: + self.setMarkedPos(self.currPos-self.offset) + if self.visible_width: + if self.type == self.PIN: + self.text = "" + for x in self.Text[self.offset:self.offset+self.visible_width]: + self.text += (x==" " and " " or "*") + else: + self.text = self.Text[self.offset:self.offset+self.visible_width].encode("utf-8") + " " + else: + if self.type == self.PIN: + self.text = "" + for x in self.Text: + self.text += (x==" " and " " or "*") + else: + self.text = self.Text.encode("utf-8") + " " + + def setText(self, text): + if not len(text): + self.currPos = 0 + self.Text = u"" + else: + try: + self.Text = text.decode("utf-8") + except UnicodeDecodeError: + print "utf8 kaputt!" + self.Text = text + self.update() def getText(self): - return self.text - + return self.Text.encode("utf-8") + def createWidget(self, parent): - return eLabel(parent, self.currPos) - + if self.allmarked: + return eLabel(parent, -2) + else: + return eLabel(parent, self.currPos-self.offset) + def getSize(self): s = self.instance.calculateSize() return (s.width(), s.height()) + def innerright(self): + if self.allmarked: + self.currPos = 0 + self.allmarked = False + elif self.maxSize: + if self.currPos < len(self.Text)-1: + self.currPos += 1 + else: + if self.currPos < len(self.Text): + self.currPos += 1 + def right(self): - self.currPos += 1 - if self.currPos == len(self.text): - if self.maxSize: - self.currPos -= 1 - else: - self.text = self.text + " " - + if self.type == self.TEXT: + self.timeout() + self.innerright() self.update() - + def left(self): - self.currPos -= 1 + if self.type == self.TEXT: + self.timeout() + if self.allmarked: + if self.maxSize: + self.currPos = len(self.Text) - 1 + else: + self.currPos = len(self.Text) + self.allmarked = False + elif self.currPos > 0: + self.currPos -= 1 self.update() - + def up(self): - if self.text[self.currPos] == "9": + self.allmarked = False + if self.type == self.TEXT: + self.timeout() + if self.currPos == len(self.Text) or self.Text[self.currPos] == "9" or self.Text[self.currPos] == " ": newNumber = "0" else: - newNumber = str(int(self.text[self.currPos]) + 1) - self.text = self.text[0:self.currPos] + newNumber + self.text[self.currPos + 1:] + newNumber = str(int(self.Text[self.currPos]) + 1) + self.Text = self.Text[0:self.currPos] + newNumber + self.Text[self.currPos + 1:] self.update() - + def down(self): - if self.text[self.currPos] == "0": + self.allmarked = False + if self.type == self.TEXT: + self.timeout() + if self.currPos == len(self.Text) or self.Text[self.currPos] == "0" or self.Text[self.currPos] == " ": newNumber = "9" else: - newNumber = str(int(self.text[self.currPos]) - 1) - self.text = self.text[0:self.currPos] + newNumber + self.text[self.currPos + 1:] + newNumber = str(int(self.Text[self.currPos]) - 1) + self.Text = self.Text[0:self.currPos] + newNumber + self.Text[self.currPos + 1:] self.update() + def home(self): + self.allmarked = False + if self.type == self.TEXT: + self.timeout() + self.currPos = 0 + self.update() + + def end(self): + self.allmarked = False + if self.type == self.TEXT: + self.timeout() + if self.maxSize: + self.currPos = len(self.Text) - 1 + else: + self.currPos = len(self.Text) + self.update() + + def insertChar(self, ch, pos, owr, ins): + if ins and not self.maxSize: + self.Text = self.Text[0:pos] + ch + self.Text[pos:] + elif owr or self.overwrite: + self.Text = self.Text[0:pos] + ch + self.Text[pos + 1:] + elif self.maxSize: + self.Text = self.Text[0:pos] + ch + self.Text[pos:-1] + else: + self.Text = self.Text[0:pos] + ch + self.Text[pos:] + + def deleteChar(self, pos): + if not self.maxSize: + self.Text = self.Text[0:pos] + self.Text[pos + 1:] + elif self.overwrite: + self.Text = self.Text[0:pos] + " " + self.Text[pos + 1:] + else: + self.Text = self.Text[0:pos] + self.Text[pos + 1:] + " " + + def deleteAllChars(self): + if self.maxSize: + self.Text = " " * len(self.Text) + else: + self.Text = "" + self.currPos = 0 + + def tab(self): + if self.type == self.TEXT: + self.timeout() + if self.allmarked: + self.deleteAllChars() + self.allmarked = False + else: + self.insertChar(" ", self.currPos, False, True); + self.innerright() + self.update() + def delete(self): - self.text = self.text[:self.currPos] + self.text[self.currPos + 1:] + if self.type == self.TEXT: + self.timeout() + if self.allmarked: + self.deleteAllChars() + self.allmarked = False + else: + self.deleteChar(self.currPos); + if self.maxSize and self.overwrite: + self.innerright() self.update() - + + def deleteBackward(self): + if self.type == self.TEXT: + self.timeout() + if self.allmarked: + self.deleteAllChars() + self.allmarked = False + else: + if self.currPos > 0: + self.deleteChar(self.currPos-1); + if not self.maxSize and self.offset > 0: + self.offset -= 1 + self.currPos -= 1 + self.update() + + def toggleOverwrite(self): + if self.type == self.TEXT: + self.timeout() + self.overwrite = not self.overwrite + self.update() + + def handleAscii(self, code): + if self.type == self.TEXT: + self.timeout() + if self.allmarked: + self.deleteAllChars() + self.allmarked = False + self.insertChar(unichr(code), self.currPos, False, False); + self.innerright() + self.update() + def number(self, number): if self.type == self.TEXT: - newChar = self.numericalTextInput.getKey(number) + owr = self.lastKey == number + newChar = self.getKey(number) elif self.type == self.PIN or self.type == self.NUMBER: + owr = False newChar = str(number) - self.text = self.text[0:self.currPos] + newChar + self.text[self.currPos + 1:] + if self.allmarked: + self.deleteAllChars() + self.allmarked = False + self.insertChar(newChar, self.currPos, owr, False); if self.type == self.PIN or self.type == self.NUMBER: - self.right() + self.innerright() self.update()