Merge branch 'bug_747_cancel_waiting_tasks' into experimental
[vuplus_dvbapp] / lib / python / Components / config.py
index 450c302..5507cae 100755 (executable)
@@ -29,6 +29,7 @@ from time import localtime, strftime
 class ConfigElement(object):
        def __init__(self):
                self.saved_value = None
+               self.save_forced = False
                self.last_value = None
                self.save_disabled = False
                self.__notifiers = None
@@ -83,7 +84,7 @@ class ConfigElement(object):
 
        # you need to override this if str(self.value) doesn't work
        def save(self):
-               if self.save_disabled or self.value == self.default:
+               if self.save_disabled or (self.value == self.default and not self.save_forced):
                        self.saved_value = None
                else:
                        self.saved_value = self.tostring(self.value)
@@ -1017,6 +1018,40 @@ class ConfigPassword(ConfigText):
                ConfigText.onDeselect(self, session)
                self.hidden = True
 
+# lets the user select between [min, min+stepwidth, min+(stepwidth*2)..., maxval] with maxval <= max depending
+# on the stepwidth
+# min, max, stepwidth, default are int values
+# wraparound: pressing RIGHT key at max value brings you to min value and vice versa if set to True
+class ConfigSelectionNumber(ConfigSelection):
+       def __init__(self, min, max, stepwidth, default = None, wraparound = False):
+               self.wraparound = wraparound
+               if default is None:
+                       default = min
+               default = str(default)
+               choices = []
+               step = min
+               while step <= max:
+                       choices.append(str(step))
+                       step += stepwidth
+               
+               ConfigSelection.__init__(self, choices, default)
+
+       def getValue(self):
+               return int(ConfigSelection.getValue(self))
+
+       def setValue(self, val):
+               ConfigSelection.setValue(self, str(val))
+
+       def handleKey(self, key):
+               if not self.wraparound:
+                       if key == KEY_RIGHT:
+                               if len(self.choices) == (self.choices.index(self.value) + 1):
+                                       return
+                       if key == KEY_LEFT:
+                               if self.choices.index(self.value) == 0:
+                                       return
+               ConfigSelection.handleKey(self, key)
+
 class ConfigNumber(ConfigText):
        def __init__(self, default = 0):
                ConfigText.__init__(self, str(default), fixed_size = False)
@@ -1104,6 +1139,9 @@ class ConfigDirectory(ConfigText):
                else:
                        return ConfigText.getMulti(self, selected)
 
+       def onSelect(self, session):
+               self.allmarked = (self.value != "")
+
 # a slider.
 class ConfigSlider(ConfigElement):
        def __init__(self, default = 0, increment = 1, limits = (0, 100)):
@@ -1586,16 +1624,17 @@ class Config(ConfigSubsection):
                self.pickle_this("config", self.saved_value, result)
                return ''.join(result)
 
-       def unpickle(self, lines):
+       def unpickle(self, lines, base_file=True):
                tree = { }
                for l in lines:
                        if not l or l[0] == '#':
                                continue
 
                        n = l.find('=')
+                       name = l[:n]
                        val = l[n+1:].strip()
 
-                       names = l[:n].split('.')
+                       names = name.split('.')
 #                      if val.find(' ') != -1:
 #                              val = val[:val.find(' ')]
 
@@ -1606,6 +1645,15 @@ class Config(ConfigSubsection):
 
                        base[names[-1]] = val
 
+                       if not base_file: # not the initial config file..
+                               #update config.x.y.value when exist
+                               try:
+                                       configEntry = eval(name)
+                                       if configEntry is not None:
+                                               configEntry.value = val
+                               except (SyntaxError, KeyError):
+                                       pass
+
                # we inherit from ConfigSubsection, so ...
                #object.__setattr__(self, "saved_value", tree["config"])
                if "config" in tree:
@@ -1613,13 +1661,16 @@ class Config(ConfigSubsection):
 
        def saveToFile(self, filename):
                text = self.pickle()
-               f = open(filename, "w")
-               f.write(text)
-               f.close()
+               try:
+                       f = open(filename, "w")
+                       f.write(text)
+                       f.close()
+               except IOError:
+                       print "Config: Couldn't write %s" % filename
 
-       def loadFromFile(self, filename):
+       def loadFromFile(self, filename, base_file=False):
                f = open(filename, "r")
-               self.unpickle(f.readlines())
+               self.unpickle(f.readlines(), base_file)
                f.close()
 
 config = Config()
@@ -1630,7 +1681,7 @@ class ConfigFile:
 
        def load(self):
                try:
-                       config.loadFromFile(self.CONFIG_FILE)
+                       config.loadFromFile(self.CONFIG_FILE, True)
                except IOError, e:
                        print "unable to load config (%s), assuming defaults..." % str(e)