aboutsummaryrefslogtreecommitdiff
path: root/lib/python/Components
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python/Components')
-rw-r--r--lib/python/Components/ConfigList.py42
-rw-r--r--lib/python/Components/Input.py175
-rw-r--r--lib/python/Components/config.py175
3 files changed, 331 insertions, 61 deletions
diff --git a/lib/python/Components/ConfigList.py b/lib/python/Components/ConfigList.py
index 47b577e2..a54d27b1 100644
--- a/lib/python/Components/ConfigList.py
+++ b/lib/python/Components/ConfigList.py
@@ -1,8 +1,8 @@
from HTMLComponent import HTMLComponent
from GUIComponent import GUIComponent
-from config import KEY_LEFT, KEY_RIGHT, KEY_0, KEY_DELETE, KEY_OK, KEY_TIMEOUT, ConfigElement
+from config import KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS, ConfigElement
from Components.ActionMap import NumberActionMap
-from enigma import eListbox, eListboxPythonConfigContent, eTimer
+from enigma import eListbox, eListboxPythonConfigContent, eRCInput, eTimer
from Screens.MessageBox import MessageBox
class ConfigList(HTMLComponent, GUIComponent, object):
@@ -18,9 +18,13 @@ class ConfigList(HTMLComponent, GUIComponent, object):
self.setHelpWindowSession(session)
def execBegin(self):
+ rcinput = eRCInput.getInstance()
+ rcinput.setKeyboardMode(rcinput.kmAscii)
self.timer.timeout.get().append(self.timeout)
def execEnd(self):
+ rcinput = eRCInput.getInstance()
+ rcinput.setKeyboardMode(rcinput.kmNone)
self.timer.timeout.get().remove(self.timeout)
def setHelpWindowSession(self, session):
@@ -39,7 +43,7 @@ class ConfigList(HTMLComponent, GUIComponent, object):
self.invalidateCurrent()
if self.help_window:
self.help_window.update(selection[1])
- if key not in [KEY_TIMEOUT, KEY_LEFT, KEY_RIGHT, KEY_DELETE, KEY_OK]:
+ if key in KEY_NUMBERS:
self.timer.start(1000, 1)
def getCurrent(self):
@@ -111,12 +115,20 @@ class ConfigList(HTMLComponent, GUIComponent, object):
class ConfigListScreen:
def __init__(self, list, session = None, on_change = None):
- self["config_actions"] = NumberActionMap(["SetupActions", "TextInputActions"],
+ self["config_actions"] = NumberActionMap(["SetupActions", "InputAsciiActions", "KeyboardInputActions"],
{
+ "gotAsciiCode": self.keyGotAscii,
"ok": self.keyOK,
+ "accept": self.keyOK,
"left": self.keyLeft,
"right": self.keyRight,
- "delete": self.keyDelete,
+ "moveLeft": self.keyLeft,
+ "moveRight": self.keyRight,
+ "moveHome": self.keyHome,
+ "moveEnd": self.keyEnd,
+ "deleteForward": self.keyDelete,
+ "deleteBackward": self.keyBackspace,
+ "toggleOverwrite": self.keyToggleOW,
"1": self.keyNumberGlobal,
"2": self.keyNumberGlobal,
"3": self.keyNumberGlobal,
@@ -146,10 +158,30 @@ class ConfigListScreen:
self["config"].handleKey(KEY_RIGHT)
self.__changed()
+ def keyHome(self):
+ self["config"].handleKey(KEY_HOME)
+ self.__changed()
+
+ def keyEnd(self):
+ self["config"].handleKey(KEY_END)
+ self.__changed()
+
def keyDelete(self):
self["config"].handleKey(KEY_DELETE)
self.__changed()
+ def keyBackspace(self):
+ self["config"].handleKey(KEY_BACKSPACE)
+ self.__changed()
+
+ def keyToggleOW(self):
+ self["config"].handleKey(KEY_TOGGLEOW)
+ self.__changed()
+
+ def keyGotAscii(self):
+ self["config"].handleKey(KEY_ASCII)
+ self.__changed()
+
def keyNumberGlobal(self, number):
self["config"].handleKey(KEY_0 + number)
self.__changed()
diff --git a/lib/python/Components/Input.py b/lib/python/Components/Input.py
index e0a7f449..64ffdf4f 100644
--- a/lib/python/Components/Input.py
+++ b/lib/python/Components/Input.py
@@ -11,25 +11,51 @@ class Input(VariableText, HTMLComponent, GUIComponent, NumericalTextInput):
PIN = 1
NUMBER = 2
- def __init__(self, text="", maxSize = False, type = TEXT):
+ def __init__(self, text="", maxSize = False, visible_width = False, type = TEXT):
NumericalTextInput.__init__(self, self.right)
GUIComponent.__init__(self)
VariableText.__init__(self)
self.type = type
+ self.allmarked = (text != "") and (type != self.PIN)
self.maxSize = maxSize
self.currPos = 0
- self.overwrite = 0
+ 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)
- if self.type == self.PIN:
- self.text = "*" * len(self.Text)
+ 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.text = self.Text.encode("utf-8")
+ 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):
@@ -47,27 +73,46 @@ class Input(VariableText, HTMLComponent, GUIComponent, NumericalTextInput):
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 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()
+ 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
self.update()
def left(self):
- if self.currPos > 0:
+ 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()
+ self.update()
def up(self):
+ self.allmarked = False
+ if self.type == self.TEXT:
+ self.timeout()
if self.Text[self.currPos] == "9" or self.Text[self.currPos] == " ":
newNumber = "0"
else:
@@ -76,6 +121,9 @@ class Input(VariableText, HTMLComponent, GUIComponent, NumericalTextInput):
self.update()
def down(self):
+ self.allmarked = False
+ if self.type == self.TEXT:
+ self.timeout()
if self.Text[self.currPos] == "0" or self.Text[self.currPos] == " ":
newNumber = "9"
else:
@@ -84,51 +132,110 @@ class Input(VariableText, HTMLComponent, GUIComponent, NumericalTextInput):
self.update()
def home(self):
+ self.allmarked = False
+ if self.type == self.TEXT:
+ self.timeout()
self.currPos = 0
self.update()
def end(self):
- self.currPos = len(self.Text) - 1
+ 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.currPos == len(self.Text) - 1:
- self.Text=self.Text+ " "
- self.end()
+ if self.type == self.TEXT:
+ self.timeout()
+ if self.allmarked:
+ self.deleteAllChars()
+ self.allmarked = False
else:
- self.Text = self.Text[0:self.currPos] + " " + self.Text[self.currPos:]
+ self.insertChar(" ", self.currPos, False, True);
+ self.currPos += 1
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.currPos += 1
self.update()
- def toggleOverwrite(self):
- if self.overwrite==1:
- self.overwrite=0
+ def deleteBackward(self):
+ if self.type == self.TEXT:
+ self.timeout()
+ if self.allmarked:
+ self.deleteAllChars()
+ self.allmarked = False
else:
- self.overwrite=1
+ 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 deleteBackward(self):
- self.Text = self.Text[:self.currPos - 1] + self.Text[self.currPos:]
- self.left()
+ def toggleOverwrite(self):
+ if self.type == self.TEXT:
+ self.timeout()
+ self.overwrite = not self.overwrite
self.update()
def handleAscii(self, code):
- newChar = unichr(code)
- if self.overwrite==1:
- self.Text = self.Text[0:self.currPos] + newChar + self.Text[self.currPos + 1:]
- else:
- self.Text = self.Text[0:self.currPos] + newChar + self.Text[self.currPos:]
+ if self.type == self.TEXT:
+ self.timeout()
+ if self.allmarked:
+ self.deleteAllChars()
+ self.allmarked = False
+ self.insertChar(unichr(code), self.currPos, False, False);
self.right()
def number(self, number):
if self.type == self.TEXT:
+ 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.update()
diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py
index de06871a..f8ef0ec8 100644
--- a/lib/python/Components/config.py
+++ b/lib/python/Components/config.py
@@ -1,4 +1,5 @@
import time
+from enigma import getPrevAsciiCode
from Tools.NumericalTextInput import NumericalTextInput
from Tools.Directories import resolveFilename, SCOPE_CONFIG
import copy
@@ -104,7 +105,12 @@ KEY_LEFT = 0
KEY_RIGHT = 1
KEY_OK = 2
KEY_DELETE = 3
-KEY_TIMEOUT = 4
+KEY_BACKSPACE = 4
+KEY_HOME = 5
+KEY_END = 6
+KEY_TOGGLEOW = 7
+KEY_ASCII = 8
+KEY_TIMEOUT = 9
KEY_NUMBERS = range(12, 12+10)
KEY_0 = 12
KEY_9 = 12+9
@@ -192,6 +198,10 @@ class ConfigSelection(ConfigElement):
self.value = self.choices[(i + nchoices - 1) % nchoices]
elif key == KEY_RIGHT:
self.value = self.choices[(i + 1) % nchoices]
+ elif key == KEY_HOME:
+ self.value = self.choices[0]
+ elif key == KEY_END:
+ self.value = self.choices[nchoices - 1]
def getText(self):
descr = self.description[self.value]
@@ -233,6 +243,10 @@ class ConfigBoolean(ConfigElement):
def handleKey(self, key):
if key in [KEY_LEFT, KEY_RIGHT]:
self.value = not self.value
+ elif key == KEY_HOME:
+ self.value = False
+ elif key == KEY_END:
+ self.value = True
def getText(self):
descr = self.descriptions[self.value]
@@ -294,8 +308,10 @@ class ConfigDateTime(ConfigElement):
def handleKey(self, key):
if key == KEY_LEFT:
self.value = self.value - self.increment
- if key == KEY_RIGHT:
+ elif key == KEY_RIGHT:
self.value = self.value + self.increment
+ elif key == KEY_HOME or key == KEY_END:
+ self.value = self.default
def getText(self):
return time.strftime(self.formatstring, time.localtime(self.value))
@@ -374,7 +390,28 @@ class ConfigSequence(ConfigElement):
self.marked_pos += 1
self.validatePos()
- if key in KEY_NUMBERS:
+ if key == KEY_HOME:
+ self.marked_pos = 0
+ self.validatePos()
+
+ if key == KEY_END:
+ max_pos = 0
+ num = 0
+ for i in self._value:
+ max_pos += len(str(self.limits[num][1]))
+ num += 1
+ self.marked_pos = max_pos - 1
+ self.validatePos()
+
+ if key in KEY_NUMBERS or key == KEY_ASCII:
+ if key == KEY_ASCII:
+ code = getPrevAsciiCode()
+ if code < 48 or code > 57:
+ return
+ number = code - 48
+ else:
+ number = getKeyNumber(key)
+
block_len = []
for x in self.limits:
block_len.append(len(str(x[1])))
@@ -392,8 +429,6 @@ class ConfigSequence(ConfigElement):
else:
blocknumber += 1
- number = getKeyNumber(key)
-
# length of numberblock
number_len = len(str(self.limits[blocknumber][1]))
@@ -513,37 +548,124 @@ class ConfigFloat(ConfigSequence):
# an editable text...
class ConfigText(ConfigElement, NumericalTextInput):
- def __init__(self, default = "", fixed_size = True):
+ def __init__(self, default = "", fixed_size = True, visible_width = False):
ConfigElement.__init__(self)
NumericalTextInput.__init__(self, nextFunc = self.nextFunc, handleTimeout = False)
self.marked_pos = 0
+ self.allmarked = (default != "")
self.fixed_size = fixed_size
+ self.visible_width = visible_width
+ self.offset = 0
+ self.overwrite = fixed_size
self.value = self.default = default
def validateMarker(self):
- if self.marked_pos >= len(self.text):
- self.marked_pos = len(self.text) - 1
+ if self.fixed_size:
+ if self.marked_pos > len(self.text)-1:
+ self.marked_pos = len(self.text)-1
+ else:
+ if self.marked_pos > len(self.text):
+ self.marked_pos = len(self.text)
if self.marked_pos < 0:
self.marked_pos = 0
+ if self.visible_width:
+ if self.marked_pos < self.offset:
+ self.offset = self.marked_pos
+ if self.marked_pos >= self.offset + self.visible_width:
+ if self.marked_pos == len(self.text):
+ self.offset = self.marked_pos - self.visible_width
+ else:
+ self.offset = self.marked_pos - 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)
+
+ def insertChar(self, ch, pos, owr):
+ if owr or self.overwrite:
+ self.text = self.text[0:pos] + ch + self.text[pos + 1:]
+ elif self.fixed_size:
+ self.text = self.text[0:pos] + ch + self.text[pos:-1]
+ else:
+ self.text = self.text[0:pos] + ch + self.text[pos:]
- #def nextEntry(self):
- # self.vals[1](self.getConfigPath())
+ def deleteChar(self, pos):
+ if not self.fixed_size:
+ 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.fixed_size:
+ self.text = " " * len(self.text)
+ else:
+ self.text = ""
+ self.marked_pos = 0
def handleKey(self, key):
# this will no change anything on the value itself
# so we can handle it here in gui element
if key == KEY_DELETE:
- self.text = self.text[0:self.marked_pos] + self.text[self.marked_pos + 1:]
+ self.timeout()
+ if self.allmarked:
+ self.deleteAllChars()
+ self.allmarked = False
+ else:
+ self.deleteChar(self.marked_pos)
+ if self.fixed_size and self.overwrite:
+ self.marked_pos += 1
+ elif key == KEY_BACKSPACE:
+ self.timeout()
+ if self.allmarked:
+ self.deleteAllChars()
+ self.allmarked = False
+ elif self.marked_pos > 0:
+ self.deleteChar(self.marked_pos-1)
+ if not self.fixed_size and self.offset > 0:
+ self.offset -= 1
+ self.marked_pos -= 1
elif key == KEY_LEFT:
- self.marked_pos -= 1
+ self.timeout()
+ if self.allmarked:
+ self.marked_pos = len(self.text)
+ self.allmarked = False
+ else:
+ self.marked_pos -= 1
elif key == KEY_RIGHT:
+ self.timeout()
+ if self.allmarked:
+ self.marked_pos = 0
+ self.allmarked = False
+ else:
+ self.marked_pos += 1
+ elif key == KEY_HOME:
+ self.timeout()
+ self.allmarked = False
+ self.marked_pos = 0
+ elif key == KEY_END:
+ self.timeout()
+ self.allmarked = False
+ self.marked_pos = len(self.text)
+ elif key == KEY_TOGGLEOW:
+ self.timeout()
+ self.overwrite = not self.overwrite
+ elif key == KEY_ASCII:
+ self.timeout()
+ newChar = unichr(getPrevAsciiCode())
+ if self.allmarked:
+ self.deleteAllChars()
+ self.allmarked = False
+ self.insertChar(newChar, self.marked_pos, False)
self.marked_pos += 1
- self.maybeExpand()
elif key in KEY_NUMBERS:
- number = self.getKey(getKeyNumber(key))
- self.text = self.text[0:self.marked_pos] + unicode(number) + self.text[self.marked_pos + 1:]
+ owr = self.lastKey == getKeyNumber(key)
+ newChar = self.getKey(getKeyNumber(key))
+ if self.allmarked:
+ self.deleteAllChars()
+ self.allmarked = False
+ self.insertChar(newChar, self.marked_pos, owr)
elif key == KEY_TIMEOUT:
self.timeout()
return
@@ -551,14 +673,8 @@ class ConfigText(ConfigElement, NumericalTextInput):
self.validateMarker()
self.changed()
- def maybeExpand(self):
- if not self.fixed_size:
- if self.marked_pos >= len(self.text):
- self.text = self.text.ljust(len(self.text) + 1)
-
def nextFunc(self):
self.marked_pos += 1
- self.maybeExpand()
self.validateMarker()
self.changed()
@@ -579,7 +695,18 @@ class ConfigText(ConfigElement, NumericalTextInput):
return self.value
def getMulti(self, selected):
- return ("mtext"[1-selected:], self.value, [self.marked_pos])
+ if self.visible_width:
+ if self.allmarked:
+ mark = range(0, min(self.visible_width, len(self.text)))
+ else:
+ mark = [self.marked_pos-self.offset]
+ return ("mtext"[1-selected:], self.text[self.offset:self.offset+self.visible_width].encode("utf-8")+" ", mark)
+ else:
+ if self.allmarked:
+ mark = range(0, len(self.text))
+ else:
+ mark = [self.marked_pos]
+ return ("mtext"[1-selected:], self.value+" ", mark)
def helpWindow(self):
from Screens.NumericalTextInputHelpDialog import NumericalTextInputHelpDialog
@@ -612,6 +739,10 @@ class ConfigSlider(ConfigElement):
self.value -= self.increment
elif key == KEY_RIGHT:
self.value += self.increment
+ elif key == KEY_HOME:
+ self.value = self.min
+ elif key == KEY_END:
+ self.value = self.max
else:
return