9076942b1e94ca9c608927af1e72be24af3f9230
[enigma2.git] / lib / python / Screens / InfoBar.py
1 from Screen import Screen
2 from EpgSelection import EPGSelection
3 from ChannelSelection import ChannelSelection
4 from Components.Clock import Clock
5 from Components.ActionMap import ActionMap
6 from Components.ActionMap import NumberActionMap
7 from Components.Button import Button
8 from Components.ServiceName import ServiceName
9 from Components.EventInfo import EventInfo
10 from Components.ServicePosition import ServicePosition
11 from Components.config import configfile
12 from Components.Label import Label
13
14 from Screens.MessageBox import MessageBox
15 from Screens.MovieSelection import MovieSelection
16 from Screens.Volume import Volume
17 from Screens.Mute import Mute
18 from Screens.Standby import Standby
19
20 from ServiceReference import ServiceReference
21
22 from enigma import *
23
24 import time
25
26 # hack alert!
27 from Menu import MainMenu, mdom
28
29 class NumberZap(Screen):
30         def quit(self):
31                 self.Timer.stop()
32                 self.close()
33
34         def keyOK(self):
35                 self.Timer.stop()
36                 print "do the action here"
37                 self.close()
38
39         def keyNumberGlobal(self, number):
40                 self.Timer.start(3000)          #reset timer
41                 self.field = self.field + str(number)
42                 self["number"].setText(self.field)
43                 if len(self.field) >= 4:
44                         self.keyOK()
45
46         def __init__(self, session, number):
47                 Screen.__init__(self, session)
48                 self.field = str(number)
49                 
50                 self["number"] = Label(self.field)
51
52                 self["actions"] = NumberActionMap( [ "SetupActions" ], 
53                         {
54                                 "cancel": self.quit,
55                                 "ok": self.keyOK,
56                                 "1": self.keyNumberGlobal,
57                                 "2": self.keyNumberGlobal,
58                                 "3": self.keyNumberGlobal,
59                                 "4": self.keyNumberGlobal,
60                                 "5": self.keyNumberGlobal,
61                                 "6": self.keyNumberGlobal,
62                                 "7": self.keyNumberGlobal,
63                                 "8": self.keyNumberGlobal,
64                                 "9": self.keyNumberGlobal,
65                                 "0": self.keyNumberGlobal
66                         })
67
68                 self.Timer = eTimer()
69                 self.Timer.timeout.get().append(self.keyOK)
70                 self.Timer.start(3000)
71
72
73 class InfoBar(Screen):
74         STATE_HIDDEN = 0
75         STATE_HIDING = 1
76         STATE_SHOWING = 2
77         STATE_SHOWN = 3
78         
79         def __init__(self, session):
80                 Screen.__init__(self, session)
81
82                 #instantiate forever
83                 self.servicelist = self.session.instantiateDialog(ChannelSelection)
84                 
85                 self.state = self.STATE_HIDDEN
86                 
87                 self.volumeDialog = self.session.instantiateDialog(Volume)
88                 self.muteDialog = self.session.instantiateDialog(Mute)
89                 
90                 self.hideTimer = eTimer()
91                 self.hideTimer.timeout.get().append(self.doTimerHide)
92                 #self.hideTimer.start(1000)
93                 
94                 self.hideVolTimer = eTimer()
95                 self.hideVolTimer.timeout.get().append(self.volHide)
96                 
97                 self.powerKeyTimer = eTimer()
98                 self.powerKeyTimer.timeout.get().append(self.powertimer)
99
100                 #self["actions"] = ActionMap( [ "InfobarActions" ], 
101                 self["actions"] = NumberActionMap( [ "InfobarActions" ], 
102                         {
103                                 "switchChannelUp": self.switchChannelUp,
104                                 "switchChannelDown": self.switchChannelDown,
105                                 "mainMenu": self.mainMenu,
106                                 "zapUp": self.zapUp,
107                                 "zapDown": self.zapDown,
108                                 "volumeUp": self.volUp,
109                                 "volumeDown": self.volDown,
110                                 "volumeMute": self.volMute,
111                                 "instantRecord": self.instantRecord,
112                                 "hide": self.hide,
113                                 "toggleShow": self.toggleShow,
114                                 "showMovies": self.showMovies,
115                                 #"quit": self.quit,
116                                 "powerdown": self.powerdown,
117                                 "powerup": self.powerup,
118                                 "1": self.keyNumberGlobal,
119                                 "2": self.keyNumberGlobal,
120                                 "3": self.keyNumberGlobal,
121                                 "4": self.keyNumberGlobal,
122                                 "5": self.keyNumberGlobal,
123                                 "6": self.keyNumberGlobal,
124                                 "7": self.keyNumberGlobal,
125                                 "8": self.keyNumberGlobal,
126                                 "9": self.keyNumberGlobal,
127                                 "0": self.keyNumberGlobal,
128                                 "showEPGList": self.showEPGList,
129                                 
130                                 "pauseService": self.pauseService,
131                                 "unPauseService": self.unPauseService,
132                                 
133                                 "seekFwd": self.seekFwd,
134                                 "seekBack": self.seekBack,
135                                 
136                                 "audioSelection": self.audioSelection,
137                         })
138 #               self["okbutton"] = Button("mainMenu", [self.mainMenu])
139                 
140                 self["CurrentTime"] = Clock()
141                 # ServicePosition(self.session.nav, ServicePosition.TYPE_REMAINING)
142                 # Clock()
143
144                 self["ServiceName"] = ServiceName(self.session.nav)
145                 
146                 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
147                 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
148                                 
149                 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
150                 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
151
152                 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
153                 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
154                 
155                 self.recording = None
156                 
157                 self.pos = 0
158         
159         def mainMenu(self):
160                 print "loading mainmenu XML..."
161                 menu = mdom.childNodes[0]
162                 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
163                 self.session.open(MainMenu, menu, menu.childNodes)
164
165         def powertimer(self):   
166                 print "PowerOff - Now!"
167                 self.quit()
168         
169         def powerdown(self):
170                 self.standbyblocked = 0
171                 self.powerKeyTimer.start(3000)
172
173         def powerup(self):
174                 self.powerKeyTimer.stop()
175                 if self.standbyblocked == 0:
176                         self.standbyblocked = 1
177                         self.session.open(Standby, self)
178                         
179
180         def keyNumberGlobal(self, number):
181                 print "You pressed number " + str(number)
182                 self.session.open(NumberZap, number)
183
184         def switchChannelUp(self):      
185                 self.servicelist.moveUp()
186                 self.session.execDialog(self.servicelist)
187
188         def switchChannelDown(self):    
189                 self.servicelist.moveDown()
190                 self.session.execDialog(self.servicelist)
191
192         def hide(self): 
193                 self.instance.hide()
194
195         def doTimerHide(self):
196                 if self.state == self.STATE_SHOWN:
197                         self.instance.hide()
198                         self.state = self.STATE_HIDDEN
199
200         def toggleShow(self):
201                 if self.state == self.STATE_SHOWN:
202                         self.instance.hide()
203                         #pls check animation support, sorry
204 #                       self.startHide()
205                         self.state = self.STATE_HIDDEN
206                 else:
207                         self.instance.show()
208 #                       self.startShow()
209                         self.state = self.STATE_SHOWN
210                         #TODO: make it customizable
211                         self.hideTimer.start(5000)
212
213         def     zapUp(self):
214                 self.servicelist.moveUp()
215                 self.servicelist.zap()
216
217         def     zapDown(self):
218                 self.servicelist.moveDown()
219                 self.servicelist.zap()
220
221         def     volUp(self):
222                 eDVBVolumecontrol.getInstance().volumeUp()
223                 self.volumeDialog.instance.show()
224                 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
225                 self.hideVolTimer.start(3000)
226
227         def     volDown(self):
228                 eDVBVolumecontrol.getInstance().volumeDown()
229                 self.volumeDialog.instance.show()
230                 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
231                 self.hideVolTimer.start(3000)
232                 
233         def volHide(self):
234                 self.volumeDialog.instance.hide()
235
236         def startShow(self):
237                 self.instance.m_animation.startMoveAnimation(ePoint(0, 600), ePoint(0, 380), 100)
238                 self.state = self.STATE_SHOWN
239         
240         def startHide(self):
241                 self.instance.m_animation.startMoveAnimation(ePoint(0, 380), ePoint(0, 600), 100)
242                 self.state = self.STATE_HIDDEN
243
244         def     volMute(self):
245                 eDVBVolumecontrol.getInstance().volumeToggleMute()
246                 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
247                 
248                 if (eDVBVolumecontrol.getInstance().isMuted()):
249                         self.muteDialog.instance.show()
250                 else:
251                         self.muteDialog.instance.hide()
252
253         def showEPGList(self):
254                 ref=self.session.nav.getCurrentlyPlayingServiceReference()
255                 ptr=eEPGCache.getInstance()
256                 if ptr.startTimeQuery(ref) != -1:
257                         self.session.open(EPGSelection, ref)
258                 else:
259                         print 'no epg for service', ref.toString()
260
261         def quit(self):
262                 #       self.session.open(Standby, self)
263                 configfile.save()
264                 quitMainloop(0)
265         
266         def stopCurrentRecording(self): 
267                 print "remove entry"
268                 self.session.nav.RecordTimer.removeEntry(self.recording)
269                 self.recording = None
270         
271         def startInstantRecording(self):
272                 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
273                         
274                 # try to get event info
275                 epg = None
276                 try:
277                         service = self.session.nav.getCurrentService()
278                         info = service.info()
279                         ev = info.getEvent(0)
280                         epg = ev
281                 except:
282                         pass
283                 
284                 # fix me, description. 
285                 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
286
287         def recordQuestionCallback(self, answer):
288                 if answer == False:
289                         return
290                 
291                 if self.recording != None:
292                         self.stopCurrentRecording()
293                 else:
294                         self.startInstantRecording()
295
296         def instantRecord(self):
297                 if self.recording != None:
298                         self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Do you want to stop the current\n(instant) recording?")
299                 else:
300                         self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Start recording?")
301
302         def showMovies(self):
303                 self.session.open(MovieSelection)
304
305         def pauseService(self):
306                 self.session.nav.pause(1)
307                 
308         def unPauseService(self):
309                 self.session.nav.pause(0)
310         
311         def doSeek(self, dir, seektime):
312                 service = self.session.nav.getCurrentService()
313                 if service is None:
314                         return
315                 
316                 seekable = service.seek()
317                 if seekable is None:
318                         return
319                 seekable.seekRelative(dir, 90 * seektime)
320
321         def seekFwd(self):
322                 self.doSeek(+1, 10000)
323         
324         def seekBack(self):
325                 self.doSeek(-1, 10000)
326
327         def audioSelection(self):
328                 service = self.session.nav.getCurrentService()
329                 audio = service.audioTracks()
330                 n = audio.getNumberOfTracks()
331                 print "AUDIO TRACKS:"
332                 for x in range(n):
333                         i = audio.getTrackInfo(x)
334                         print i.getDescription()