--- /dev/null
+from Components.Converter.Converter import Converter
+from time import localtime
+
+class ClockToText(Converter, object):
+ DEFAULT = 0
+ WITH_SECONDS = 1
+ IN_MINUTES = 2
+
+ # add: date, date as string, weekday, ...
+ # (whatever you need!)
+
+ def __init__(self, type, *args, **kwargs):
+ Converter.__init__(self)
+ if type == "WithSeconds":
+ self.type = self.WITH_SECONDS
+ elif type == "InMinutes":
+ self.type = self.IN_MINUTES
+ else:
+ self.type = self.DEFAULT
+
+ def getText(self):
+ time = self.source.time
+ if time is None:
+ return ""
+
+ # handle durations
+ if self.type == self.IN_MINUTES:
+ return "%d min" % (time / 60)
+
+ t = localtime(time)
+
+ if self.type == self.WITH_SECONDS:
+ return "%2d:%02d:%02d" % (t.tm_hour, t.tm_min, t.tm_sec)
+ elif self.type == self.DEFAULT:
+ return "%02d:%02d" % (t.tm_hour, t.tm_min)
+ else:
+ return "???"
+
+ text = property(getText)
--- /dev/null
+from Tools.Event import Event
+
+class Converter:
+ def __init__(self):
+ self.changed = Event(start = self.start, stop = self.stop)
+
+ def connect(self, source):
+ source.changed.listen(self.changed)
+ self.source = source
+
+ def disconnect(self):
+ self.source.changed.unlisten(self.changed)
+
+ def start(self):
+ pass
+
+ def stop(self):
+ pass
--- /dev/null
+from Components.Converter.Converter import Converter
+
+class EventName(Converter, object):
+ NAME = 0
+ SHORT_DESCRIPTION = 1
+ EXTENDED_DESCRIPTION = 2
+
+ def __init__(self, type, *args, **kwargs):
+ Converter.__init__(self)
+ if type == "Description":
+ self.type = self.SHORT_DESCRIPTION
+ elif type == "ExtendedDescription":
+ self.type = self.EXTENDED_DESCRIPTION
+ else:
+ self.type = self.NAME
+
+ def getText(self):
+ event = self.source.event
+ if event is None:
+ return ""
+
+ if self.type == self.NAME:
+ return event.getEventName()
+ elif self.type == self.SHORT_DESCRIPTION:
+ return event.getShortDescription()
+ elif self.type == self.EXTENDED_DESCRIPTION:
+ return event.getExtendedDescription()
+
+ text = property(getText)
--- /dev/null
+from Converter import Converter
+from Poll import Poll
+from time import time
+
+class EventTime(Poll, Converter, object):
+ STARTTIME = 0
+ ENDTIME = 1
+ REMAINING = 2
+ PROGRESS = 3
+ DURATION = 4
+
+ def __init__(self, type, *args, **kwargs):
+ Converter.__init__(self)
+ Poll.__init__(self)
+ if type == "EndTime":
+ self.type = self.ENDTIME
+ elif type == "Remaining":
+ self.type = self.REMAINING
+ self.poll_interval = 60*1000
+ self.poll_enabled = True
+ elif type == "StartTime":
+ self.type = self.STARTTIME
+ elif type == "Duration":
+ self.type = self.DURATION
+ elif type == "Progress":
+ self.type = self.PROGRESS
+ self.poll_interval = 30*1000
+ self.poll_enabled = True
+ else:
+ raise str("'%s' is not <StartTime|EndTime|Remaining|Duration> for EventTime converter" % type)
+
+ def getTime(self):
+ assert self.type != self.PROGRESS
+
+ event = self.source.event
+ if event is None:
+ return None
+
+ if self.type == self.STARTTIME:
+ return event.getBeginTime()
+ elif self.type == self.ENDTIME:
+ return event.getBeginTime() + event.getDuration()
+ elif self.type == self.DURATION:
+ return event.getDuration()
+ elif self.type == self.REMAINING:
+ now = int(time())
+ start_time = event.getBeginTime()
+ duration = event.getDuration()
+ end_time = start_time + duration
+ if start_time <= now <= end_time:
+ return (duration, end_time - now)
+ else:
+ return (duration, None)
+
+ def getValue(self):
+ assert self.type == self.PROGRESS
+
+ event = self.source.event
+ if event is None:
+ return None
+
+ now = int(time())
+ start_time = event.getBeginTime()
+ duration = event.getDuration()
+ if start_time <= now <= (start_time + duration) and duration > 0:
+ return (now - start_time) * 1000 / duration
+ else:
+ return None
+
+ time = property(getTime)
+ value = property(getValue)
+ range = 1000
--- /dev/null
+installdir = $(LIBDIR)/enigma2/python/Components/Converter
+
+install_PYTHON = \
+ __init__.py ClockToText.py Converter.py EventName.py StaticText.py EventTime.py \
+ Poll.py RemainingToText.py
--- /dev/null
+from enigma import eTimer
+
+class Poll(object):
+ def __init__(self):
+ self.__poll_timer = eTimer()
+ self.__poll_timer.timeout.get().append(self.changed)
+ self.__interval = 1000
+ self.__enabled = False
+
+ def __setInterval(self, interval):
+ self.__interval = interval
+ if self.__enabled:
+ self.__poll_timer.start(self.__interval)
+ else:
+ self.__poll_timer.stop()
+
+ def __setEnable(self, enabled):
+ self.__enabled = enabled
+ self.poll_interval = self.__interval
+
+ poll_interval = property(lambda self: self.__interval, __setInterval)
+ poll_enabled = property(lambda self: self.__enabled, __setEnable)
--- /dev/null
+from Components.Converter.Converter import Converter
+
+class RemainingToText(Converter, object):
+ def __init__(self, type, *args, **kwargs):
+ Converter.__init__(self)
+
+ def getText(self):
+
+ r = self.source.time
+ if r is None:
+ return ""
+
+ (duration, remaining) = self.source.time
+ if remaining is not None:
+ return "+%d min" % (remaining / 60)
+ else:
+ return "%d min" % (duration / 60)
+
+ text = property(getText)
--- /dev/null
+from Components.Converter.Converter import Converter
+
+class StaticText(Converter, object):
+ def __init__(self, text, *args, **kwargs):
+ Converter.__init__(self)
+ self.text = str(text)
+
--- /dev/null
+from Components.VariableText import VariableText
+from Components.GUIComponent import GUIComponent
+
+from enigma import eLabel
+
+class Label(VariableText, GUIComponent):
+ def __init__(self):
+ GUIComponent.__init__(self)
+ VariableText.__init__(self)
+
+ GUI_WIDGET = eLabel
+
+ def connect(self, source):
+ source.changed.listen(self.changed)
+ self.source = source
+ self.changed()
+
+ def changed(self):
+ self.text = self.source.text
--- /dev/null
+installdir = $(LIBDIR)/enigma2/python/Components/Renderer
+
+install_PYTHON = \
+ __init__.py Label.py Progress.py
--- /dev/null
+from Components.VariableValue import VariableValue
+from Components.GUIComponent import GUIComponent
+
+from enigma import eSlider
+
+class Progress(VariableValue, GUIComponent):
+ def __init__(self):
+ GUIComponent.__init__(self)
+ VariableValue.__init__(self)
+ self.__start = 0
+ self.__end = 100
+
+ GUI_WIDGET = eSlider
+
+ def connect(self, source):
+ source.changed.listen(self.changed)
+ self.source = source
+ self.changed()
+
+ def changed(self):
+ range = self.source.range or 100
+ value = self.source.value
+ if value is None:
+ value = 0
+ (self.range, self.value) = ((0, range), value)
+
+ GUI_WIDGET = eSlider
+
+ def postWidgetCreate(self, instance):
+ instance.setRange(self.__start, self.__end)
+
+ def setRange(self, range):
+ (__start, __end) = range
+ if self.instance is not None:
+ self.instance.setRange(__start, __end)
+
+ def getRange(self):
+ return (self.__start, self.__end)
+
+ range = property(getRange, setRange)
--- /dev/null
+from Tools.Event import Event
+from enigma import eTimer
+import time
+
+from Source import Source
+
+class Clock(Source):
+ def __init__(self):
+ self.changed = Event(start=self.start, stop=self.stop)
+ self.clock_timer = eTimer()
+ self.clock_timer.timeout.get().append(self.changed)
+
+ def start(self):
+ self.clock_timer.start(1000)
+
+ def stop(self):
+ self.clock_timer.stop()
+
+ def getClock(self):
+ return time.time()
+
+ time = property(getClock)
--- /dev/null
+from Components.PerServiceDisplay import PerServiceBase
+from Tools.Event import Event
+from enigma import iPlayableService
+from Source import Source
+
+class EventInfo(PerServiceBase, Source):
+ NOW = 0
+ NEXT = 1
+
+ def __init__(self, navcore, now_or_next):
+ self.changed = Event()
+ PerServiceBase.__init__(self, navcore,
+ {
+ iPlayableService.evUpdatedEventInfo: self.ourEvent,
+ iPlayableService.evEnd: self.stopEvent
+ })
+
+ self.event = None
+ self.now_or_next = now_or_next
+
+ def ourEvent(self):
+ service = self.navcore.getCurrentService()
+ info = service and service.info()
+ self.event = info and info.getEvent(self.now_or_next)
+ self.changed()
+
+ def stopEvent(self):
+ self.event = None
+ self.changed()
--- /dev/null
+installdir = $(LIBDIR)/enigma2/python/Components/Sources
+
+install_PYTHON = \
+ __init__.py Clock.py EventInfo.py Source.py
--- /dev/null
+class Source(object):
+
+ def execBegin(self):
+ pass
+
+ def execEnd(self):
+ pass
+
+ def onShow(self):
+ pass
+
+ def onHide(self):
+ pass
+
+ def destroy(self):
+ self.__dict__.clear()