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.onClose.append(self.delHideTimer)
103 self.hideTimer = eTimer()
104 self.hideTimer.timeout.get().append(self.doTimerHide)
105 self.hideTimer.start(1000)
107 def delHideTimer(self):
113 def doTimerHide(self):
114 if self.state == self.STATE_SHOWN:
116 self.state = self.STATE_HIDDEN
118 def toggleShow(self):
119 if self.state == self.STATE_SHOWN:
121 #pls check animation support, sorry
123 self.state = self.STATE_HIDDEN
127 self.state = self.STATE_SHOWN
128 #TODO: make it customizable
129 self.hideTimer.start(5000)
132 self.instance.m_animation.startMoveAnimation(ePoint(0, 600), ePoint(0, 380), 100)
133 self.state = self.STATE_SHOWN
136 self.instance.m_animation.startMoveAnimation(ePoint(0, 380), ePoint(0, 600), 100)
137 self.state = self.STATE_HIDDEN
139 class NumberZap(Screen):
146 self.close(int(self["number"].getText()))
148 def keyNumberGlobal(self, number):
149 self.Timer.start(3000) #reset timer
150 self.field = self.field + str(number)
151 self["number"].setText(self.field)
152 if len(self.field) >= 4:
155 def __init__(self, session, number):
156 Screen.__init__(self, session)
157 self.field = str(number)
159 self["number"] = Label(self.field)
161 self["actions"] = NumberActionMap( [ "SetupActions" ],
165 "1": self.keyNumberGlobal,
166 "2": self.keyNumberGlobal,
167 "3": self.keyNumberGlobal,
168 "4": self.keyNumberGlobal,
169 "5": self.keyNumberGlobal,
170 "6": self.keyNumberGlobal,
171 "7": self.keyNumberGlobal,
172 "8": self.keyNumberGlobal,
173 "9": self.keyNumberGlobal,
174 "0": self.keyNumberGlobal
177 self.Timer = eTimer()
178 self.Timer.timeout.get().append(self.keyOK)
179 self.Timer.start(3000)
181 class InfoBarPowerKey:
182 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
185 self.powerKeyTimer = eTimer()
186 self.powerKeyTimer.timeout.get().append(self.powertimer)
187 self["PowerKeyActions"] = HelpableActionMap(self, "PowerKeyActions",
189 "powerdown": self.powerdown,
190 "powerup": self.powerup,
191 "discreteStandby": (self.standby, "Go standby"),
192 "discretePowerOff": (self.quit, "Go to deep standby"),
195 def powertimer(self):
196 print "PowerOff - Now!"
200 self.standbyblocked = 0
201 self.powerKeyTimer.start(3000)
204 self.powerKeyTimer.stop()
205 if self.standbyblocked == 0:
206 self.standbyblocked = 1
210 self.session.open(Standby, self)
216 class InfoBarNumberZap:
217 """ Handles an initial number for NumberZapping """
219 self["NumberZapActions"] = NumberActionMap( [ "NumberZapActions"],
221 "1": self.keyNumberGlobal,
222 "2": self.keyNumberGlobal,
223 "3": self.keyNumberGlobal,
224 "4": self.keyNumberGlobal,
225 "5": self.keyNumberGlobal,
226 "6": self.keyNumberGlobal,
227 "7": self.keyNumberGlobal,
228 "8": self.keyNumberGlobal,
229 "9": self.keyNumberGlobal,
230 "0": self.keyNumberGlobal,
233 def keyNumberGlobal(self, number):
234 # print "You pressed number " + str(number)
235 self.session.openWithCallback(self.numberEntered, NumberZap, number)
237 def numberEntered(self, retval):
238 # print self.servicelist
240 self.servicelist.zapToNumber(retval)
242 class InfoBarChannelSelection:
243 """ ChannelSelection - handles the channelSelection dialog and the initial
244 channelChange actions which open the channelSelection dialog """
247 self.servicelist = self.session.instantiateDialog(ChannelSelection)
249 self["ChannelSelectActions"] = HelpableActionMap(self, "InfobarChannelSelection",
251 "switchChannelUp": self.switchChannelUp,
252 "switchChannelDown": self.switchChannelDown,
253 "zapUp": (self.zapUp, _("next channel")),
254 "zapDown": (self.zapDown, _("previous channel")),
257 def switchChannelUp(self):
258 self.servicelist.moveUp()
259 self.session.execDialog(self.servicelist)
261 def switchChannelDown(self):
262 self.servicelist.moveDown()
263 self.session.execDialog(self.servicelist)
266 self.servicelist.moveUp()
267 self.servicelist.zap()
270 self.servicelist.moveDown()
271 self.servicelist.zap()
274 """ Handles a menu action, to open the (main) menu """
276 self["MenuActions"] = HelpableActionMap(self, "InfobarMenuActions",
278 "mainMenu": (self.mainMenu, "Enter main menu..."),
282 print "loading mainmenu XML..."
283 menu = mdom.childNodes[0]
284 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
285 self.session.open(MainMenu, menu, menu.childNodes)
288 """ EPG - Opens an EPG list when the showEPGList action fires """
290 self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions",
292 "showEPGList": (self.showEPGList, _("show EPG...")),
295 def showEPGList(self):
296 ref=self.session.nav.getCurrentlyPlayingServiceReference()
297 ptr=eEPGCache.getInstance()
298 if ptr.startTimeQuery(ref) != -1:
299 self.session.open(EPGSelection, ref)
300 else: # try to show now/next
301 print 'no epg for service', ref.toString()
304 service = self.session.nav.getCurrentService()
305 info = service.info()
308 self.epglist.append(ptr)
311 self.epglist.append(ptr)
312 if len(self.epglist) > 0:
313 self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
317 def eventViewCallback(self, setEvent, val): #used for now/next displaying
318 if len(self.epglist) > 1:
319 tmp = self.epglist[0]
320 self.epglist[0]=self.epglist[1]
322 setEvent(self.epglist[0])
325 """provides a current/next event info display"""
327 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
328 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
330 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
331 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
333 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
334 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
336 class InfoBarServiceName:
338 self["ServiceName"] = ServiceName(self.session.nav)
341 """handles PVR specific actions like seeking, pause"""
343 self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions",
345 "pauseService": (self.pauseService, "pause"),
346 "unPauseService": (self.unPauseService, "continue"),
348 "seekFwd": (self.seekFwd, "skip forward"),
349 "seekBack": (self.seekBack, "skip backward"),
352 def pauseService(self):
353 self.session.nav.pause(1)
355 def unPauseService(self):
356 self.session.nav.pause(0)
358 def doSeek(self, dir, seektime):
359 service = self.session.nav.getCurrentService()
363 seekable = service.seek()
366 seekable.seekRelative(dir, 90 * seektime)
369 self.doSeek(+1, 60000)
372 self.doSeek(-1, 60000)
374 class InfoBarInstantRecord:
375 """Instant Record - handles the instantRecord action in order to
376 start/stop instant records"""
378 self["InstnantRecordActions"] = HelpableActionMap(self, "InfobarInstantRecord",
380 "instantRecord": (self.instantRecord, "Instant Record..."),
382 self.recording = None
384 def stopCurrentRecording(self):
385 self.session.nav.RecordTimer.removeEntry(self.recording)
386 self.recording = None
388 def startInstantRecording(self):
389 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
391 # try to get event info
394 service = self.session.nav.getCurrentService()
395 info = service.info()
396 ev = info.getEvent(0)
401 # fix me, description.
402 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
403 self.recording.dontSave = True
405 def recordQuestionCallback(self, answer):
409 if self.recording != None:
410 self.stopCurrentRecording()
412 self.startInstantRecording()
414 def instantRecord(self):
416 stat = os.stat("/hdd/movies")
418 self.session.open(MessageBox, "No HDD found!")
421 if self.recording != None:
422 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Do you want to stop the current\n(instant) recording?")
424 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Start recording?")
426 from Screens.AudioSelection import AudioSelection
428 class InfoBarAudioSelection:
430 self["AudioSelectionAction"] = HelpableActionMap(self, "InfobarAudioSelectionActions",
432 "audioSelection": (self.audioSelection, "Audio Options..."),
435 def audioSelection(self):
436 service = self.session.nav.getCurrentService()
437 audio = service.audioTracks()
438 n = audio.getNumberOfTracks()
440 self.session.open(AudioSelection, audio)