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["channel"] = Label(_("Channel:"))
161 self["number"] = Label(self.field)
163 self["actions"] = NumberActionMap( [ "SetupActions" ],
167 "1": self.keyNumberGlobal,
168 "2": self.keyNumberGlobal,
169 "3": self.keyNumberGlobal,
170 "4": self.keyNumberGlobal,
171 "5": self.keyNumberGlobal,
172 "6": self.keyNumberGlobal,
173 "7": self.keyNumberGlobal,
174 "8": self.keyNumberGlobal,
175 "9": self.keyNumberGlobal,
176 "0": self.keyNumberGlobal
179 self.Timer = eTimer()
180 self.Timer.timeout.get().append(self.keyOK)
181 self.Timer.start(3000)
183 class InfoBarPowerKey:
184 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
187 self.powerKeyTimer = eTimer()
188 self.powerKeyTimer.timeout.get().append(self.powertimer)
189 self["PowerKeyActions"] = HelpableActionMap(self, "PowerKeyActions",
191 "powerdown": self.powerdown,
192 "powerup": self.powerup,
193 "discreteStandby": (self.standby, "Go standby"),
194 "discretePowerOff": (self.quit, "Go to deep standby"),
197 def powertimer(self):
198 print "PowerOff - Now!"
202 self.standbyblocked = 0
203 self.powerKeyTimer.start(3000)
206 self.powerKeyTimer.stop()
207 if self.standbyblocked == 0:
208 self.standbyblocked = 1
212 self.session.open(Standby, self)
218 class InfoBarNumberZap:
219 """ Handles an initial number for NumberZapping """
221 self["NumberZapActions"] = NumberActionMap( [ "NumberZapActions"],
223 "1": self.keyNumberGlobal,
224 "2": self.keyNumberGlobal,
225 "3": self.keyNumberGlobal,
226 "4": self.keyNumberGlobal,
227 "5": self.keyNumberGlobal,
228 "6": self.keyNumberGlobal,
229 "7": self.keyNumberGlobal,
230 "8": self.keyNumberGlobal,
231 "9": self.keyNumberGlobal,
232 "0": self.keyNumberGlobal,
235 def keyNumberGlobal(self, number):
236 # print "You pressed number " + str(number)
237 self.session.openWithCallback(self.numberEntered, NumberZap, number)
239 def numberEntered(self, retval):
240 # print self.servicelist
242 self.servicelist.zapToNumber(retval)
244 class InfoBarChannelSelection:
245 """ ChannelSelection - handles the channelSelection dialog and the initial
246 channelChange actions which open the channelSelection dialog """
249 self.servicelist = self.session.instantiateDialog(ChannelSelection)
251 self["ChannelSelectActions"] = HelpableActionMap(self, "InfobarChannelSelection",
253 "switchChannelUp": self.switchChannelUp,
254 "switchChannelDown": self.switchChannelDown,
255 "zapUp": (self.zapUp, _("next channel")),
256 "zapDown": (self.zapDown, _("previous channel")),
259 def switchChannelUp(self):
260 self.servicelist.moveUp()
261 self.session.execDialog(self.servicelist)
263 def switchChannelDown(self):
264 self.servicelist.moveDown()
265 self.session.execDialog(self.servicelist)
268 self.servicelist.moveUp()
269 self.servicelist.zap()
272 self.servicelist.moveDown()
273 self.servicelist.zap()
276 """ Handles a menu action, to open the (main) menu """
278 self["MenuActions"] = HelpableActionMap(self, "InfobarMenuActions",
280 "mainMenu": (self.mainMenu, "Enter main menu..."),
284 print "loading mainmenu XML..."
285 menu = mdom.childNodes[0]
286 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
287 self.session.open(MainMenu, menu, menu.childNodes)
290 """ EPG - Opens an EPG list when the showEPGList action fires """
292 self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions",
294 "showEPGList": (self.showEPGList, _("show EPG...")),
297 def showEPGList(self):
298 ref=self.session.nav.getCurrentlyPlayingServiceReference()
299 ptr=eEPGCache.getInstance()
300 if ptr.startTimeQuery(ref) != -1:
301 self.session.open(EPGSelection, ref)
302 else: # try to show now/next
303 print 'no epg for service', ref.toString()
306 service = self.session.nav.getCurrentService()
307 info = service.info()
310 self.epglist.append(ptr)
313 self.epglist.append(ptr)
314 if len(self.epglist) > 0:
315 self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
319 def eventViewCallback(self, setEvent, val): #used for now/next displaying
320 if len(self.epglist) > 1:
321 tmp = self.epglist[0]
322 self.epglist[0]=self.epglist[1]
324 setEvent(self.epglist[0])
327 """provides a current/next event info display"""
329 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
330 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
332 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
333 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
335 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
336 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
338 class InfoBarServiceName:
340 self["ServiceName"] = ServiceName(self.session.nav)
343 """handles PVR specific actions like seeking, pause"""
345 self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions",
347 "pauseService": (self.pauseService, "pause"),
348 "unPauseService": (self.unPauseService, "continue"),
350 "seekFwd": (self.seekFwd, "skip forward"),
351 "seekBack": (self.seekBack, "skip backward"),
354 def pauseService(self):
355 self.session.nav.pause(1)
357 def unPauseService(self):
358 self.session.nav.pause(0)
360 def doSeek(self, dir, seektime):
361 service = self.session.nav.getCurrentService()
365 seekable = service.seek()
368 seekable.seekRelative(dir, 90 * seektime)
371 self.doSeek(+1, 60000)
374 self.doSeek(-1, 60000)
376 class InfoBarInstantRecord:
377 """Instant Record - handles the instantRecord action in order to
378 start/stop instant records"""
380 self["InstnantRecordActions"] = HelpableActionMap(self, "InfobarInstantRecord",
382 "instantRecord": (self.instantRecord, "Instant Record..."),
384 self.recording = None
386 def stopCurrentRecording(self):
387 self.session.nav.RecordTimer.removeEntry(self.recording)
388 self.recording = None
390 def startInstantRecording(self):
391 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
393 # try to get event info
396 service = self.session.nav.getCurrentService()
397 info = service.info()
398 ev = info.getEvent(0)
403 # fix me, description.
404 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
405 self.recording.dontSave = True
407 def recordQuestionCallback(self, answer):
411 if self.recording != None:
412 self.stopCurrentRecording()
414 self.startInstantRecording()
416 def instantRecord(self):
418 stat = os.stat("/hdd/movies")
420 self.session.open(MessageBox, "No HDD found!")
423 if self.recording != None:
424 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Do you want to stop the current\n(instant) recording?")
426 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Start recording?")
428 from Screens.AudioSelection import AudioSelection
430 class InfoBarAudioSelection:
432 self["AudioSelectionAction"] = HelpableActionMap(self, "InfobarAudioSelectionActions",
434 "audioSelection": (self.audioSelection, "Audio Options..."),
437 def audioSelection(self):
438 service = self.session.nav.getCurrentService()
439 audio = service.audioTracks()
440 n = audio.getNumberOfTracks()
442 self.session.open(AudioSelection, audio)