X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/04f4636324ab06c5a3a4f618100048e159eaf6f9..b3135c06dd527e0ed65b6ffa921f830132f7d8b9:/lib/python/Components/config.py?ds=sidebyside
diff --git a/lib/python/Components/config.py b/lib/python/Components/config.py
old mode 100644
new mode 100755
index 529b6020..1efb8a56
--- a/lib/python/Components/config.py
+++ b/lib/python/Components/config.py
@@ -31,9 +31,12 @@ class ConfigElement(object):
object.__init__(self)
self.saved_value = None
+ self.last_value = None
self.save_disabled = False
self.notifiers = []
+ self.notifiers_final = []
self.enabled = True
+ self.callNotifiersOnSaveAndCancel = False
# you need to override this to do input validation
def setValue(self, value):
@@ -51,10 +54,11 @@ class ConfigElement(object):
# you can overide this for fancy default handling
def load(self):
- if self.saved_value is None:
+ sv = self.saved_value
+ if sv is None:
self.value = self.default
else:
- self.value = self.fromstring(self.saved_value)
+ self.value = self.fromstring(sv)
def tostring(self, value):
return str(value)
@@ -65,23 +69,34 @@ class ConfigElement(object):
self.saved_value = None
else:
self.saved_value = self.tostring(self.value)
+ if self.callNotifiersOnSaveAndCancel:
+ self.changed()
def cancel(self):
self.load()
+ if self.callNotifiersOnSaveAndCancel:
+ self.changed()
def isChanged(self):
- if self.saved_value is None and self.value == self.default:
+ sv = self.saved_value
+ if sv is None and self.value == self.default:
return False
- return self.tostring(self.value) != self.saved_value
+ return self.tostring(self.value) != sv
def changed(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"
- 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)
@@ -103,7 +118,9 @@ class ConfigElement(object):
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
@@ -136,6 +153,7 @@ class ConfigSelection(ConfigElement):
ConfigElement.__init__(self)
self._value = None
self.setChoices(choices, default)
+ self.last_value = self._value
def setChoices(self, choices, default = None):
self.choices = []
@@ -213,6 +231,11 @@ class ConfigSelection(ConfigElement):
self.value = self.choices[0]
elif key == KEY_END:
self.value = self.choices[nchoices - 1]
+
+ def selectNext(self):
+ nchoices = len(self.choices)
+ i = self.choices.index(self.value)
+ self.value = self.choices[(i + 1) % nchoices]
def getText(self):
descr = self.description[self.value]
@@ -250,7 +273,8 @@ class ConfigBoolean(ConfigElement):
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
@@ -297,6 +321,11 @@ class ConfigBoolean(ConfigElement):
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")})
@@ -314,7 +343,7 @@ class ConfigDateTime(ConfigElement):
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:
@@ -355,6 +384,7 @@ class ConfigSequence(ConfigElement):
self.default = default
self.value = copy.copy(default)
+ self.last_value = copy.copy(default)
self.endNotifier = []
@@ -495,10 +525,90 @@ class ConfigSequence(ConfigElement):
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):
+ def __init__(self, default, auto_jump = False):
ConfigSequence.__init__(self, seperator = ".", limits = [(0,255),(0,255),(0,255),(0,255)], default = default)
+ self.block_len = []
+ for x in self.limits:
+ self.block_len.append(len(str(x[1])))
+ self.marked_block = 0
+ self.overwrite = True
+ self.auto_jump = auto_jump
+
+ def handleKey(self, key):
+
+ if key == KEY_LEFT:
+ if self.marked_block > 0:
+ self.marked_block -= 1
+ self.overwrite = True
+
+ if key == KEY_RIGHT:
+ if self.marked_block < len(self.limits)-1:
+ self.marked_block += 1
+ self.overwrite = True
+
+ if key == KEY_HOME:
+ self.marked_block = 0
+ self.overwrite = True
+
+ if key == KEY_END:
+ self.marked_block = len(self.limits)-1
+ self.overwrite = True
+
+ if key in KEY_NUMBERS or key == KEY_ASCII:
+ if key == KEY_ASCII:
+ code = getPrevAsciiCode()
+ if code < 48 or code > 57:
+ return
+ number = code - 48
+ else:
+ number = getKeyNumber(key)
+ oldvalue = self._value[self.marked_block]
+
+ if self.overwrite:
+ self._value[self.marked_block] = number
+ self.overwrite = False
+ else:
+ oldvalue *= 10
+ newvalue = oldvalue + number
+ if self.auto_jump and newvalue > self.limits[self.marked_block][1] and self.marked_block < len(self.limits)-1:
+ self.handleKey(KEY_RIGHT)
+ self.handleKey(key)
+ return
+ else:
+ self._value[self.marked_block] = newvalue
+
+ if len(str(self._value[self.marked_block])) >= self.block_len[self.marked_block]:
+ self.handleKey(KEY_RIGHT)
+
+ self.validate()
+ self.changed()
+
+ def genText(self):
+ value = ""
+ block_strlen = []
+ for i in self._value:
+ block_strlen.append(len(str(i)))
+ if len(value):
+ value += self.seperator
+ value += str(i)
+ leftPos = sum(block_strlen[:(self.marked_block)])+self.marked_block
+ rightPos = sum(block_strlen[:(self.marked_block+1)])+self.marked_block
+ mBlock = range(leftPos, rightPos)
+ return (value, mBlock)
+ def getMulti(self, selected):
+ (value, mBlock) = self.genText()
+ if self.enabled:
+ return ("mtext"[1-selected:], value, mBlock)
+ else:
+ return ("text", value)
+
def getHTML(self, id):
# we definitely don't want leading zeros
return '.'.join(["%d" % d for d in self.value])
@@ -517,6 +627,34 @@ class ConfigClock(ConfigSequence):
t = time.localtime(default)
ConfigSequence.__init__(self, seperator = ":", limits = [(0,23),(0,59)], default = [t.tm_hour, t.tm_min])
+ def increment(self):
+ # Check if Minutes maxed out
+ if self._value[1] == 59:
+ # Check if Hours not maxed out
+ if self._value[0] < 23:
+ # Increment Hour, reset Minutes to 0
+ self._value[0] += 1
+ self._value[1] = 0
+ else:
+ # Increment Minutes
+ self._value[1] += 1
+ # Trigger change
+ self.changed()
+
+ def decrement(self):
+ # Check if Minutes is minimum
+ if self._value[1] == 0:
+ # Check if Hour is greater than 0
+ if self._value[0] > 0:
+ # Decrement Hour, set Minutes to 59
+ self._value[0] -= 1
+ self._value[1] = 59
+ else:
+ # Decrement Minutes
+ self._value[1] -= 1
+ # Trigger change
+ self.changed()
+
class ConfigInteger(ConfigSequence):
def __init__(self, default, limits = (0, 9999999999)):
ConfigSequence.__init__(self, seperator = ":", limits = [limits], default = default)
@@ -570,7 +708,7 @@ class ConfigText(ConfigElement, NumericalTextInput):
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:
@@ -695,12 +833,12 @@ class ConfigText(ConfigElement, NumericalTextInput):
def getValue(self):
return self.text.encode("utf-8")
-
+
def setValue(self, val):
try:
self.text = val.decode("utf-8")
except UnicodeDecodeError:
- self.text = val
+ self.text = val.decode("utf-8", "ignore")
print "Broken UTF8!"
value = property(getValue, setValue)
@@ -736,6 +874,9 @@ class ConfigText(ConfigElement, NumericalTextInput):
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 '
\n'
@@ -743,6 +884,26 @@ class ConfigText(ConfigElement, NumericalTextInput):
def unsafeAssign(self, value):
self.value = str(value)
+class ConfigPassword(ConfigText):
+ def __init__(self, default = "", fixed_size = False, visible_width = False, censor = "*"):
+ ConfigText.__init__(self, default = default, fixed_size = fixed_size, visible_width = visible_width)
+ self.censor_char = censor
+ self.hidden = True
+
+ def getMulti(self, selected):
+ mtext, text, mark = ConfigText.getMulti(self, selected)
+ if self.hidden:
+ text = len(text) * self.censor_char
+ return (mtext, text, mark)
+
+ def onSelect(self, session):
+ ConfigText.onSelect(self, session)
+ self.hidden = False
+
+ def onDeselect(self, session):
+ ConfigText.onDeselect(self, session)
+ self.hidden = True
+
class ConfigNumber(ConfigText):
def __init__(self, default = 0):
ConfigText.__init__(self, str(default), fixed_size = False)
@@ -790,12 +951,40 @@ class ConfigNumber(ConfigText):
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):
+ ConfigText.__init__(self, default = default, fixed_size = fixed_size, visible_width = visible_width)
+ NumericalTextInput.__init__(self, nextFunc = self.nextFunc, handleTimeout = False, search = True)
+
+class ConfigDirectory(ConfigText):
+ def __init__(self, default="", visible_width=60):
+ ConfigText.__init__(self, default, fixed_size = True, visible_width = visible_width)
+ def handleKey(self, key):
+ pass
+ def getValue(self):
+ if self.text == "":
+ return None
+ else:
+ return ConfigText.getValue(self)
+ def setValue(self, val):
+ if val == None:
+ val = ""
+ ConfigText.setValue(self, val)
+ def getMulti(self, selected):
+ if self.text == "":
+ return ("mtext"[1-selected:], _("List of Storage Devices"), range(0))
+ else:
+ return ConfigText.getMulti(self, selected)
# a slider.
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
@@ -818,9 +1007,7 @@ class ConfigSlider(ConfigElement):
self.value = self.max
else:
return
-
self.checkValues()
- self.changed()
def getText(self):
return "%d / %d" % (self.value, self.max)
@@ -869,7 +1056,7 @@ class ConfigSet(ConfigElement):
default = []
self.pos = -1
default.sort()
- self.default = default
+ self.last_value = self.default = default
self.value = default+[]
def toggleChoice(self, choice):
@@ -878,6 +1065,7 @@ class ConfigSet(ConfigElement):
else:
self.value.append(choice)
self.value.sort()
+ self.changed()
def handleKey(self, key):
if key in KEY_NUMBERS + [KEY_DELETE, KEY_BACKSPACE]:
@@ -924,7 +1112,9 @@ class ConfigSet(ConfigElement):
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)
@@ -935,11 +1125,13 @@ class ConfigSet(ConfigElement):
class ConfigLocations(ConfigElement):
def __init__(self, default = [], visible_width = False):
ConfigElement.__init__(self)
+ self.visible_width = visible_width
self.pos = -1
self.default = default
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]]
@@ -964,10 +1156,11 @@ class ConfigLocations(ConfigElement):
return eval(val)
def load(self):
- if self.saved_value is None:
+ sv = self.saved_value
+ if sv is None:
tmp = self.default
else:
- tmp = self.fromstring(self.saved_value)
+ tmp = self.fromstring(sv)
self.locations = [[x, None, False, False] for x in tmp]
self.refreshMountpoints()
for x in self.locations:
@@ -982,9 +1175,10 @@ class ConfigLocations(ConfigElement):
self.saved_value = self.tostring([x[0] for x in self.locations])
def isChanged(self):
- if self.saved_value is None and self.locations == []:
+ sv = self.saved_value
+ if val is None and self.locations == []:
return False
- return self.tostring([x[0] for x in self.locations]) != self.saved_value
+ return self.tostring([x[0] for x in self.locations]) != sv
def mountpointsChanged(self, action, dev):
print "Mounts changed: ", action, dev
@@ -1136,7 +1330,7 @@ class ConfigSubList(list, object):
self[int(key)].saved_value = val
saved_value = property(getSavedValue, setSavedValue)
-
+
def append(self, item):
i = str(len(self))
list.append(self, item)
@@ -1171,8 +1365,9 @@ class ConfigSubDict(dict, object):
def getSavedValue(self):
res = {}
for (key, val) in self.items():
- if val.saved_value is not None:
- res[str(key)] = val.saved_value
+ sv = val.saved_value
+ if sv is not None:
+ res[str(key)] = sv
return res
def setSavedValue(self, values):
@@ -1226,11 +1421,11 @@ class ConfigSubsection(object):
def getSavedValue(self):
res = self.content.stored_values
for (key, val) in self.content.items.items():
- if val.saved_value is not None:
- res[key] = val.saved_value
+ sv = val.saved_value
+ if sv is not None:
+ res[key] = sv
elif key in res:
del res[key]
-
return res
def setSavedValue(self, values):
@@ -1363,6 +1558,10 @@ def getConfigListEntry(*args):
assert len(args) > 1, "getConfigListEntry needs a minimum of two arguments (descr, configElement)"
return args
+def updateConfigElement(element, newelement):
+ newelement.value = element.value
+ return newelement
+
#def _(x):
# return x
#