fix channelselection in timeredit dialog
[enigma2.git] / lib / python / Components / config.py
index 07186157768d97b9450cac0c67ee01a956b2e80f..e9c8b1c15207ababdff7f09105ebc6046ce61657 100644 (file)
@@ -26,6 +26,7 @@ import copy
 #
 class ConfigElement(object):
        def __init__(self):
+
                object.__init__(self)
                self.saved_value = None
                self.save_disabled = False
@@ -70,19 +71,20 @@ class ConfigElement(object):
                for x in self.notifiers:
                        x(self)
                        
-       def addNotifier(self, notifier):
+       def addNotifier(self, notifier, initial_call = True):
                assert callable(notifier), "notifiers must be callable"
                self.notifiers.append(notifier)
-               
+
                # CHECKME:
                # do we want to call the notifier
-               #  - at all when adding it? (yes)
+               #  - at all when adding it? (yes, though optional)
                #  - when the default is active? (yes)
                #  - when no value *yet* has been set,
                #    because no config has ever been read (currently yes)
                #    (though that's not so easy to detect.
                #     the entry could just be new.)
-               notifier(self)
+               if initial_call:
+                       notifier(self)
 
        def disableSave(self):
                self.save_disabled = True
@@ -158,11 +160,18 @@ class ConfigSelection(ConfigElement):
                self.changed()
 
        def tostring(self, val):
-               return (val, ','.join(self.choices))
+               return val
 
        def getValue(self):
                return self._value
 
+       def setCurrentText(self, text):
+               i = self.choices.index(self.value)
+               del self.description[self.choices[i]]
+               self.choices[i] = text
+               self.description[text] = text
+               self._value = text
+
        value = property(getValue, setValue)
        
        def getIndex(self):
@@ -381,7 +390,7 @@ class ConfigSequence(ConfigElement):
                        if self.censor_char == "":
                                value += ("%0" + str(len(str(self.limits[num][1]))) + "d") % i
                        else:
-                               value += (self.censorChar * len(str(self.limits[num][1])))
+                               value += (self.censor_char * len(str(self.limits[num][1])))
                        num += 1
 
                        # only mark cursor when we are selected
@@ -414,7 +423,9 @@ class ConfigPosition(ConfigSequence):
 
 class ConfigClock(ConfigSequence):
        def __init__(self, default):
-               ConfigSequence.__init__(self, seperator = ":", limits = [(0,23),(0,59)], default = default)
+               import time
+               t = time.localtime(default)
+               ConfigSequence.__init__(self, seperator = ":", limits = [(0,23),(0,59)], default = [t.tm_hour, t.tm_min])
 
 class ConfigInteger(ConfigSequence):
        def __init__(self, default, limits):
@@ -436,9 +447,16 @@ class ConfigInteger(ConfigSequence):
        def tostring(self, value):
                return str(value)
 
-class ConfigPIN(ConfigSequence):
+class ConfigPIN(ConfigInteger):
        def __init__(self, default, len = 4, censor = ""):
-               ConfigSequence.__init__(self, seperator = ":", limits = [(0, (10**len)-1)], censor_char = censor, default = [default])
+               assert isinstance(default, int), "ConfigPIN default must be an integer"
+               if default == -1:
+                       default = "aaaa"
+               ConfigSequence.__init__(self, seperator = ":", limits = [(0, (10**len)-1)], censor_char = censor, default = default)
+               self.len = len
+
+       def getLength(self):
+               return self.len
 
 class ConfigFloat(ConfigSequence):
        def __init__(self, default, limits):
@@ -483,7 +501,7 @@ class ConfigText(ConfigElement, NumericalTextInput):
                                        self.text = self.text.ljust(len(self.text) + 1)
                elif key in KEY_NUMBERS:
                        number = self.getKey(getKeyNumber(key))
-                       self.text = self.text[0:self.marked_pos] + str(number) + self.text[self.marked_pos + 1:]
+                       self.text = self.text[0:self.marked_pos] + unicode(number) + self.text[self.marked_pos + 1:]
                elif key == KEY_TIMEOUT:
                        self.timeout()
                        return
@@ -571,7 +589,7 @@ class ConfigSatlist(ConfigSelection):
        orbital_position = property(getOrbitalPosition)
 
 # nothing.
-class ConfigDummy(ConfigSelection):
+class ConfigNothing(ConfigSelection):
        def __init__(self):
                ConfigSelection.__init__(self, choices = [""])
 
@@ -697,6 +715,7 @@ class ConfigSubsection(object):
        def __setattr__(self, name, value):
                if name == "saved_value":
                        return self.setSavedValue(value)
+               assert isinstance(value, ConfigSubsection) or isinstance(value, ConfigElement) or isinstance(value, ConfigSubList) or isinstance(value, ConfigSubDict), "ConfigSubsections can only store ConfigSubsections, ConfigSubLists, ConfigSubDicts or ConfigElements"
                self.content.items[name] = value
                if name in self.content.stored_values:
                        #print "ok, now we have a new item,", name, "and have the following value for it:", self.content.stored_values[name]
@@ -711,6 +730,9 @@ class ConfigSubsection(object):
                for (key, val) in self.content.items.items():
                        if val.saved_value is not None:
                                res[key] = val.saved_value
+                       elif key in res:
+                               del res[key]
+                               
                return res
 
        def setSavedValue(self, values):