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_SHOWN
101 self.onExecBegin.append(self.show)
102 self.onClose.append(self.delHideTimer)
104 self.hideTimer = eTimer()
105 self.hideTimer.timeout.get().append(self.doTimerHide)
106 self.hideTimer.start(5000)
108 def delHideTimer(self):
115 self.state = self.STATE_SHOWN
116 self.hideTimer.stop()
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()
279 self.servicelist.moveDown()
280 self.servicelist.zap()
285 """ Handles a menu action, to open the (main) menu """
287 self["MenuActions"] = HelpableActionMap(self, "InfobarMenuActions",
289 "mainMenu": (self.mainMenu, "Enter main menu..."),
293 print "loading mainmenu XML..."
294 menu = mdom.childNodes[0]
295 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
296 self.session.open(MainMenu, menu, menu.childNodes)
299 """ EPG - Opens an EPG list when the showEPGList action fires """
301 self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions",
303 "showEPGList": (self.showEPGList, _("show EPG...")),
306 def showEPGList(self):
307 ref=self.session.nav.getCurrentlyPlayingServiceReference()
308 ptr=eEPGCache.getInstance()
309 if ptr.startTimeQuery(ref) != -1:
310 self.session.open(EPGSelection, ref)
311 else: # try to show now/next
312 print 'no epg for service', ref.toString()
315 service = self.session.nav.getCurrentService()
316 info = service.info()
319 self.epglist.append(ptr)
322 self.epglist.append(ptr)
323 if len(self.epglist) > 0:
324 self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
328 def eventViewCallback(self, setEvent, val): #used for now/next displaying
329 if len(self.epglist) > 1:
330 tmp = self.epglist[0]
331 self.epglist[0]=self.epglist[1]
333 setEvent(self.epglist[0])
336 """provides a current/next event info display"""
338 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
339 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
341 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
342 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
344 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
345 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
347 class InfoBarServiceName:
349 self["ServiceName"] = ServiceName(self.session.nav)
352 """handles PVR specific actions like seeking, pause"""
354 self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions",
356 "pauseService": (self.pauseService, "pause"),
357 "unPauseService": (self.unPauseService, "continue"),
359 "seekFwd": (self.seekFwd, "skip forward"),
360 "seekBack": (self.seekBack, "skip backward"),
363 def pauseService(self):
364 self.session.nav.pause(1)
366 def unPauseService(self):
367 self.session.nav.pause(0)
369 def doSeek(self, dir, seektime):
370 service = self.session.nav.getCurrentService()
374 seekable = service.seek()
377 seekable.seekRelative(dir, 90 * seektime)
380 self.doSeek(+1, 60000)
383 self.doSeek(-1, 60000)
385 class InfoBarInstantRecord:
386 """Instant Record - handles the instantRecord action in order to
387 start/stop instant records"""
389 self["InstnantRecordActions"] = HelpableActionMap(self, "InfobarInstantRecord",
391 "instantRecord": (self.instantRecord, "Instant Record..."),
393 self.recording = None
395 def stopCurrentRecording(self):
396 self.session.nav.RecordTimer.removeEntry(self.recording)
397 self.recording = None
399 def startInstantRecording(self):
400 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
402 # try to get event info
405 service = self.session.nav.getCurrentService()
406 info = service.info()
407 ev = info.getEvent(0)
412 # fix me, description.
413 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
414 self.recording.dontSave = True
416 def recordQuestionCallback(self, answer):
420 if self.recording != None:
421 self.stopCurrentRecording()
423 self.startInstantRecording()
425 def instantRecord(self):
427 stat = os.stat("/hdd/movies")
429 self.session.open(MessageBox, "No HDD found!")
432 if self.recording != None:
433 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, _("Do you want to stop the current\n(instant) recording?"))
435 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, _("Start recording?"))
437 from Screens.AudioSelection import AudioSelection
439 class InfoBarAudioSelection:
441 self["AudioSelectionAction"] = HelpableActionMap(self, "InfobarAudioSelectionActions",
443 "audioSelection": (self.audioSelection, "Audio Options..."),
446 def audioSelection(self):
447 service = self.session.nav.getCurrentService()
448 audio = service.audioTracks()
449 n = audio.getNumberOfTracks()
451 self.session.open(AudioSelection, audio)