config.py: also take care of useablechars for keyboard
[enigma2.git] / lib / python / Components / config.py
index 3b61909f81b44557704360e7b4370efe7f36ec60..32e86272a0c8643ed272d0606264ccf2b5ec8800 100755 (executable)
@@ -178,14 +178,14 @@ class choicesList(object): # XXX: we might want a better name for this
 
        def __list__(self):
                if self.type == choicesList.LIST_TYPE_LIST:
-                       ret = [isinstance(x, tuple) and x[0] or x for x in self.choices]
+                       ret = [not isinstance(x, tuple) and x or x[0] for x in self.choices]
                else:
                        ret = self.choices.keys()
                return ret or [""]
 
        def __iter__(self):
                if self.type == choicesList.LIST_TYPE_LIST:
-                       ret = [isinstance(x, tuple) and x[0] or x for x in self.choices]
+                       ret = [not isinstance(x, tuple) and x or x[0] for x in self.choices]
                else:
                        ret = self.choices
                return iter(ret or [""])
@@ -232,7 +232,7 @@ class choicesList(object): # XXX: we might want a better name for this
 class descriptionList(choicesList): # XXX: we might want a better name for this
        def __list__(self):
                if self.type == choicesList.LIST_TYPE_LIST:
-                       ret = [isinstance(x, tuple) and x[1] or x for x in self.choices]
+                       ret = [not isinstance(x, tuple) and x or x[1] for x in self.choices]
                else:
                        ret = self.choices.values()
                return ret or [""]
@@ -279,14 +279,15 @@ class ConfigSelection(ConfigElement):
                if default is None:
                        default = self.choices.default()
 
+               self._descr = None
                self.default = self._value = self.last_value = default
-               self.changed()
 
        def setChoices(self, choices, default = None):
                self.choices = choicesList(choices)
 
                if default is None:
                        default = self.choices.default()
+               self.default = default
 
                if self.value not in self.choices:
                        self.value = default
@@ -296,6 +297,7 @@ class ConfigSelection(ConfigElement):
                        self._value = value
                else:
                        self._value = self.default
+               self._descr = None
                self.changed()
 
        def tostring(self, val):
@@ -307,7 +309,7 @@ class ConfigSelection(ConfigElement):
        def setCurrentText(self, text):
                i = self.choices.index(self.value)
                self.choices[i] = text
-               self.description[text] = text
+               self._descr = self.description[text] = text
                self._value = text
 
        value = property(getValue, setValue)
@@ -336,13 +338,18 @@ class ConfigSelection(ConfigElement):
                self.value = self.choices[(i + 1) % nchoices]
 
        def getText(self):
-               descr = self.description[self.value]
+               if self._descr is not None:
+                       return self._descr
+               descr = self._descr = self.description[self.value]
                if descr:
                        return _(descr)
                return descr
 
        def getMulti(self, selected):
-               descr = self.description[self.value]
+               if self._descr is not None:
+                       descr = self._descr
+               else:
+                       descr = self._descr = self.description[self.value]
                if descr:
                        return ("text", _(descr))
                return ("text", descr)
@@ -378,7 +385,7 @@ class ConfigBoolean(ConfigElement):
                self.value = self.last_value = self.default = default
 
        def handleKey(self, key):
-               if key in [KEY_LEFT, KEY_RIGHT]:
+               if key in (KEY_LEFT, KEY_RIGHT):
                        self.value = not self.value
                elif key == KEY_HOME:
                        self.value = False
@@ -906,13 +913,14 @@ class ConfigText(ConfigElement, NumericalTextInput):
                        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.timeout()
+                       newChar = unichr(getPrevAsciiCode())
+                       if not self.useableChars or newChar in self.useableChars:
+                               if self.allmarked:
+                                       self.deleteAllChars()
+                                       self.allmarked = False
+                               self.insertChar(newChar, self.marked_pos, False)
+                               self.marked_pos += 1
                elif key in KEY_NUMBERS:
                        owr = self.lastKey == getKeyNumber(key)
                        newChar = self.getKey(getKeyNumber(key))
@@ -1022,6 +1030,13 @@ class ConfigNumber(ConfigText):
        value = property(getValue, setValue)
        _value = property(getValue, setValue)
 
+       def isChanged(self):
+               sv = self.saved_value
+               strv = self.tostring(self.value)
+               if sv is None and strv == self.default:
+                       return False
+               return strv != sv
+
        def conform(self):
                pos = len(self.text) - self.marked_pos
                self.text = self.text.lstrip("0")
@@ -1180,7 +1195,7 @@ class ConfigSet(ConfigElement):
                                self.pos = -1
                        else:
                                self.pos += 1
-               elif key in [KEY_HOME, KEY_END]:
+               elif key in (KEY_HOME, KEY_END):
                        self.pos = -1
 
        def genString(self, lst):
@@ -1345,7 +1360,7 @@ class ConfigLocations(ConfigElement):
                        self.pos += 1
                        if self.pos >= len(self.value):
                                self.pos = -1
-               elif key in [KEY_HOME, KEY_END]:
+               elif key in (KEY_HOME, KEY_END):
                        self.pos = -1
 
        def getText(self):
@@ -1385,7 +1400,7 @@ class ConfigLocations(ConfigElement):
 # nothing.
 class ConfigNothing(ConfigSelection):
        def __init__(self):
-               ConfigSelection.__init__(self, choices = [""])
+               ConfigSelection.__init__(self, choices = [("","")])
 
 # until here, 'saved_value' always had to be a *string*.
 # now, in ConfigSubsection, and only there, saved_value
@@ -1426,8 +1441,8 @@ class ConfigSubList(list, object):
 
        def getSavedValue(self):
                res = { }
-               for i in range(len(self)):
-                       sv = self[i].saved_value
+               for i, val in enumerate(self):
+                       sv = val.saved_value
                        if sv is not None:
                                res[str(i)] = sv
                return res
@@ -1448,7 +1463,7 @@ class ConfigSubList(list, object):
                        item.load()
 
        def dict(self):
-               return dict([(str(index), value) for index, value in self.enumerate()])
+               return dict([(str(index), value) for index, value in enumerate(self)])
 
 # same as ConfigSubList, just as a dictionary.
 # care must be taken that the 'key' has a proper
@@ -1607,8 +1622,9 @@ class Config(ConfigSubsection):
                        self.setSavedValue(tree["config"])
 
        def saveToFile(self, filename):
+               text = self.pickle()
                f = open(filename, "w")
-               f.write(self.pickle())
+               f.write(text)
                f.close()
 
        def loadFromFile(self, filename):