bug #219
[vuplus_dvbapp] / lib / python / Components / config.py
index e3a29b5..789ec32 100755 (executable)
@@ -281,13 +281,13 @@ class ConfigSelection(ConfigElement):
 
                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
@@ -385,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
@@ -913,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))
@@ -1016,6 +1017,42 @@ 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(self.text)
+
+       def setValue(self, val):
+               self.text = 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)
@@ -1029,6 +1066,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")
@@ -1187,7 +1231,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):
@@ -1352,7 +1396,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):
@@ -1486,7 +1530,7 @@ class ConfigSubDict(dict, object):
                self.stored_values = dict(values)
                for (key, val) in self.items():
                        if str(key) in self.stored_values:
-                               val = self.stored_values[str(key)]
+                               val.saved_value = self.stored_values[str(key)]
 
        saved_value = property(getSavedValue, setSavedValue)
 
@@ -1614,8 +1658,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):