-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):
def setType(self, type):
self.type = type
- seek = iSeekableServicePtr()
- service = self.navcore.getCurrentService()
-
- self.updateTimer.stop()
- self.available = 0
-
- if service != None:
- if not service.seek(seek):
- 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):
- seek = iSeekableServicePtr()
service = self.navcore.getCurrentService()
-
- if service != None:
- if not service.seek(seek):
- 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)
+
+ def destroy(self):
+ PerServiceBase.destroy(self)
+ GUIComponent.destroy(self)