1 from Screen import Screen
2 from Components.ActionMap import ActionMap, HelpableActionMap
3 from Components.ActionMap import NumberActionMap
4 from Components.Label import Label
5 from Components.config import configfile, configsequencearg
6 from Components.config import config, configElement, ConfigSubsection, configSequence
7 from ChannelSelection import ChannelSelection
9 from Components.ServiceName import ServiceName
10 from Components.EventInfo import EventInfo
12 from ServiceReference import ServiceReference
13 from EpgSelection import EPGSelection
15 from Screens.MessageBox import MessageBox
16 from Screens.Volume import Volume
17 from Screens.Mute import Mute
18 from Screens.Standby import Standby
19 from Screens.EventView import EventView
21 #from enigma import eTimer, eDVBVolumecontrol, quitMainloop
28 from Menu import MainMenu, mdom
30 class InfoBarVolumeControl:
31 """Volume control, handles volUp, volDown, volMute actions and display
32 a corresponding dialog"""
34 config.audio = ConfigSubsection()
35 config.audio.volume = configElement("config.audio.volume", configSequence, [5], configsequencearg.get("INTEGER", (0, 100)))
37 self["VolumeActions"] = ActionMap( ["InfobarVolumeActions"] ,
39 "volumeUp": self.volUp,
40 "volumeDown": self.volDown,
41 "volumeMute": self.volMute,
44 self.volumeDialog = self.session.instantiateDialog(Volume)
45 self.muteDialog = self.session.instantiateDialog(Mute)
47 self.hideVolTimer = eTimer()
48 self.hideVolTimer.timeout.get().append(self.volHide)
50 vol = config.audio.volume.value[0]
51 self.volumeDialog.setValue(vol)
52 eDVBVolumecontrol.getInstance().setVolume(vol, vol)
55 config.audio.volume.value = eDVBVolumecontrol.getInstance().getVolume()
56 config.audio.volume.save()
59 eDVBVolumecontrol.getInstance().volumeUp()
60 self.volumeDialog.instance.show()
61 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
63 self.hideVolTimer.start(3000)
66 eDVBVolumecontrol.getInstance().volumeDown()
67 self.volumeDialog.instance.show()
68 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
70 self.hideVolTimer.start(3000)
73 self.volumeDialog.instance.hide()
76 eDVBVolumecontrol.getInstance().volumeToggleMute()
77 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
79 if (eDVBVolumecontrol.getInstance().isMuted()):
80 self.muteDialog.instance.show()
82 self.muteDialog.instance.hide()
84 class InfoBarShowHide:
85 """ InfoBar show/hide control, accepts toggleShow and hide actions, might start
93 self["ShowHideActions"] = ActionMap( ["InfobarShowHideActions"] ,
95 "toggleShow": self.toggleShow,
99 self.state = self.STATE_HIDDEN
101 self.hideTimer = eTimer()
102 self.hideTimer.timeout.get().append(self.doTimerHide)
103 #self.hideTimer.start(1000)
108 def doTimerHide(self):
109 if self.state == self.STATE_SHOWN:
111 self.state = self.STATE_HIDDEN
113 def toggleShow(self):
114 if self.state == self.STATE_SHOWN:
116 #pls check animation support, sorry
118 self.state = self.STATE_HIDDEN
122 self.state = self.STATE_SHOWN
123 #TODO: make it customizable
124 self.hideTimer.start(5000)
127 self.instance.m_animation.startMoveAnimation(ePoint(0, 600), ePoint(0, 380), 100)
128 self.state = self.STATE_SHOWN
131 self.instance.m_animation.startMoveAnimation(ePoint(0, 380), ePoint(0, 600), 100)
132 self.state = self.STATE_HIDDEN
134 class NumberZap(Screen):
141 self.close(int(self["number"].getText()))
143 def keyNumberGlobal(self, number):
144 self.Timer.start(3000) #reset timer
145 self.field = self.field + str(number)
146 self["number"].setText(self.field)
147 if len(self.field) >= 4:
150 def __init__(self, session, number):
151 Screen.__init__(self, session)
152 self.field = str(number)
154 self["number"] = Label(self.field)
156 self["actions"] = NumberActionMap( [ "SetupActions" ],
160 "1": self.keyNumberGlobal,
161 "2": self.keyNumberGlobal,
162 "3": self.keyNumberGlobal,
163 "4": self.keyNumberGlobal,
164 "5": self.keyNumberGlobal,
165 "6": self.keyNumberGlobal,
166 "7": self.keyNumberGlobal,
167 "8": self.keyNumberGlobal,
168 "9": self.keyNumberGlobal,
169 "0": self.keyNumberGlobal
172 self.Timer = eTimer()
173 self.Timer.timeout.get().append(self.keyOK)
174 self.Timer.start(3000)
176 class InfoBarPowerKey:
177 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
180 self.powerKeyTimer = eTimer()
181 self.powerKeyTimer.timeout.get().append(self.powertimer)
182 self["PowerKeyActions"] = HelpableActionMap(self, "PowerKeyActions",
184 "powerdown": self.powerdown,
185 "powerup": self.powerup,
186 "discreteStandby": (self.standby, "Go standby"),
187 "discretePowerOff": (self.quit, "Go to deep standby"),
190 def powertimer(self):
191 print "PowerOff - Now!"
195 self.standbyblocked = 0
196 self.powerKeyTimer.start(3000)
199 self.powerKeyTimer.stop()
200 if self.standbyblocked == 0:
201 self.standbyblocked = 1
205 self.session.open(Standby, self)
211 class InfoBarNumberZap:
212 """ Handles an initial number for NumberZapping """
214 self["NumberZapActions"] = NumberActionMap( [ "NumberZapActions"],
216 "1": self.keyNumberGlobal,
217 "2": self.keyNumberGlobal,
218 "3": self.keyNumberGlobal,
219 "4": self.keyNumberGlobal,
220 "5": self.keyNumberGlobal,
221 "6": self.keyNumberGlobal,
222 "7": self.keyNumberGlobal,
223 "8": self.keyNumberGlobal,
224 "9": self.keyNumberGlobal,
225 "0": self.keyNumberGlobal,
228 def keyNumberGlobal(self, number):
229 # print "You pressed number " + str(number)
230 self.session.openWithCallback(self.numberEntered, NumberZap, number)
232 def numberEntered(self, retval):
233 # print self.servicelist
235 self.servicelist.zapToNumber(retval)
237 class InfoBarChannelSelection:
238 """ ChannelSelection - handles the channelSelection dialog and the initial
239 channelChange actions which open the channelSelection dialog """
242 self.servicelist = self.session.instantiateDialog(ChannelSelection)
244 self["ChannelSelectActions"] = HelpableActionMap(self, "InfobarChannelSelection",
246 "switchChannelUp": self.switchChannelUp,
247 "switchChannelDown": self.switchChannelDown,
248 "zapUp": (self.zapUp, _("next channel")),
249 "zapDown": (self.zapDown, _("previous channel")),
252 def switchChannelUp(self):
253 self.servicelist.moveUp()
254 self.session.execDialog(self.servicelist)
256 def switchChannelDown(self):
257 self.servicelist.moveDown()
258 self.session.execDialog(self.servicelist)
261 self.servicelist.moveUp()
262 self.servicelist.zap()
265 self.servicelist.moveDown()
266 self.servicelist.zap()
269 """ Handles a menu action, to open the (main) menu """
271 self["MenuActions"] = HelpableActionMap(self, "InfobarMenuActions",
273 "mainMenu": (self.mainMenu, "Enter main menu..."),
277 print "loading mainmenu XML..."
278 menu = mdom.childNodes[0]
279 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
280 self.session.open(MainMenu, menu, menu.childNodes)
283 """ EPG - Opens an EPG list when the showEPGList action fires """
285 self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions",
287 "showEPGList": (self.showEPGList, _("show EPG...")),
290 def showEPGList(self):
291 ref=self.session.nav.getCurrentlyPlayingServiceReference()
292 ptr=eEPGCache.getInstance()
293 if ptr.startTimeQuery(ref) != -1:
294 self.session.open(EPGSelection, ref)
295 else: # try to show now/next
296 print 'no epg for service', ref.toString()
299 service = self.session.nav.getCurrentService()
300 info = service.info()
303 self.epglist.append(ptr)
306 self.epglist.append(ptr)
307 if len(self.epglist) > 0:
308 self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
312 def eventViewCallback(self, setEvent, val): #used for now/next displaying
313 if len(self.epglist) > 1:
314 tmp = self.epglist[0]
315 self.epglist[0]=self.epglist[1]
317 setEvent(self.epglist[0])
320 """provides a current/next event info display"""
322 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
323 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
325 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
326 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
328 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
329 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
331 class InfoBarServiceName:
333 self["ServiceName"] = ServiceName(self.session.nav)
336 """handles PVR specific actions like seeking, pause"""
338 self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions",
340 "pauseService": (self.pauseService, "pause"),
341 "unPauseService": (self.unPauseService, "continue"),
343 "seekFwd": (self.seekFwd, "skip forward"),
344 "seekBack": (self.seekBack, "skip backward"),
347 def pauseService(self):
348 self.session.nav.pause(1)
350 def unPauseService(self):
351 self.session.nav.pause(0)
353 def doSeek(self, dir, seektime):
354 service = self.session.nav.getCurrentService()
358 seekable = service.seek()
361 seekable.seekRelative(dir, 90 * seektime)
364 self.doSeek(+1, 60000)
367 self.doSeek(-1, 60000)
369 class InfoBarInstantRecord:
370 """Instant Record - handles the instantRecord action in order to
371 start/stop instant records"""
373 self["InstnantRecordActions"] = HelpableActionMap(self, "InfobarInstantRecord",
375 "instantRecord": (self.instantRecord, "Instant Record..."),
377 self.recording = None
379 def stopCurrentRecording(self):
380 self.session.nav.RecordTimer.removeEntry(self.recording)
381 self.recording = None
383 def startInstantRecording(self):
384 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
386 # try to get event info
389 service = self.session.nav.getCurrentService()
390 info = service.info()
391 ev = info.getEvent(0)
396 # fix me, description.
397 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
398 self.recording.dontSave = True
400 def recordQuestionCallback(self, answer):
404 if self.recording != None:
405 self.stopCurrentRecording()
407 self.startInstantRecording()
409 def instantRecord(self):
411 stat = os.stat("/hdd/movies")
413 self.session.open(MessageBox, "No HDD found!")
416 if self.recording != None:
417 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Do you want to stop the current\n(instant) recording?")
419 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Start recording?")
421 from Screens.AudioSelection import AudioSelection
423 class InfoBarAudioSelection:
425 self["AudioSelectionAction"] = HelpableActionMap(self, "InfobarAudioSelectionActions",
427 "audioSelection": (self.audioSelection, "Audio Options..."),
430 def audioSelection(self):
431 service = self.session.nav.getCurrentService()
432 audio = service.audioTracks()
433 n = audio.getNumberOfTracks()
435 self.session.open(AudioSelection, audio)