don't translate "", add FIXME
[enigma2.git] / lib / python / Components / config.py
index 1ce67f8e73000a5551fa18acf6dffed608bd77db..51ac7606f0de6da5c667f349e65da9b7a153adf9 100644 (file)
@@ -27,13 +27,16 @@ class configFile:
                x = line.find("=")
                if x > -1:
                        self.configElements[line[:x]] = line[x + 1:-1]
-       
+
        def getKey(self, key):
                return self.configElements[key]
 
-       def setKey(self, key, value):
+       def setKey(self, key, value, isDefaultKey=False):
                self.changed = 1
-               self.configElements[key] = value
+               if isDefaultKey and self.configElements.has_key(key):
+                       del self.configElements[key]
+               else:
+                       self.configElements[key] = value
 
        def save(self):
                if self.changed == 0:           #no changes, so no write to disk needed
@@ -48,7 +51,18 @@ class configFile:
 
                        fileHandle.write(wstr)
 
-               fileHandle.close()              
+               fileHandle.close()
+               
+def currentConfigSelectionElement(element):
+       return element.vals[element.value][0]
+
+def getConfigSelectionElement(element, value):
+       count = 0
+       for x in element.vals:
+               if x[0] == value:
+                       return count
+               count += 1
+       return -1
 
 class configSelection:
        def __init__(self, parent):
@@ -78,8 +92,20 @@ class configSelection:
 
        def __call__(self, selected):                   #needed by configlist
                self.checkValues()
-               return ("text", _(self.parent.vals[self.parent.value]))
 
+               returnValue = _(self.parent.vals[self.parent.value])
+               if not isinstance(returnValue, str):
+                       returnValue = returnValue[0]
+
+               # FIXME: it's not really nice to translate this here.
+               # however, configSelections are persistent.
+               
+               # WORKAROUND: don't translate ""
+               if returnValue:
+                       returnValue = _(returnValue)
+               
+               return ("text", returnValue)
+               
 class configDateTime:
        def __init__(self, parent):
                self.parent = parent
@@ -148,7 +174,7 @@ class configSequenceArg:
        def get(self, type, args = ()):
                # configsequencearg.get ("IP")
                if (type == "IP"):
-                       return (("."), [(1,255),(0,255),(0,255),(0,255)], "")
+                       return (("."), [(0,255),(0,255),(0,255),(0,255)], "")
                # configsequencearg.get ("MAC")
                if (type == "MAC"):
                        return ((":"), [(1,255),(1,255),(1,255),(1,255),(1,255),(1,255)], "")
@@ -165,6 +191,9 @@ class configSequenceArg:
                # configsequencearg.get("FLOAT", [(min,max),(min1,max1)]) => x.y with min <= x <= max and min1 <= y <= max1
                if (type == "FLOAT"):
                        return (("."), args, "")
+               
+       def getFloat(self, element):
+               return float(("%d.%0" + str(len(str(element.vals[1][1][1]))) + "d") % (element.value[0], element.value[1]))
 
 configsequencearg = configSequenceArg()
                
@@ -238,15 +267,10 @@ class configSequence:
                        olddec = oldvalue % 10 ** (numberLen - posinblock) - (oldvalue % 10 ** (numberLen - posinblock - 1))
                        newvalue = oldvalue - olddec + (10 ** (numberLen - posinblock - 1) * number)
                        
-                       print "You actually pressed a number (" + str(number) + ") which will be added at block number " + str(blocknumber) + " on position " + str(posinblock)
-                       print "Old value: " + str(oldvalue) + " olddec: " + str(olddec) + " newvalue: " + str(newvalue)
                        self.parent.value[blocknumber] = newvalue
                        self.markedPos += 1
                
-               self.checkValues()                      
-               
-               print "markPos:",
-               print self.markedPos
+               self.checkValues()
 
                #FIXME: dont call when press left/right
                self.parent.change()    
@@ -254,7 +278,6 @@ class configSequence:
        def __call__(self, selected):                   #needed by configlist
                value = ""
                mPos = self.markedPos
-               print "Positon: " + str(mPos)
                num = 0;
                for i in self.parent.value:
                        if len(value):  #fixme no heading separator possible
@@ -266,9 +289,8 @@ class configSequence:
                        #if diff > 0:
                                ## if this helps?!
                                #value += " " * diff
-                       print (("%0" + str(len(str(self.valueBounds[num][1]))) + "d") % int(i))
                        if (self.censorChar == ""):
-                               value += ("%0" + str(len(str(self.valueBounds[num][1]))) + "d") % int(i)
+                               value += ("%0" + str(len(str(self.valueBounds[num][1]))) + "d") % i
                        else:
                                value += (self.censorChar * len(str(self.valueBounds[num][1])))
                        num += 1
@@ -278,7 +300,27 @@ class configSequence:
                        return ("mtext"[1-selected:], value, [mPos])
                else:
                        return ("text", value)
+
+class configNothing:
+       def __init__(self, parent):
+               self.parent = parent
+               self.markedPos = 0
+
+       def cancel(self):
+               self.parent.reload()
+
+       def save(self):
+               self.parent.save()
                
+       def nextEntry(self):
+               self.parent.vals[1](self.parent.getConfigPath())
+
+       def handleKey(self, key):
+               pass
+
+       def __call__(self, selected):                   #needed by configlist
+               return ("text", "")
+
 class configText:
        # used as first parameter
        # is the text of a fixed size or is the user able to extend the length of the text
@@ -304,7 +346,6 @@ class configText:
                self.parent.save()
                
        def nextEntry(self):
-               print self.parent
                self.parent.vals[1](self.parent.getConfigPath())
 
        def handleKey(self, key):
@@ -364,7 +405,7 @@ config = Config();
 
 configfile = configFile()
 
-class ConfigSlider:
+class configSlider:
        def __init__(self, parent):
                self.parent = parent
 
@@ -378,21 +419,21 @@ class ConfigSlider:
                if self.parent.value < 0:
                        self.parent.value = 0   
 
-               if self.parent.value > 10:
-                       self.parent.value = 10  
+               if self.parent.value > self.parent.vals[1]:
+                       self.parent.value = self.parent.vals[1]
 
        def handleKey(self, key):
                if key == config.key["prevElement"]:
-                       self.parent.value = self.parent.value - 1
+                       self.parent.value = self.parent.value - self.parent.vals[0]
                if key == config.key["nextElement"]:
-                       self.parent.value = self.parent.value + 1
+                       self.parent.value = self.parent.value + self.parent.vals[0]
                                        
                self.checkValues()      
                self.parent.change()    
 
        def __call__(self, selected):                   #needed by configlist
                self.checkValues()
-               return ("slider", self.parent.value * 10)
+               return ("slider", self.parent.value, self.parent.vals[1])
 
 class ConfigSubsection:
        def __init__(self):
@@ -414,10 +455,20 @@ class configElement:
                return 0        #prevent bigger then array
 
        def datafromFile(self, control, data):
-               if control == ConfigSlider:
+               if control == configSlider:
                        return int(data)
                elif control == configSelection:
-                       return int(data)
+                       try:
+                               return int(data)
+                       except:
+                               for x in data.split(":"):
+                                       if x[0] == "*":
+                                               count = 0
+                                               for y in self.vals:
+                                                       if y[0] == x[1:-1]:
+                                                               return count
+                                                       count += 1
+                               return self.defaultValue
                elif control == configDateTime:
                        return int(data)
                elif control == configText:
@@ -434,27 +485,42 @@ class configElement:
                        return ""       
 
        def datatoFile(self, control, data):
-               if control == ConfigSlider:
+               if control == configSlider:
                        return str(data)
                elif control == configSelection:
+                       if len(self.vals) < data + 1:
+                               return "0"
+                       if isinstance(self.vals[data], str):
+                               return str(data)
+                       else:
+                               confList = []
+                               count = 0
+                               for x in self.vals:
+                                       if count == data:
+                                               confList.append("*" + str(x[0] + "*"))
+                                       else:
+                                               confList.append(x[0])
+                                       count += 1
+                               return ":".join(confList)
                        return str(data)
                elif control == configDateTime:
                        return str(data)
                elif control == configText:
                        return str(data.strip())
-
                elif control == configSequence:
-                       print data
+#                      print self.vals
+#                      print self.value
                        try:
-                               value = ((len(data) * ("%d" + self.vals[0]))[0:-1]) % tuple(data)
+                               value = ""
+                               count = 0
+                               for i in data:
+                                       if value !="":
+                                               value += self.vals[0]
+                                       value += (("%0" + str(len(str(self.vals[1][count][1]))) + "d") % i)
+                                       count += 1
+                                       #value = ((len(data) * ("%d" + self.vals[0]))[0:-1]) % tuple(data)
                        except: 
                                value = str(data)       
-#                      just in case you don't understand the above, here an equivalent:
-#                      value = ""
-#                      for i in data:
-#                              if value !="":
-#                                      value += self.vals[0]
-#                              value += str(i)
                        return value
                elif control == configSatlist:
                        return str(self.vals[self.value][1]);
@@ -470,27 +536,29 @@ class configElement:
 
                if value == "":
                        #print "value not found - using default"
-
                        if self.controlType == configSatlist:
                                self.value = self.getIndexbyEntry(self.defaultValue)
-                       else:   
+                       elif self.controlType == configSequence:
+                               self.value = self.defaultValue[:]
+                       else:
                                self.value = self.defaultValue
 
                        self.save()             #add missing value to dict
                else:
                        #print "set val:" + str(value)
                        self.value = value
-                       
+
                #is this right? activate settings after load/cancel and use default     
                self.change()
 
-       def __init__(self, configPath, control, defaultValue, vals):
+       def __init__(self, configPath, control, defaultValue, vals, saveDefaults = True):
                self.configPath = configPath
                self.defaultValue = defaultValue
                self.controlType = control
                self.vals = vals
                self.notifierList = [ ]
                self.enabled = True
+               self.saveDefaults = saveDefaults
                self.loadData()         
                
        def getConfigPath(self):
@@ -499,13 +567,28 @@ class configElement:
        def addNotifier(self, notifier):
                self.notifierList.append(notifier);
                notifier(self);
+
        def change(self):
                for notifier in self.notifierList:
                        notifier(self)
+
        def reload(self):
                self.loadData()
+
        def save(self):
-               configfile.setKey(self.configPath, self.datatoFile(self.controlType,self.value))
+               if self.controlType == configSatlist:
+                       defaultValue = self.getIndexbyEntry(self.defaultValue)
+               else:
+                       defaultValue = self.defaultValue
+               if self.value != defaultValue or self.saveDefaults:
+                       configfile.setKey(self.configPath, self.datatoFile(self.controlType, self.value))
+               else:
+                       try:
+                               oldValue = configfile.getKey(self.configPath)
+                       except:
+                               oldValue = None
+                       if oldValue is not None and oldValue != defaultValue:
+                               configfile.setKey(self.configPath, self.datatoFile(self.controlType, self.value), True)
 
 class configElement_nonSave(configElement):
        def __init__(self, configPath, control, defaultValue, vals):
@@ -513,13 +596,12 @@ class configElement_nonSave(configElement):
 
        def save(self):
                pass
-               
+
 def getConfigListEntry(description, element):
        b = element
        item = b.controlType(b)
        return ((description, item))
 
-
 def configElementBoolean(name, default, texts=(_("Enable"), _("Disable"))):
        return configElement(name, configSelection, default, texts)