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 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.servicelist.zapToNumber(retval)
251 class InfoBarChannelSelection:
252 """ ChannelSelection - handles the channelSelection dialog and the initial
253 channelChange actions which open the channelSelection dialog """
256 self.servicelist = self.session.instantiateDialog(ChannelSelection)
258 self["ChannelSelectActions"] = HelpableActionMap(self, "InfobarChannelSelection",
260 "switchChannelUp": self.switchChannelUp,
261 "switchChannelDown": self.switchChannelDown,
262 "zapUp": (self.zapUp, _("next channel")),
263 "zapDown": (self.zapDown, _("previous channel")),
266 def switchChannelUp(self):
267 self.servicelist.moveUp()
268 self.session.execDialog(self.servicelist)
270 def switchChannelDown(self):
271 self.servicelist.moveDown()
272 self.session.execDialog(self.servicelist)
275 self.servicelist.moveUp()
276 self.servicelist.zap()
281 self.servicelist.moveDown()
282 self.servicelist.zap()
287 """ Handles a menu action, to open the (main) menu """
289 self["MenuActions"] = HelpableActionMap(self, "InfobarMenuActions",
291 "mainMenu": (self.mainMenu, "Enter main menu..."),
295 print "loading mainmenu XML..."
296 menu = mdom.childNodes[0]
297 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
298 self.session.open(MainMenu, menu, menu.childNodes)
301 """ EPG - Opens an EPG list when the showEPGList action fires """
303 self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions",
305 "showEPGList": (self.showEPGList, _("show EPG...")),
308 def showEPGList(self):
309 ref=self.session.nav.getCurrentlyPlayingServiceReference()
310 ptr=eEPGCache.getInstance()
311 if ptr.startTimeQuery(ref) != -1:
312 self.session.open(EPGSelection, ref)
313 else: # try to show now/next
314 print 'no epg for service', ref.toString()
317 service = self.session.nav.getCurrentService()
318 info = service.info()
321 self.epglist.append(ptr)
324 self.epglist.append(ptr)
325 if len(self.epglist) > 0:
326 self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
330 def eventViewCallback(self, setEvent, val): #used for now/next displaying
331 if len(self.epglist) > 1:
332 tmp = self.epglist[0]
333 self.epglist[0]=self.epglist[1]
335 setEvent(self.epglist[0])
338 """provides a current/next event info display"""
340 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
341 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
343 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
344 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
346 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
347 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
349 class InfoBarServiceName:
351 self["ServiceName"] = ServiceName(self.session.nav)
354 """handles PVR specific actions like seeking, pause"""
356 self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions",
358 "pauseService": (self.pauseService, "pause"),
359 "unPauseService": (self.unPauseService, "continue"),
361 "seekFwd": (self.seekFwd, "skip forward"),
362 "seekBack": (self.seekBack, "skip backward"),
365 def pauseService(self):
366 self.session.nav.pause(1)
368 def unPauseService(self):
369 self.session.nav.pause(0)
371 def doSeek(self, dir, seektime):
372 service = self.session.nav.getCurrentService()
376 seekable = service.seek()
379 seekable.seekRelative(dir, 90 * seektime)
382 self.doSeek(+1, 60000)
385 self.doSeek(-1, 60000)
387 class InfoBarInstantRecord:
388 """Instant Record - handles the instantRecord action in order to
389 start/stop instant records"""
391 self["InstantRecordActions"] = HelpableActionMap(self, "InfobarInstantRecord",
393 "instantRecord": (self.instantRecord, "Instant Record..."),
395 self.recording = None
397 self["BlinkingPoint"] = BlinkingPixmapConditional()
398 self.onShown.append(self["BlinkingPoint"].hidePixmap)
399 self["BlinkingPoint"].setConnect(self.session.nav.RecordTimer.isRecording)
401 def stopCurrentRecording(self):
402 self.session.nav.RecordTimer.removeEntry(self.recording)
403 self.recording = None
405 def startInstantRecording(self):
406 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
408 # try to get event info
411 service = self.session.nav.getCurrentService()
412 info = service.info()
413 ev = info.getEvent(0)
418 # fix me, description.
419 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
420 self.recording.dontSave = True
422 #self["BlinkingPoint"].setConnect(lambda: self.recording.isRunning())
424 def isInstantRecordRunning(self):
425 if self.recording != None:
426 if self.recording.isRunning():
430 def recordQuestionCallback(self, answer):
434 if self.isInstantRecordRunning():
435 self.stopCurrentRecording()
437 self.startInstantRecording()
439 def instantRecord(self):
441 stat = os.stat("/hdd/movies")
443 self.session.open(MessageBox, "No HDD found!")
446 if self.isInstantRecordRunning():
447 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, _("Do you want to stop the current\n(instant) recording?"))
449 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, _("Start recording?"))
451 from Screens.AudioSelection import AudioSelection
453 class InfoBarAudioSelection:
455 self["AudioSelectionAction"] = HelpableActionMap(self, "InfobarAudioSelectionActions",
457 "audioSelection": (self.audioSelection, "Audio Options..."),
460 def audioSelection(self):
461 service = self.session.nav.getCurrentService()
462 audio = service.audioTracks()
463 n = audio.getNumberOfTracks()
465 self.session.open(AudioSelection, audio)
467 class InfoBarAdditionalInfo:
469 self["DolbyActive"] = PixmapConditional()
470 # TODO: get the info from c++ somehow
471 self["DolbyActive"].setConnect(lambda: False)
473 self["CryptActive"] = PixmapConditional()
474 # TODO: get the info from c++ somehow
475 self["CryptActive"].setConnect(lambda: False)
477 self["FormatActive"] = PixmapConditional()
478 # TODO: get the info from c++ somehow
479 self["FormatActive"].setConnect(lambda: False)