enhance usability of ZappingAlternatives plugin
[enigma2.git] / lib / python / Components / ServicePosition.py
1 from PerServiceDisplay import *
2 from enigma import eTimer
3
4 from enigma import iPlayableService, iSeekableServicePtr, ePositionGauge
5
6 class ServicePosition(PerServiceDisplay):
7         TYPE_LENGTH = 0,
8         TYPE_POSITION = 1,
9         TYPE_REMAINING = 2
10         
11         def __init__(self, navcore, type):
12                 self.updateTimer = eTimer()
13                 self.updateTimer.timeout.get().append(self.update)
14                 PerServiceDisplay.__init__(self, navcore,
15                         {
16                                 iPlayableService.evStart: self.newService,
17                                 iPlayableService.evEnd: self.stopEvent
18                         })
19                 self.type = type
20 #               self.setType(type)
21
22         def newService(self):
23                 self.setType(self.type)
24         
25         def setType(self, type):
26                 self.type = type
27                 
28                 self.updateTimer.start(500)
29                 self.update()
30         
31         def get(self, what):
32                 service = self.navcore.getCurrentService()
33                 seek = service and service.seek()
34                 if seek != None:
35                         if what == self.TYPE_LENGTH:
36                                 r = seek.getLength()
37                         elif what == self.TYPE_POSITION:
38                                 r = seek.getPlayPosition()
39                         if not r[0]:
40                                 return r[1] / 90000
41                 
42                 return -1
43         
44         def update(self):
45                 seek = None
46                 service = self.navcore.getCurrentService()
47                 if service != None:
48                         seek = service.seek()
49
50                 if seek is not None:
51                         if self.type == self.TYPE_LENGTH:
52                                 l = self.get(self.TYPE_LENGTH)
53                         elif self.type == self.TYPE_POSITION:
54                                 l = self.get(self.TYPE_POSITION)
55                         elif self.type == self.TYPE_REMAINING:
56                                 l = self.get(self.TYPE_LENGTH) - self.get(self.TYPE_POSITION)
57                         
58                         self.setText("%d:%02d" % (l/60, l%60))
59                         self.updateTimer.start(500)
60                 else:
61                         self.updateTimer.start(10000)
62                         self.setText("-:--")
63         
64         def stopEvent(self):
65                 self.updateTimer.stop()
66                 self.setText("");
67
68 class ServicePositionGauge(PerServiceBase):
69         def __init__(self, navcore):
70                 PerServiceBase.__init__(self, navcore,
71                         {
72                                 iPlayableService.evStart: self.newService,
73                                 iPlayableService.evEnd: self.stopEvent,
74                                 iPlayableService.evCuesheetChanged: self.newCuesheet
75                         })
76                 self.instance = None
77
78         def newService(self):
79                 if self.get() is None:  
80                         self.disablePolling()
81                 else:
82                         self.enablePolling(interval=500)
83                         self.newCuesheet()
84         
85         def get(self):
86                 service = self.navcore.getCurrentService()
87                 seek = service and service.seek()
88                 if seek is None:
89                         return None
90
91                 len = seek.getLength()
92                 pos = seek.getPlayPosition()
93                 
94                 if len[0] or pos[0]:
95                         return (0, 0)
96                 return (len[1], pos[1])
97         
98         def poll(self):
99                 data = self.get()
100                 if data is None:
101                         return
102
103                 if self.instance is not None:
104                         self.instance.setLength(data[0])
105                         self.instance.setPosition(data[1])
106                 
107         def stopEvent(self):
108                 self.disablePolling()
109
110         def GUIcreate(self, parent):
111                 self.instance = ePositionGauge(parent)
112                 self.newService()
113         
114         def GUIdelete(self):
115                 self.instance = None
116
117         def newCuesheet(self):
118                 service = self.navcore.getCurrentService()
119                 cue = service and service.cueSheet()
120                 cutlist = (cue and cue.getCutList()) or [ ]
121                 if self.instance is not None:
122                         self.instance.setInOutList(cutlist)