X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/76e87479554f771723ea4005788f9318cd1654f4..94508f85d46155eb05868cada7b34bb2b4a667a5:/lib/python/Components/ServicePosition.py diff --git a/lib/python/Components/ServicePosition.py b/lib/python/Components/ServicePosition.py index e402751c..985f8841 100644 --- a/lib/python/Components/ServicePosition.py +++ b/lib/python/Components/ServicePosition.py @@ -1,23 +1,25 @@ -from PerServiceDisplay import * -from enigma import eTimer +from PerServiceDisplay import PerServiceDisplay, PerServiceBase +from Components.GUIComponent import GUIComponent +from enigma import eTimer, iPlayableService, ePositionGauge +import time - -from enigma import pNavigation, iSeekableServicePtr - -class ServicePosition(PerServiceDisplay): +class ServicePosition(PerServiceDisplay, object): TYPE_LENGTH = 0, TYPE_POSITION = 1, - TYPE_REMAINING = 2 + TYPE_REMAINING = 2, + TYPE_RELATIVE = 3 def __init__(self, navcore, type): + object.__init__(self) self.updateTimer = eTimer() - self.updateTimer.timeout.get().append(self.update) + self.updateTimer.callback.append(self.update) PerServiceDisplay.__init__(self, navcore, { - pNavigation.evNewService: self.newService, - pNavigation.evStopService: self.stopEvent + iPlayableService.evStart: self.newService, + iPlayableService.evEnd: self.stopEvent }) self.type = type + self.relative_base = 0 # self.setType(type) def newService(self): @@ -26,51 +28,139 @@ class ServicePosition(PerServiceDisplay): def setType(self, type): self.type = type - seek = iSeekableServicePtr() - service = self.navcore.getCurrentService() - - self.updateTimer.stop() - self.available = 0 - - if service != None: - seek = service.seek(seek) - if seek != None: - if self.type != self.TYPE_LENGTH: - self.updateTimer.start(500) - - self.length = self.get(self.TYPE_LENGTH) - self.available = 1 - + self.updateTimer.start(500) self.update() + def setRelative(self, rel): + self.relative_base = rel + def get(self, what): service = self.navcore.getCurrentService() - - if service != None: - seek = service.seek(seek) - if seek != None: - if what == self.TYPE_LENGTH: - r = seek.getLength() - elif what == self.TYPE_POSITION: - r = seek.getPlayPosition() - if not r[0]: - return r[1] / 90000 + seek = service and service.seek() + if seek != None: + if what == self.TYPE_LENGTH: + r = seek.getLength() + elif what == self.TYPE_POSITION: + r = seek.getPlayPosition() + if not r[0]: + return r[1] / 90000 return -1 def update(self): - if self.available: - if self.type == self.TYPE_LENGTH: - l = self.length - elif self.type == self.TYPE_POSITION: - l = self.get(self.TYPE_POSITION) - elif self.type == self.TYPE_REMAINING: - l = self.length - self.get(self.TYPE_POSITION) + seek = None + service = self.navcore.getCurrentService() + if service != None: + seek = service.seek() + + if seek is not None: + if self.type != self.TYPE_RELATIVE: + if self.type == self.TYPE_LENGTH: + l = self.get(self.TYPE_LENGTH) + elif self.type == self.TYPE_POSITION: + l = self.get(self.TYPE_POSITION) + elif self.type == self.TYPE_REMAINING: + l = self.get(self.TYPE_LENGTH) - self.get(self.TYPE_POSITION) - self.setText("%d:%02d" % (l/60, l%60)) + self.setText("%d:%02d" % (l/60, l%60)) + else: + l = self.get(self.TYPE_POSITION) + if l != -1: + l += self.relative_base + try: + t = time.localtime(l) + timestr = "%2d:%02d:%02d" % (t.tm_hour, t.tm_min, t.tm_sec) + except ValueError: + timestr = "" + else: + timestr = "" + + self.setText(timestr) + + self.updateTimer.start(500) else: + self.updateTimer.start(10000) self.setText("-:--") def stopEvent(self): self.updateTimer.stop() self.setText(""); + +class ServicePositionGauge(PerServiceBase, GUIComponent): + def __init__(self, navcore): + GUIComponent.__init__(self) + PerServiceBase.__init__(self, navcore, + { + iPlayableService.evStart: self.newService, + iPlayableService.evEnd: self.stopEvent, + iPlayableService.evCuesheetChanged: self.newCuesheet + }) + self.instance = None + self.__seek_position = 0 + + def newService(self): + if self.get() is None: + self.disablePolling() + else: + self.enablePolling(interval=500) + self.newCuesheet() + + def get(self): + service = self.navcore.getCurrentService() + seek = service and service.seek() + if seek is None: + return (0, 0) + + len = seek.getLength() + pos = seek.getPlayPosition() + + if len[0] or pos[0]: + return (0, 0) + return (len[1], pos[1]) + + def poll(self): + data = self.get() + if data is None: + return + + if self.instance is not None: + self.instance.setLength(data[0]) + self.instance.setPosition(data[1]) + + def stopEvent(self): + self.disablePolling() + + GUI_WIDGET = ePositionGauge + + def postWidgetCreate(self, instance): + self.newService() + self.setSeekPosition(self.__seek_position) + + def newCuesheet(self): + service = self.navcore.getCurrentService() + cue = service and service.cueSheet() + cutlist = (cue and cue.getCutList()) or [ ] + if self.instance is not None: + self.instance.setInOutList(cutlist) + + def getSeekEnable(self): + return self.__seek_enable + + def setSeekEnable(self, val): + self.__seek_enable = val + if self.instance is not None: + self.instance.enableSeekPointer(val) + + seek_pointer_enabled = property(getSeekEnable, setSeekEnable) + + def getSeekPosition(self): + return self.__seek_position + + def setSeekPosition(self, pos): + print "set seek position:", pos + self.__seek_position = pos + if self.instance is not None: + print "set instance." + self.instance.setSeekPosition(pos) + + seek_pointer_position = property(getSeekPosition, setSeekPosition)