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 print "INFOBARSHOWHIDE init"
94 self["ShowHideActions"] = ActionMap( ["InfobarShowHideActions"] ,
96 "toggleShow": self.toggleShow,
100 self.state = self.STATE_SHOWN
102 self.onExecBegin.append(self.show)
103 self.onClose.append(self.delHideTimer)
105 self.hideTimer = eTimer()
106 self.hideTimer.timeout.get().append(self.doTimerHide)
107 self.hideTimer.start(5000)
109 def delHideTimer(self):
116 self.state = self.STATE_SHOWN
117 self.hideTimer.start(5000)
119 def doTimerHide(self):
120 self.hideTimer.stop()
121 if self.state == self.STATE_SHOWN:
123 self.state = self.STATE_HIDDEN
125 def toggleShow(self):
126 if self.state == self.STATE_SHOWN:
128 #pls check animation support, sorry
130 self.hideTimer.stop()
131 self.state = self.STATE_HIDDEN
132 elif self.state == self.STATE_HIDDEN:
137 self.instance.m_animation.startMoveAnimation(ePoint(0, 600), ePoint(0, 380), 100)
138 self.state = self.STATE_SHOWN
141 self.instance.m_animation.startMoveAnimation(ePoint(0, 380), ePoint(0, 600), 100)
142 self.state = self.STATE_HIDDEN
144 class NumberZap(Screen):
151 self.close(int(self["number"].getText()))
153 def keyNumberGlobal(self, number):
154 self.Timer.start(3000) #reset timer
155 self.field = self.field + str(number)
156 self["number"].setText(self.field)
157 if len(self.field) >= 4:
160 def __init__(self, session, number):
161 Screen.__init__(self, session)
162 self.field = str(number)
164 self["channel"] = Label(_("Channel:"))
166 self["number"] = Label(self.field)
168 self["actions"] = NumberActionMap( [ "SetupActions" ],
172 "1": self.keyNumberGlobal,
173 "2": self.keyNumberGlobal,
174 "3": self.keyNumberGlobal,
175 "4": self.keyNumberGlobal,
176 "5": self.keyNumberGlobal,
177 "6": self.keyNumberGlobal,
178 "7": self.keyNumberGlobal,
179 "8": self.keyNumberGlobal,
180 "9": self.keyNumberGlobal,
181 "0": self.keyNumberGlobal
184 self.Timer = eTimer()
185 self.Timer.timeout.get().append(self.keyOK)
186 self.Timer.start(3000)
188 class InfoBarPowerKey:
189 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
192 self.powerKeyTimer = eTimer()
193 self.powerKeyTimer.timeout.get().append(self.powertimer)
194 self["PowerKeyActions"] = HelpableActionMap(self, "PowerKeyActions",
196 "powerdown": self.powerdown,
197 "powerup": self.powerup,
198 "discreteStandby": (self.standby, "Go standby"),
199 "discretePowerOff": (self.quit, "Go to deep standby"),
202 def powertimer(self):
203 print "PowerOff - Now!"
207 self.standbyblocked = 0
208 self.powerKeyTimer.start(3000)
211 self.powerKeyTimer.stop()
212 if self.standbyblocked == 0:
213 self.standbyblocked = 1
217 self.session.open(Standby, self)
223 class InfoBarNumberZap:
224 """ Handles an initial number for NumberZapping """
226 self["NumberZapActions"] = NumberActionMap( [ "NumberZapActions"],
228 "1": self.keyNumberGlobal,
229 "2": self.keyNumberGlobal,
230 "3": self.keyNumberGlobal,
231 "4": self.keyNumberGlobal,
232 "5": self.keyNumberGlobal,
233 "6": self.keyNumberGlobal,
234 "7": self.keyNumberGlobal,
235 "8": self.keyNumberGlobal,
236 "9": self.keyNumberGlobal,
237 "0": self.keyNumberGlobal,
240 def keyNumberGlobal(self, number):
241 # print "You pressed number " + str(number)
242 self.session.openWithCallback(self.numberEntered, NumberZap, number)
244 def numberEntered(self, retval):
245 # print self.servicelist
247 self.servicelist.zapToNumber(retval)
249 class InfoBarChannelSelection:
250 """ ChannelSelection - handles the channelSelection dialog and the initial
251 channelChange actions which open the channelSelection dialog """
254 self.servicelist = self.session.instantiateDialog(ChannelSelection)
256 self["ChannelSelectActions"] = HelpableActionMap(self, "InfobarChannelSelection",
258 "switchChannelUp": self.switchChannelUp,
259 "switchChannelDown": self.switchChannelDown,
260 "zapUp": (self.zapUp, _("next channel")),
261 "zapDown": (self.zapDown, _("previous channel")),
264 def switchChannelUp(self):
265 self.servicelist.moveUp()
266 self.session.execDialog(self.servicelist)
268 def switchChannelDown(self):
269 self.servicelist.moveDown()
270 self.session.execDialog(self.servicelist)
273 self.servicelist.moveUp()
274 self.servicelist.zap()
277 self.servicelist.moveDown()
278 self.servicelist.zap()
281 """ Handles a menu action, to open the (main) menu """
283 self["MenuActions"] = HelpableActionMap(self, "InfobarMenuActions",
285 "mainMenu": (self.mainMenu, "Enter main menu..."),
289 print "loading mainmenu XML..."
290 menu = mdom.childNodes[0]
291 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
292 self.session.open(MainMenu, menu, menu.childNodes)
295 """ EPG - Opens an EPG list when the showEPGList action fires """
297 self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions",
299 "showEPGList": (self.showEPGList, _("show EPG...")),
302 def showEPGList(self):
303 ref=self.session.nav.getCurrentlyPlayingServiceReference()
304 ptr=eEPGCache.getInstance()
305 if ptr.startTimeQuery(ref) != -1:
306 self.session.open(EPGSelection, ref)
307 else: # try to show now/next
308 print 'no epg for service', ref.toString()
311 service = self.session.nav.getCurrentService()
312 info = service.info()
315 self.epglist.append(ptr)
318 self.epglist.append(ptr)
319 if len(self.epglist) > 0:
320 self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
324 def eventViewCallback(self, setEvent, val): #used for now/next displaying
325 if len(self.epglist) > 1:
326 tmp = self.epglist[0]
327 self.epglist[0]=self.epglist[1]
329 setEvent(self.epglist[0])
332 """provides a current/next event info display"""
334 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
335 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
337 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
338 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
340 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
341 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
343 class InfoBarServiceName:
345 self["ServiceName"] = ServiceName(self.session.nav)
348 """handles PVR specific actions like seeking, pause"""
350 self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions",
352 "pauseService": (self.pauseService, "pause"),
353 "unPauseService": (self.unPauseService, "continue"),
355 "seekFwd": (self.seekFwd, "skip forward"),
356 "seekBack": (self.seekBack, "skip backward"),
359 def pauseService(self):
360 self.session.nav.pause(1)
362 def unPauseService(self):
363 self.session.nav.pause(0)
365 def doSeek(self, dir, seektime):
366 service = self.session.nav.getCurrentService()
370 seekable = service.seek()
373 seekable.seekRelative(dir, 90 * seektime)
376 self.doSeek(+1, 60000)
379 self.doSeek(-1, 60000)
381 class InfoBarInstantRecord:
382 """Instant Record - handles the instantRecord action in order to
383 start/stop instant records"""
385 self["InstnantRecordActions"] = HelpableActionMap(self, "InfobarInstantRecord",
387 "instantRecord": (self.instantRecord, "Instant Record..."),
389 self.recording = None
391 def stopCurrentRecording(self):
392 self.session.nav.RecordTimer.removeEntry(self.recording)
393 self.recording = None
395 def startInstantRecording(self):
396 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
398 # try to get event info
401 service = self.session.nav.getCurrentService()
402 info = service.info()
403 ev = info.getEvent(0)
408 # fix me, description.
409 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
410 self.recording.dontSave = True
412 def recordQuestionCallback(self, answer):
416 if self.recording != None:
417 self.stopCurrentRecording()
419 self.startInstantRecording()
421 def instantRecord(self):
423 stat = os.stat("/hdd/movies")
425 self.session.open(MessageBox, "No HDD found!")
428 if self.recording != None:
429 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Do you want to stop the current\n(instant) recording?")
431 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Start recording?")
433 from Screens.AudioSelection import AudioSelection
435 class InfoBarAudioSelection:
437 self["AudioSelectionAction"] = HelpableActionMap(self, "InfobarAudioSelectionActions",
439 "audioSelection": (self.audioSelection, "Audio Options..."),
442 def audioSelection(self):
443 service = self.session.nav.getCurrentService()
444 audio = service.audioTracks()
445 n = audio.getNumberOfTracks()
447 self.session.open(AudioSelection, audio)