from Converter import Converter
from time import localtime, strftime
+from Components.Element import cached
class ClockToText(Converter, object):
DEFAULT = 0
else:
self.type = self.DEFAULT
+ @cached
def getText(self):
time = self.source.time
if time is None:
from Converter import Converter
class ConditionalShowHide(Converter, object):
-
def __init__(self, type):
Converter.__init__(self, type)
self.invert = type == "Invert"
from Components.Converter.Converter import Converter
+from Components.Element import cached
class EventName(Converter, object):
NAME = 0
else:
self.type = self.NAME
+ @cached
def getText(self):
- if self.cache is None:
- self.cache = self.__getText()
- return self.cache
-
- def __getText(self):
event = self.source.event
if event is None:
return "N/A"
from Converter import Converter
from Poll import Poll
from time import time
+from Components.Element import cached
class EventTime(Poll, Converter, object):
STARTTIME = 0
else:
raise str("'%s' is not <StartTime|EndTime|Remaining|Duration> for EventTime converter" % type)
+ @cached
def getTime(self):
- if self.cache is None or self.cache[0] is None:
- self.cache = (self.__getTime(), self.cache and self.cache[1])
- return self.cache[0]
-
- def __getTime(self):
assert self.type != self.PROGRESS
event = self.source.event
else:
return (duration, None)
+ @cached
def getValue(self):
- if self.cache is None or self.cache[1] is None:
- self.cache = (self.cache and self.cache[0], self.__getValue())
- return self.cache[1]
-
- def __getValue(self):
assert self.type == self.PROGRESS
event = self.source.event
from Components.Converter.Converter import Converter
+from Components.Element import cached
class FrontendInfo(Converter, object):
BER = 0
else:
self.type = self.LOCK
+ @cached
def getText(self):
assert self.type != self.LOCK, "the text output of FrontendInfo cannot be used for lock info"
if self.type == self.BER: # as count
return "%d %%" % (percent * 100 / 65536)
+ @cached
def getBool(self):
assert self.type in [self.LOCK, self.BER], "the boolean output of FrontendInfo can only be used for lock or BER info"
if self.type == self.LOCK:
boolean = property(getBool)
+ @cached
def getValue(self):
assert self.type != self.LOCK, "the value/range output of FrontendInfo can not be used for lock info"
if self.type == self.AGC:
from Components.Converter.Converter import Converter
+from Components.Element import cached
class RemainingToText(Converter, object):
def __init__(self, type):
Converter.__init__(self, type)
+ @cached
def getText(self):
-
r = self.source.time
if r is None:
return ""
from Components.Converter.Converter import Converter
from enigma import iServiceInformation, iPlayableService
+from Components.Element import cached
class ServiceInfo(Converter, object):
HAS_TELETEXT = 0
self.SUBSERVICES_AVAILABLE: [iPlayableService.evUpdatedEventInfo]
}[self.type]
+ @cached
def getServiceInfoValue(self, info, what):
v = info.getInfo(what)
if v != -2:
return "N/A"
return info.getInfoString(what)
+ @cached
def getBoolean(self):
- if self.cache is None:
- self.cache = self.__getBoolean()
- return self.cache
-
- def __getBoolean(self):
service = self.source.service
info = service and service.info()
if not info:
from Components.Converter.Converter import Converter
from enigma import iServiceInformation, iPlayableService
+from Components.Element import cached
class ServiceName(Converter, object):
NAME = 0
else:
self.type = self.NAME
+ @cached
def getServiceInfoValue(self, info, what):
v = info.getInfo(what)
if v != -2:
return "N/A"
return info.getInfoString(what)
+ @cached
def getText(self):
service = self.source.service
info = service and service.info()
from Converter import Converter
from Poll import Poll
from enigma import iPlayableService
+from Components.Element import cached
class ServicePosition(Converter, Poll, object):
TYPE_LENGTH = 0,
s = self.source.service
return s and s.seek()
+ @cached
def getPosition(self):
seek = self.getSeek()
if seek is None:
return 0
return pos[1]
+ @cached
def getLength(self):
seek = self.getSeek()
if seek is None:
return 0
return length[1]
+ @cached
def getCutlist(self):
service = self.source.service
cue = service and service.cueSheet()
return cue and cue.getCutList()
+ @cached
def getText(self):
seek = self.getSeek()
if seek is None:
from Converter import Converter
from enigma import eListboxPythonStringContent
-
+from Components.Element import cached
class StringList(Converter):
"""Turns a simple python list into a list which can be used in a listbox."""
if x is not self.master:
x.index = index
+ @cached
def getCurrent(self):
if self.source is None:
return None
current = property(getCurrent)
# pass through: getIndex / setIndex to master
+ @cached
def getIndex(self):
if self.master is None:
return None
from Converter import Converter
+from Components.Element import cached
class ValueRange(Converter, object):
def __init__(self, arg):
Converter.__init__(self, arg)
(self.lower, self.upper) = [int(x) for x in arg.split(',')]
+ @cached
def getBoolean(self):
if self.lower < self.upper:
return self.lower < self.source.value < self.upper
# Render Converter Converter Source
# a bidirectional connection
+
+def cached(f):
+ name = f.__name__
+ def wrapper(self):
+ if self.cache is None:
+ return f(self)
+ if name not in self.cache:
+ self.cache[name] = (True, f(self))
+ return self.cache[name][1]
+ return wrapper
+
class Element(object):
CHANGED_DEFAULT = 0 # initial "pull" state
CHANGED_ALL = 1 # really everything changed
self.master = None
self.source = None
self.__suspended = True
- self.clearCache()
+ self.cache = None
def connectDownstream(self, downstream):
self.downstream_elements.append(downstream)
# default action: push downstream
def changed(self, *args, **kwargs):
- self.clearCache()
+ self.cache = { }
self.downstream_elements.changed(*args, **kwargs)
- self.clearCache()
+ self.cache = None
def reconnectUpstream(self, new_upstream):
assert self.source is not None
self.source = new_upstream
- def clearCache(self):
- self.cache = None
-
def setSuspend(self, suspended):
changed = self.__suspended != suspended
if not self.__suspended and suspended:
from Source import Source
+from Components.Element import cached
from enigma import eTimer
# a small warning:
self.poll_timer.timeout.get().append(self.poll)
self.poll_timer.start(poll)
+ @cached
def getBoolean(self):
if self.function is not None:
return self.function()
from Tools.Event import Event
+from Components.Element import cached
from enigma import eTimer
import time
self.clock_timer.timeout.get().append(self.poll)
self.clock_timer.start(1000)
+ @cached
def getClock(self):
return time.time()
else:
self.clock_timer.start(1000)
self.poll()
-
from Components.PerServiceDisplay import PerServiceBase
from enigma import iPlayableService
from Source import Source
+from Components.Element import cached
from time import time
def serviceEvent(self, event):
self.changed((self.CHANGED_SPECIFIC, event))
+ @cached
def getCurrentService(self):
- if self.cache is None:
- self.cache = self.navcore.getCurrentService()
- return self.cache
+ return self.navcore.getCurrentService()
service = property(getCurrentService)
from Components.PerServiceDisplay import PerServiceBase
+from Components.Element import cached
from Tools.Event import Event
from enigma import iPlayableService
from Source import Source
}, with_event=True)
self.now_or_next = now_or_next
-
+
+ @cached
def getEvent(self):
- if self.cache is None:
- service = self.navcore.getCurrentService()
- info = service and service.info()
- self.cache = (True, info and info.getEvent(self.now_or_next)) # we always store a tuple for negative caching
-
- return self.cache[1]
+ service = self.navcore.getCurrentService()
+ info = service and service.info()
+ return info and info.getEvent(self.now_or_next)
event = property(getEvent)
-from Source import Source
-from Tools.Event import Event
-
-class MenuList(Source, object):
- def __init__(self, list = [ ], enableWrapAround = False):
- Source.__init__(self)
- self.__list = list
- self.onSelectionChanged = [ ]
-
- def setList(self, list):
- self.__list = list
- self.changed((self.CHANGED_ALL,))
-
- list = property(lambda self: self.__list, setList)
-
- def entry_changed(self, index):
- self.downstream_elements.entry_changed(self, index)
-
- def selectionChanged(self, index):
- for x in self.onSelectionChanged:
- x()
-
- def getCurrent(self):
- return self.master and self.master.current
-
- current = property(getCurrent)
-
- def setIndex(self, index):
- if self.master is not None:
- self.master = index
-
- def getIndex(self, index):
- if self.master is not None:
- return self.master.index
- else:
- return -1
-
- setCurrentIndex = setIndex
-
- index = property(getIndex, setIndex)