Patch by Anders Holst:
authorFelix Domke <tmbinc@elitedvb.net>
Wed, 5 Nov 2008 23:17:52 +0000 (00:17 +0100)
committerFelix Domke <tmbinc@elitedvb.net>
Thu, 11 Dec 2008 13:02:03 +0000 (14:02 +0100)
* ConfigElement.addNotifier takes a new optional argument
  immediate_feedback (which is True by default). If True the notifier
  is called whenever an editing key is pressed in the element. When
  False, the notifier is only called when editing is finished, i.e
  the element is deselected or the dialog closed.
* ConfigSet is updated in accordance with Teros suggestion so that
  it behaves like the others and feedback can be given immediately.
* All ConfigElements are modified to check whether they have changed
  since last selected (by a new variable last_value).
* UsageConfig.py is updated to use immediate_feedback=False in the case
  of validating the speeds. (The only case so far where this setting
  is needed, but with the possibility more uses may follow.)

lib/python/Components/UsageConfig.py
lib/python/Components/config.py

index 6ed87840981a036fb30c25e12fc5bdef16d32478..2ea91aeb06c3cfbdaa991e5e5caa97949c6986ed 100644 (file)
@@ -89,8 +89,8 @@ def InitUsageConfig():
        config.seek.speeds_backward = ConfigSet(default=[8, 16, 32, 64, 128], choices=[1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128])
        config.seek.speeds_slowmotion = ConfigSet(default=[2, 4, 8], choices=[2, 4, 6, 8, 12, 16, 25])
 
        config.seek.speeds_backward = ConfigSet(default=[8, 16, 32, 64, 128], choices=[1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128])
        config.seek.speeds_slowmotion = ConfigSet(default=[2, 4, 8], choices=[2, 4, 6, 8, 12, 16, 25])
 
-       config.seek.enter_forward = ConfigSelection(default = "2", choices = ["2"])
-       config.seek.enter_backward = ConfigSelection(default = "2", choices = ["2"])
+       config.seek.enter_forward = ConfigSelection(default = "2", choices = ["2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"])
+       config.seek.enter_backward = ConfigSelection(default = "1", choices = ["1", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"])
        config.seek.stepwise_minspeed = ConfigSelection(default = "16", choices = ["Never", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"])
        config.seek.stepwise_repeat = ConfigSelection(default = "3", choices = ["2", "3", "4", "5", "6"])
 
        config.seek.stepwise_minspeed = ConfigSelection(default = "16", choices = ["Never", "2", "4", "6", "8", "12", "16", "24", "32", "48", "64", "96", "128"])
        config.seek.stepwise_repeat = ConfigSelection(default = "3", choices = ["2", "3", "4", "5", "6"])
 
@@ -104,14 +104,14 @@ def InitUsageConfig():
                        configElement.value = [2]
                updateChoices(config.seek.enter_forward, configElement.value)
 
                        configElement.value = [2]
                updateChoices(config.seek.enter_forward, configElement.value)
 
-       config.seek.speeds_forward.addNotifier(updateEnterForward)
+       config.seek.speeds_forward.addNotifier(updateEnterForward, immediate_feedback = False)
 
        def updateEnterBackward(configElement):
                if not configElement.value:
                        configElement.value = [2]
                updateChoices(config.seek.enter_backward, configElement.value)
 
 
        def updateEnterBackward(configElement):
                if not configElement.value:
                        configElement.value = [2]
                updateChoices(config.seek.enter_backward, configElement.value)
 
-       config.seek.speeds_backward.addNotifier(updateEnterBackward)
+       config.seek.speeds_backward.addNotifier(updateEnterBackward, immediate_feedback = False)
 
 def updateChoices(sel, choices):
        if choices:
 
 def updateChoices(sel, choices):
        if choices:
index cfa4318ced098412c9084b3121c61d5c8ef2428e..1efb8a56f42b827e6e7631dc60f6fb82de6bd2a7 100755 (executable)
@@ -31,8 +31,10 @@ class ConfigElement(object):
 
                object.__init__(self)
                self.saved_value = None
 
                object.__init__(self)
                self.saved_value = None
+               self.last_value = None
                self.save_disabled = False
                self.notifiers = []
                self.save_disabled = False
                self.notifiers = []
+               self.notifiers_final = []
                self.enabled = True
                self.callNotifiersOnSaveAndCancel = False
 
                self.enabled = True
                self.callNotifiersOnSaveAndCancel = False
 
@@ -85,10 +87,16 @@ class ConfigElement(object):
                for x in self.notifiers:
                        x(self)
                        
                for x in self.notifiers:
                        x(self)
                        
-       def addNotifier(self, notifier, initial_call = True):
+       def changedFinal(self):
+               for x in self.notifiers_final:
+                       x(self)
+                       
+       def addNotifier(self, notifier, initial_call = True, immediate_feedback = True):
                assert callable(notifier), "notifiers must be callable"
                assert callable(notifier), "notifiers must be callable"
-               self.notifiers.append(notifier)
-
+               if immediate_feedback:
+                       self.notifiers.append(notifier)
+               else:
+                       self.notifiers_final.append(notifier)
                # CHECKME:
                # do we want to call the notifier
                #  - at all when adding it? (yes, though optional)
                # CHECKME:
                # do we want to call the notifier
                #  - at all when adding it? (yes, though optional)
@@ -110,7 +118,9 @@ class ConfigElement(object):
                pass
 
        def onDeselect(self, session):
                pass
 
        def onDeselect(self, session):
-               pass
+               if not self.last_value == self.value:
+                       self.changedFinal()
+                       self.last_value = self.value
 
 KEY_LEFT = 0
 KEY_RIGHT = 1
 
 KEY_LEFT = 0
 KEY_RIGHT = 1
@@ -143,6 +153,7 @@ class ConfigSelection(ConfigElement):
                ConfigElement.__init__(self)
                self._value = None
                self.setChoices(choices, default)
                ConfigElement.__init__(self)
                self._value = None
                self.setChoices(choices, default)
+               self.last_value = self._value
 
        def setChoices(self, choices, default = None):
                self.choices = []
 
        def setChoices(self, choices, default = None):
                self.choices = []
@@ -262,7 +273,8 @@ class ConfigBoolean(ConfigElement):
        def __init__(self, default = False, descriptions = {False: "false", True: "true"}):
                ConfigElement.__init__(self)
                self.descriptions = descriptions
        def __init__(self, default = False, descriptions = {False: "false", True: "true"}):
                ConfigElement.__init__(self)
                self.descriptions = descriptions
-               self.value = self.default = default
+               self.value = self.last_value = self.default = default
+
        def handleKey(self, key):
                if key in [KEY_LEFT, KEY_RIGHT]:
                        self.value = not self.value
        def handleKey(self, key):
                if key in [KEY_LEFT, KEY_RIGHT]:
                        self.value = not self.value
@@ -309,6 +321,11 @@ class ConfigBoolean(ConfigElement):
                else:
                        self.value = False
 
                else:
                        self.value = False
 
+       def onDeselect(self, session):
+               if not self.last_value == self.value:
+                       self.changedFinal()
+                       self.last_value = self.value
+
 class ConfigYesNo(ConfigBoolean):
        def __init__(self, default = False):
                ConfigBoolean.__init__(self, default = default, descriptions = {False: _("no"), True: _("yes")})
 class ConfigYesNo(ConfigBoolean):
        def __init__(self, default = False):
                ConfigBoolean.__init__(self, default = default, descriptions = {False: _("no"), True: _("yes")})
@@ -326,7 +343,7 @@ class ConfigDateTime(ConfigElement):
                ConfigElement.__init__(self)
                self.increment = increment
                self.formatstring = formatstring
                ConfigElement.__init__(self)
                self.increment = increment
                self.formatstring = formatstring
-               self.value = self.default = int(default)
+               self.value = self.last_value = self.default = int(default)
 
        def handleKey(self, key):
                if key == KEY_LEFT:
 
        def handleKey(self, key):
                if key == KEY_LEFT:
@@ -367,6 +384,7 @@ class ConfigSequence(ConfigElement):
                
                self.default = default
                self.value = copy.copy(default)
                
                self.default = default
                self.value = copy.copy(default)
+               self.last_value = copy.copy(default)
                
                self.endNotifier = []
 
                
                self.endNotifier = []
 
@@ -507,6 +525,11 @@ class ConfigSequence(ConfigElement):
        def fromstring(self, value):
                return [int(x) for x in value.split(self.seperator)]
 
        def fromstring(self, value):
                return [int(x) for x in value.split(self.seperator)]
 
+       def onDeselect(self, session):
+               if not self.last_value == self._value:
+                       self.changedFinal()
+                       self.last_value = copy.copy(self._value)
+
 class ConfigIP(ConfigSequence):
        def __init__(self, default, auto_jump = False):
                ConfigSequence.__init__(self, seperator = ".", limits = [(0,255),(0,255),(0,255),(0,255)], default = default)
 class ConfigIP(ConfigSequence):
        def __init__(self, default, auto_jump = False):
                ConfigSequence.__init__(self, seperator = ".", limits = [(0,255),(0,255),(0,255),(0,255)], default = default)
@@ -685,7 +708,7 @@ class ConfigText(ConfigElement, NumericalTextInput):
                self.offset = 0
                self.overwrite = fixed_size
                self.help_window = None
                self.offset = 0
                self.overwrite = fixed_size
                self.help_window = None
-               self.value = self.default = default
+               self.value = self.last_value = self.default = default
 
        def validateMarker(self):
                if self.fixed_size:
 
        def validateMarker(self):
                if self.fixed_size:
@@ -851,6 +874,9 @@ class ConfigText(ConfigElement, NumericalTextInput):
                if self.help_window:
                        session.deleteDialog(self.help_window)
                        self.help_window = None
                if self.help_window:
                        session.deleteDialog(self.help_window)
                        self.help_window = None
+               if not self.last_value == self.value:
+                       self.changedFinal()
+                       self.last_value = self.value
 
        def getHTML(self, id):
                return '<input type="text" name="' + id + '" value="' + self.value + '" /><br>\n'
 
        def getHTML(self, id):
                return '<input type="text" name="' + id + '" value="' + self.value + '" /><br>\n'
@@ -925,6 +951,9 @@ class ConfigNumber(ConfigText):
        def onDeselect(self, session):
                self.marked_pos = 0
                self.offset = 0
        def onDeselect(self, session):
                self.marked_pos = 0
                self.offset = 0
+               if not self.last_value == self.value:
+                       self.changedFinal()
+                       self.last_value = self.value
 
 class ConfigSearchText(ConfigText):
        def __init__(self, default = "", fixed_size = False, visible_width = False):
 
 class ConfigSearchText(ConfigText):
        def __init__(self, default = "", fixed_size = False, visible_width = False):
@@ -955,7 +984,7 @@ class ConfigDirectory(ConfigText):
 class ConfigSlider(ConfigElement):
        def __init__(self, default = 0, increment = 1, limits = (0, 100)):
                ConfigElement.__init__(self)
 class ConfigSlider(ConfigElement):
        def __init__(self, default = 0, increment = 1, limits = (0, 100)):
                ConfigElement.__init__(self)
-               self.value = self.default = default
+               self.value = self.last_value = self.default = default
                self.min = limits[0]
                self.max = limits[1]
                self.increment = increment
                self.min = limits[0]
                self.max = limits[1]
                self.increment = increment
@@ -1027,7 +1056,7 @@ class ConfigSet(ConfigElement):
                        default = []
                self.pos = -1
                default.sort()
                        default = []
                self.pos = -1
                default.sort()
-               self.default = default
+               self.last_value = self.default = default
                self.value = default+[]
 
        def toggleChoice(self, choice):
                self.value = default+[]
 
        def toggleChoice(self, choice):
@@ -1036,6 +1065,7 @@ class ConfigSet(ConfigElement):
                else:
                        self.value.append(choice)
                        self.value.sort()
                else:
                        self.value.append(choice)
                        self.value.sort()
+               self.changed()
 
        def handleKey(self, key):
                if key in KEY_NUMBERS + [KEY_DELETE, KEY_BACKSPACE]:
 
        def handleKey(self, key):
                if key in KEY_NUMBERS + [KEY_DELETE, KEY_BACKSPACE]:
@@ -1082,7 +1112,9 @@ class ConfigSet(ConfigElement):
 
        def onDeselect(self, session):
                self.pos = -1
 
        def onDeselect(self, session):
                self.pos = -1
-               self.changed()
+               if not self.last_value == self.value:
+                       self.changedFinal()
+                       self.last_value = self.value+[]
                
        def tostring(self, value):
                return str(value)
                
        def tostring(self, value):
                return str(value)
@@ -1099,6 +1131,7 @@ class ConfigLocations(ConfigElement):
                self.locations = []
                self.mountpoints = []
                harddiskmanager.on_partition_list_change.append(self.mountpointsChanged)
                self.locations = []
                self.mountpoints = []
                harddiskmanager.on_partition_list_change.append(self.mountpointsChanged)
+               self.value = default+[]
 
        def setValue(self, value):
                loc = [x[0] for x in self.locations if x[3]]
 
        def setValue(self, value):
                loc = [x[0] for x in self.locations if x[3]]