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