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.Pixmap import Pixmap, PixmapConditional
10 from Components.BlinkingPixmap import BlinkingPixmapConditional
11 from Components.ServiceName import ServiceName
12 from Components.EventInfo import EventInfo
14 from ServiceReference import ServiceReference
15 from EpgSelection import EPGSelection
17 from Screens.MessageBox import MessageBox
18 from Screens.Volume import Volume
19 from Screens.Mute import Mute
20 from Screens.Standby import Standby
21 from Screens.EventView import EventView
23 #from enigma import eTimer, eDVBVolumecontrol, quitMainloop
30 from Menu import MainMenu, mdom
32 class InfoBarVolumeControl:
33 """Volume control, handles volUp, volDown, volMute actions and display
34 a corresponding dialog"""
36 config.audio = ConfigSubsection()
37 config.audio.volume = configElement("config.audio.volume", configSequence, [5], configsequencearg.get("INTEGER", (0, 100)))
39 self["VolumeActions"] = ActionMap( ["InfobarVolumeActions"] ,
41 "volumeUp": self.volUp,
42 "volumeDown": self.volDown,
43 "volumeMute": self.volMute,
46 self.volumeDialog = self.session.instantiateDialog(Volume)
47 self.muteDialog = self.session.instantiateDialog(Mute)
49 self.hideVolTimer = eTimer()
50 self.hideVolTimer.timeout.get().append(self.volHide)
52 vol = config.audio.volume.value[0]
53 self.volumeDialog.setValue(vol)
54 eDVBVolumecontrol.getInstance().setVolume(vol, vol)
57 config.audio.volume.value = eDVBVolumecontrol.getInstance().getVolume()
58 config.audio.volume.save()
61 eDVBVolumecontrol.getInstance().volumeUp()
62 self.volumeDialog.instance.show()
63 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
65 self.hideVolTimer.start(3000)
68 eDVBVolumecontrol.getInstance().volumeDown()
69 self.volumeDialog.instance.show()
70 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
72 self.hideVolTimer.start(3000)
75 self.volumeDialog.instance.hide()
78 eDVBVolumecontrol.getInstance().volumeToggleMute()
79 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
81 if (eDVBVolumecontrol.getInstance().isMuted()):
82 self.muteDialog.instance.show()
84 self.muteDialog.instance.hide()
86 class InfoBarShowHide:
87 """ InfoBar show/hide control, accepts toggleShow and hide actions, might start
95 self["ShowHideActions"] = ActionMap( ["InfobarShowHideActions"] ,
97 "toggleShow": self.toggleShow,
101 self.state = self.STATE_SHOWN
103 self.onExecBegin.append(self.show)
104 self.onClose.append(self.delHideTimer)
106 self.hideTimer = eTimer()
107 self.hideTimer.timeout.get().append(self.doTimerHide)
108 self.hideTimer.start(5000)
110 def delHideTimer(self):
117 self.state = self.STATE_SHOWN
118 self.hideTimer.stop()
119 self.hideTimer.start(5000)
121 def doTimerHide(self):
122 self.hideTimer.stop()
123 if self.state == self.STATE_SHOWN:
125 self.state = self.STATE_HIDDEN
127 def toggleShow(self):
128 if self.state == self.STATE_SHOWN:
130 #pls check animation support, sorry
132 self.hideTimer.stop()
133 self.state = self.STATE_HIDDEN
134 elif self.state == self.STATE_HIDDEN:
139 self.instance.m_animation.startMoveAnimation(ePoint(0, 600), ePoint(0, 380), 100)
140 self.state = self.STATE_SHOWN
143 self.instance.m_animation.startMoveAnimation(ePoint(0, 380), ePoint(0, 600), 100)
144 self.state = self.STATE_HIDDEN
146 class NumberZap(Screen):
153 self.close(int(self["number"].getText()))
155 def keyNumberGlobal(self, number):
156 self.Timer.start(3000) #reset timer
157 self.field = self.field + str(number)
158 self["number"].setText(self.field)
159 if len(self.field) >= 4:
162 def __init__(self, session, number):
163 Screen.__init__(self, session)
164 self.field = str(number)
166 self["channel"] = Label(_("Channel:"))
168 self["number"] = Label(self.field)
170 self["actions"] = NumberActionMap( [ "SetupActions" ],
174 "1": self.keyNumberGlobal,
175 "2": self.keyNumberGlobal,
176 "3": self.keyNumberGlobal,
177 "4": self.keyNumberGlobal,
178 "5": self.keyNumberGlobal,
179 "6": self.keyNumberGlobal,
180 "7": self.keyNumberGlobal,
181 "8": self.keyNumberGlobal,
182 "9": self.keyNumberGlobal,
183 "0": self.keyNumberGlobal
186 self.Timer = eTimer()
187 self.Timer.timeout.get().append(self.keyOK)
188 self.Timer.start(3000)
190 class InfoBarPowerKey:
191 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
194 self.powerKeyTimer = eTimer()
195 self.powerKeyTimer.timeout.get().append(self.powertimer)
196 self["PowerKeyActions"] = HelpableActionMap(self, "PowerKeyActions",
198 "powerdown": self.powerdown,
199 "powerup": self.powerup,
200 "discreteStandby": (self.standby, "Go standby"),
201 "discretePowerOff": (self.quit, "Go to deep standby"),
204 def powertimer(self):
205 print "PowerOff - Now!"
209 self.standbyblocked = 0
210 self.powerKeyTimer.start(3000)
213 self.powerKeyTimer.stop()
214 if self.standbyblocked == 0:
215 self.standbyblocked = 1
219 self.session.open(Standby, self)
225 class InfoBarNumberZap:
226 """ Handles an initial number for NumberZapping """
228 self["NumberZapActions"] = NumberActionMap( [ "NumberZapActions"],
230 "1": self.keyNumberGlobal,
231 "2": self.keyNumberGlobal,
232 "3": self.keyNumberGlobal,
233 "4": self.keyNumberGlobal,
234 "5": self.keyNumberGlobal,
235 "6": self.keyNumberGlobal,
236 "7": self.keyNumberGlobal,
237 "8": self.keyNumberGlobal,
238 "9": self.keyNumberGlobal,
239 "0": self.keyNumberGlobal,
242 def keyNumberGlobal(self, number):
243 # print "You pressed number " + str(number)
244 self.session.openWithCallback(self.numberEntered, NumberZap, number)
246 def numberEntered(self, retval):
247 # print self.servicelist
249 self.zapToNumber(retval)
251 def searchNumberHelper(self, serviceHandler, num, bouquet):
252 servicelist = serviceHandler.list(bouquet)
253 if not servicelist is None:
255 serviceIterator = servicelist.getNext()
256 if not serviceIterator.valid(): #check end of list
258 if serviceIterator.flags: #assume normal dvb service have no flags set
261 if not num: #found service with searched number ?
262 return serviceIterator, 0
265 def zapToNumber(self, number):
266 bouquet = self.servicelist.bouquet_root
268 serviceHandler = eServiceCenter.getInstance()
269 if bouquet.toString().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK
270 service, number = self.searchNumberHelper(serviceHandler, number, bouquet)
272 bouquetlist = serviceHandler.list(bouquet)
273 if not bouquetlist is None:
275 bouquet = bouquetlist.getNext()
276 if not bouquet.valid(): #check end of list
278 if ((bouquet.flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory):
280 service, number = self.searchNumberHelper(serviceHandler, number, bouquet)
281 if not service is None:
282 self.session.nav.playService(service) #play service
283 if self.servicelist.getRoot() != bouquet: #already in correct bouquet?
284 self.servicelist.setRoot(bouquet)
285 self.servicelist.setCurrentSelection(service) #select the service in servicelist
287 class InfoBarChannelSelection:
288 """ ChannelSelection - handles the channelSelection dialog and the initial
289 channelChange actions which open the channelSelection dialog """
292 self.servicelist = self.session.instantiateDialog(ChannelSelection)
294 self["ChannelSelectActions"] = HelpableActionMap(self, "InfobarChannelSelection",
296 "switchChannelUp": self.switchChannelUp,
297 "switchChannelDown": self.switchChannelDown,
298 "zapUp": (self.zapUp, _("next channel")),
299 "zapDown": (self.zapDown, _("previous channel")),
302 def switchChannelUp(self):
303 self.servicelist.moveUp()
304 self.session.execDialog(self.servicelist)
306 def switchChannelDown(self):
307 self.servicelist.moveDown()
308 self.session.execDialog(self.servicelist)
311 self.servicelist.moveUp()
312 self.servicelist.zap()
317 self.servicelist.moveDown()
318 self.servicelist.zap()
323 """ Handles a menu action, to open the (main) menu """
325 self["MenuActions"] = HelpableActionMap(self, "InfobarMenuActions",
327 "mainMenu": (self.mainMenu, "Enter main menu..."),
331 print "loading mainmenu XML..."
332 menu = mdom.childNodes[0]
333 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
334 self.session.open(MainMenu, menu, menu.childNodes)
337 """ EPG - Opens an EPG list when the showEPGList action fires """
339 self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions",
341 "showEPGList": (self.showEPGList, _("show EPG...")),
344 def showEPGList(self):
345 ref=self.session.nav.getCurrentlyPlayingServiceReference()
346 ptr=eEPGCache.getInstance()
347 if ptr.startTimeQuery(ref) != -1:
348 self.session.open(EPGSelection, ref)
349 else: # try to show now/next
350 print 'no epg for service', ref.toString()
353 service = self.session.nav.getCurrentService()
354 info = service.info()
357 self.epglist.append(ptr)
360 self.epglist.append(ptr)
361 if len(self.epglist) > 0:
362 self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
366 def eventViewCallback(self, setEvent, val): #used for now/next displaying
367 if len(self.epglist) > 1:
368 tmp = self.epglist[0]
369 self.epglist[0]=self.epglist[1]
371 setEvent(self.epglist[0])
374 """provides a current/next event info display"""
376 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
377 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
379 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
380 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
382 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
383 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
385 class InfoBarServiceName:
387 self["ServiceName"] = ServiceName(self.session.nav)
390 """handles PVR specific actions like seeking, pause"""
392 self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions",
394 "pauseService": (self.pauseService, "pause"),
395 "unPauseService": (self.unPauseService, "continue"),
397 "seekFwd": (self.seekFwd, "skip forward"),
398 "seekBack": (self.seekBack, "skip backward"),
401 def pauseService(self):
402 self.session.nav.pause(1)
404 def unPauseService(self):
405 self.session.nav.pause(0)
407 def doSeek(self, dir, seektime):
408 service = self.session.nav.getCurrentService()
412 seekable = service.seek()
415 seekable.seekRelative(dir, 90 * seektime)
418 self.doSeek(+1, 60000)
421 self.doSeek(-1, 60000)
423 class InfoBarInstantRecord:
424 """Instant Record - handles the instantRecord action in order to
425 start/stop instant records"""
427 self["InstantRecordActions"] = HelpableActionMap(self, "InfobarInstantRecord",
429 "instantRecord": (self.instantRecord, "Instant Record..."),
431 self.recording = None
433 self["BlinkingPoint"] = BlinkingPixmapConditional()
434 self.onShown.append(self["BlinkingPoint"].hidePixmap)
435 self["BlinkingPoint"].setConnect(self.session.nav.RecordTimer.isRecording)
437 def stopCurrentRecording(self):
438 self.session.nav.RecordTimer.removeEntry(self.recording)
439 self.recording = None
441 def startInstantRecording(self):
442 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
444 # try to get event info
447 service = self.session.nav.getCurrentService()
448 info = service.info()
449 ev = info.getEvent(0)
454 # fix me, description.
455 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
456 self.recording.dontSave = True
458 #self["BlinkingPoint"].setConnect(lambda: self.recording.isRunning())
460 def isInstantRecordRunning(self):
461 if self.recording != None:
462 if self.recording.isRunning():
466 def recordQuestionCallback(self, answer):
470 if self.isInstantRecordRunning():
471 self.stopCurrentRecording()
473 self.startInstantRecording()
475 def instantRecord(self):
477 stat = os.stat("/hdd/movies")
479 self.session.open(MessageBox, "No HDD found!")
482 if self.isInstantRecordRunning():
483 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, _("Do you want to stop the current\n(instant) recording?"))
485 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, _("Start recording?"))
487 from Screens.AudioSelection import AudioSelection
489 class InfoBarAudioSelection:
491 self["AudioSelectionAction"] = HelpableActionMap(self, "InfobarAudioSelectionActions",
493 "audioSelection": (self.audioSelection, "Audio Options..."),
496 def audioSelection(self):
497 service = self.session.nav.getCurrentService()
498 audio = service.audioTracks()
499 n = audio.getNumberOfTracks()
501 self.session.open(AudioSelection, audio)
503 class InfoBarAdditionalInfo:
505 self["DolbyActive"] = PixmapConditional()
506 # TODO: get the info from c++ somehow
507 self["DolbyActive"].setConnect(lambda: False)
509 self["CryptActive"] = PixmapConditional()
510 # TODO: get the info from c++ somehow
511 self["CryptActive"].setConnect(lambda: False)
513 self["FormatActive"] = PixmapConditional()
514 # TODO: get the info from c++ somehow
515 self["FormatActive"].setConnect(lambda: False)
517 self["ButtonRed"] = Pixmap()
518 self["ButtonRedText"] = Label(_("Record"))
519 self["ButtonGreen"] = Pixmap()
520 self["ButtonYellow"] = Pixmap()
521 self["ButtonBlue"] = Pixmap()