fix channelselection in timeredit dialog
[enigma2.git] / lib / python / Components / config.py
index b5a0bbbdba8049a1a93c7e9996827f95b6fb2b44..e9c8b1c15207ababdff7f09105ebc6046ce61657 100644 (file)
@@ -1,6 +1,7 @@
 import time
 from Tools.NumericalTextInput import NumericalTextInput
 from Tools.Directories import resolveFilename, SCOPE_CONFIG
+import copy
 
 
 # ConfigElement, the base class of all ConfigElements.
@@ -25,6 +26,7 @@ from Tools.Directories import resolveFilename, SCOPE_CONFIG
 #
 class ConfigElement(object):
        def __init__(self):
+
                object.__init__(self)
                self.saved_value = None
                self.save_disabled = False
@@ -69,10 +71,21 @@ 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, 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.)
+               if initial_call:
+                       notifier(self)
+
        def disableSave(self):
                self.save_disabled = True
 
@@ -124,7 +137,10 @@ class ConfigSelection(ConfigElement):
                else:
                        assert False, "ConfigSelection choices must be dict or list!"
                
-               assert len(self.choices), "you can't have an empty configselection"
+               #assert len(self.choices), "you can't have an empty configselection"
+               if len(self.choices) == 0:
+                       self.choices = [""]
+                       self.description[""] = ""
 
                if default is None:
                        default = self.choices[0]
@@ -144,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):
@@ -164,9 +187,6 @@ 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_TIMEOUT:
-                       self.timeout()
-                       return
 
        def getMulti(self, selected):
                return ("text", self.description[self.value])
@@ -280,7 +300,8 @@ class ConfigSequence(ConfigElement):
                self.limits = limits
                self.censor_char = censor_char
                
-               self.value = self.default = default
+               self.default = default
+               self.value = copy.copy(default)
 
        def validate(self):
                max_pos = 0
@@ -321,7 +342,6 @@ class ConfigSequence(ConfigElement):
                        self.validatePos()
                
                if key in KEY_NUMBERS:
-                       print "is number"
                        block_len = []
                        for x in self.limits:
                                block_len.append(len(str(x[1])))
@@ -357,8 +377,6 @@ class ConfigSequence(ConfigElement):
                        self.validate()
                        self.changed()
                        
-                       print "res:", self._value
-
        def getMulti(self, selected):
                value = ""
                mPos = self.marked_pos
@@ -372,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
@@ -405,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):
@@ -427,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):
@@ -474,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
@@ -504,8 +531,6 @@ class ConfigText(ConfigElement, NumericalTextInput):
                return ("mtext"[1-selected:], self.value, [self.marked_pos])
 
        def helpWindow(self):
-               print "helpWindow for text!"
-
                from Screens.NumericalTextInputHelpDialog import NumericalTextInputHelpDialog
                return (NumericalTextInputHelpDialog,self)
 
@@ -554,17 +579,17 @@ class ConfigSatlist(ConfigSelection):
        def __init__(self, list, default = None):
                if default is not None:
                        default = str(default)
-               if list == [ ]:
-                       list = [0, "N/A"]
                ConfigSelection.__init__(self, choices = [(str(orbpos), desc) for (orbpos, desc) in list], default = default)
 
        def getOrbitalPosition(self):
+               if self.value == "":
+                       return None
                return int(self.value)
        
        orbital_position = property(getOrbitalPosition)
 
 # nothing.
-class ConfigDummy(ConfigSelection):
+class ConfigNothing(ConfigSelection):
        def __init__(self):
                ConfigSelection.__init__(self, choices = [""])
 
@@ -624,8 +649,8 @@ class ConfigSubList(list, object):
        saved_value = property(getSavedValue, setSavedValue)
        
        def append(self, item):
-               list.append(self, item)
                i = str(len(self))
+               list.append(self, item)
                if i in self.stored_values:
                        item.saved_value = self.stored_values[i]
                        item.load()
@@ -690,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]
@@ -704,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):