1 from Screen import Screen
2 from Components.ActionMap import ActionMap
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_HIDDEN
101 self.hideTimer = eTimer()
102 self.hideTimer.timeout.get().append(self.doTimerHide)
103 #self.hideTimer.start(1000)
108 def doTimerHide(self):
109 if self.state == self.STATE_SHOWN:
111 self.state = self.STATE_HIDDEN
113 def toggleShow(self):
114 if self.state == self.STATE_SHOWN:
116 #pls check animation support, sorry
118 self.state = self.STATE_HIDDEN
122 self.state = self.STATE_SHOWN
123 #TODO: make it customizable
124 self.hideTimer.start(5000)
127 self.instance.m_animation.startMoveAnimation(ePoint(0, 600), ePoint(0, 380), 100)
128 self.state = self.STATE_SHOWN
131 self.instance.m_animation.startMoveAnimation(ePoint(0, 380), ePoint(0, 600), 100)
132 self.state = self.STATE_HIDDEN
134 class NumberZap(Screen):
141 print "do the action here"
144 def keyNumberGlobal(self, number):
145 self.Timer.start(3000) #reset timer
146 self.field = self.field + str(number)
147 self["number"].setText(self.field)
148 if len(self.field) >= 4:
151 def __init__(self, session, number):
152 Screen.__init__(self, session)
153 self.field = str(number)
155 self["number"] = Label(self.field)
157 self["actions"] = NumberActionMap( [ "SetupActions" ],
161 "1": self.keyNumberGlobal,
162 "2": self.keyNumberGlobal,
163 "3": self.keyNumberGlobal,
164 "4": self.keyNumberGlobal,
165 "5": self.keyNumberGlobal,
166 "6": self.keyNumberGlobal,
167 "7": self.keyNumberGlobal,
168 "8": self.keyNumberGlobal,
169 "9": self.keyNumberGlobal,
170 "0": self.keyNumberGlobal
173 self.Timer = eTimer()
174 self.Timer.timeout.get().append(self.keyOK)
175 self.Timer.start(3000)
177 class InfoBarPowerKey:
178 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
181 self.powerKeyTimer = eTimer()
182 self.powerKeyTimer.timeout.get().append(self.powertimer)
183 self["PowerKeyActions"] = ActionMap( ["PowerKeyActions"],
185 "powerdown": self.powerdown,
186 "powerup": self.powerup,
189 def powertimer(self):
190 print "PowerOff - Now!"
194 self.standbyblocked = 0
195 self.powerKeyTimer.start(3000)
198 self.powerKeyTimer.stop()
199 if self.standbyblocked == 0:
200 self.standbyblocked = 1
201 self.session.open(Standby, self)
206 class InfoBarNumberZap:
207 """ Handles an initial number for NumberZapping """
209 self["NumberZapActions"] = NumberActionMap( [ "NumberZapActions"],
211 "1": self.keyNumberGlobal,
212 "2": self.keyNumberGlobal,
213 "3": self.keyNumberGlobal,
214 "4": self.keyNumberGlobal,
215 "5": self.keyNumberGlobal,
216 "6": self.keyNumberGlobal,
217 "7": self.keyNumberGlobal,
218 "8": self.keyNumberGlobal,
219 "9": self.keyNumberGlobal,
220 "0": self.keyNumberGlobal,
223 def keyNumberGlobal(self, number):
224 print "You pressed number " + str(number)
225 self.session.open(NumberZap, number)
227 class InfoBarChannelSelection:
228 """ ChannelSelection - handles the channelSelection dialog and the initial
229 channelChange actions which open the channelSelection dialog """
232 self.servicelist = self.session.instantiateDialog(ChannelSelection)
234 self["ChannelSelectActions"] = ActionMap( ["InfobarChannelSelection"],
236 "switchChannelUp": self.switchChannelUp,
237 "switchChannelDown": self.switchChannelDown,
239 "zapDown": self.zapDown,
242 def switchChannelUp(self):
243 self.servicelist.moveUp()
244 self.session.execDialog(self.servicelist)
246 def switchChannelDown(self):
247 self.servicelist.moveDown()
248 self.session.execDialog(self.servicelist)
251 self.servicelist.moveUp()
252 self.servicelist.zap()
255 self.servicelist.moveDown()
256 self.servicelist.zap()
259 """ Handles a menu action, to open the (main) menu """
261 self["MenuActions"] = ActionMap( [ "InfobarMenuActions" ],
263 "mainMenu": self.mainMenu,
267 print "loading mainmenu XML..."
268 menu = mdom.childNodes[0]
269 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
270 self.session.open(MainMenu, menu, menu.childNodes)
273 """ EPG - Opens an EPG list when the showEPGList action fires """
275 self["EPGActions"] = ActionMap( [ "InfobarEPGActions" ],
277 "showEPGList": self.showEPGList,
280 def showEPGList(self):
281 ref=self.session.nav.getCurrentlyPlayingServiceReference()
282 ptr=eEPGCache.getInstance()
283 if ptr.startTimeQuery(ref) != -1:
284 self.session.open(EPGSelection, ref)
285 else: # try to show now/next
286 print 'no epg for service', ref.toString()
289 service = self.session.nav.getCurrentService()
290 info = service.info()
293 self.epglist.append(ptr)
296 self.epglist.append(ptr)
297 if len(self.epglist) > 0:
298 self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
302 def eventViewCallback(self, setEvent, val): #used for now/next displaying
303 if len(self.epglist) > 1:
304 tmp = self.epglist[0]
305 self.epglist[0]=self.epglist[1]
307 setEvent(self.epglist[0])
310 """provides a current/next event info display"""
312 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
313 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
315 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
316 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
318 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
319 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
321 class InfoBarServiceName:
323 self["ServiceName"] = ServiceName(self.session.nav)
326 """handles PVR specific actions like seeking, pause"""
328 self["PVRActions"] = ActionMap( [ "InfobarPVRActions" ],
330 "pauseService": self.pauseService,
331 "unPauseService": self.unPauseService,
333 "seekFwd": self.seekFwd,
334 "seekBack": self.seekBack,
337 def pauseService(self):
338 self.session.nav.pause(1)
340 def unPauseService(self):
341 self.session.nav.pause(0)
343 def doSeek(self, dir, seektime):
344 service = self.session.nav.getCurrentService()
348 seekable = service.seek()
351 seekable.seekRelative(dir, 90 * seektime)
354 self.doSeek(+1, 60000)
357 self.doSeek(-1, 60000)
359 class InfoBarInstantRecord:
360 """Instant Record - handles the instantRecord action in order to
361 start/stop instant records"""
363 self["InstnantRecordActions"] = ActionMap( [ "InfobarInstantRecord" ],
365 "instantRecord": self.instantRecord,
367 self.recording = None
369 def stopCurrentRecording(self):
370 self.session.nav.RecordTimer.removeEntry(self.recording)
371 self.recording = None
373 def startInstantRecording(self):
374 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
376 # try to get event info
379 service = self.session.nav.getCurrentService()
380 info = service.info()
381 ev = info.getEvent(0)
386 # fix me, description.
387 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
388 self.recording.dontSave = True
390 def recordQuestionCallback(self, answer):
394 if self.recording != None:
395 self.stopCurrentRecording()
397 self.startInstantRecording()
399 def instantRecord(self):
401 stat = os.stat("/hdd/movies")
403 self.session.open(MessageBox, "No HDD found!")
406 if self.recording != None:
407 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Do you want to stop the current\n(instant) recording?")
409 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Start recording?")
411 from Screens.AudioSelection import AudioSelection
413 class InfoBarAudioSelection:
415 self["AudioSelectionAction"] = ActionMap( [ "InfobarAudioSelectionActions" ],
417 "audioSelection": self.audioSelection,
420 def audioSelection(self):
421 service = self.session.nav.getCurrentService()
422 audio = service.audioTracks()
423 n = audio.getNumberOfTracks()
425 self.session.open(AudioSelection, audio)