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 self.close(int(self["number"].getText()))
143 def keyNumberGlobal(self, number):
144 self.Timer.start(3000) #reset timer
145 self.field = self.field + str(number)
146 self["number"].setText(self.field)
147 if len(self.field) >= 4:
150 def __init__(self, session, number):
151 Screen.__init__(self, session)
152 self.field = str(number)
154 self["number"] = Label(self.field)
156 self["actions"] = NumberActionMap( [ "SetupActions" ],
160 "1": self.keyNumberGlobal,
161 "2": self.keyNumberGlobal,
162 "3": self.keyNumberGlobal,
163 "4": self.keyNumberGlobal,
164 "5": self.keyNumberGlobal,
165 "6": self.keyNumberGlobal,
166 "7": self.keyNumberGlobal,
167 "8": self.keyNumberGlobal,
168 "9": self.keyNumberGlobal,
169 "0": self.keyNumberGlobal
172 self.Timer = eTimer()
173 self.Timer.timeout.get().append(self.keyOK)
174 self.Timer.start(3000)
176 class InfoBarPowerKey:
177 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
180 self.powerKeyTimer = eTimer()
181 self.powerKeyTimer.timeout.get().append(self.powertimer)
182 self["PowerKeyActions"] = ActionMap( ["PowerKeyActions"],
184 "powerdown": self.powerdown,
185 "powerup": self.powerup,
188 def powertimer(self):
189 print "PowerOff - Now!"
193 self.standbyblocked = 0
194 self.powerKeyTimer.start(3000)
197 self.powerKeyTimer.stop()
198 if self.standbyblocked == 0:
199 self.standbyblocked = 1
200 self.session.open(Standby, self)
205 class InfoBarNumberZap:
206 """ Handles an initial number for NumberZapping """
208 self["NumberZapActions"] = NumberActionMap( [ "NumberZapActions"],
210 "1": self.keyNumberGlobal,
211 "2": self.keyNumberGlobal,
212 "3": self.keyNumberGlobal,
213 "4": self.keyNumberGlobal,
214 "5": self.keyNumberGlobal,
215 "6": self.keyNumberGlobal,
216 "7": self.keyNumberGlobal,
217 "8": self.keyNumberGlobal,
218 "9": self.keyNumberGlobal,
219 "0": self.keyNumberGlobal,
222 def keyNumberGlobal(self, number):
223 # print "You pressed number " + str(number)
224 self.session.openWithCallback(self.numberEntered, NumberZap, number)
226 def numberEntered(self, retval):
227 # print self.servicelist
229 self.servicelist.zapToNumber(retval)
231 class InfoBarChannelSelection:
232 """ ChannelSelection - handles the channelSelection dialog and the initial
233 channelChange actions which open the channelSelection dialog """
236 self.servicelist = self.session.instantiateDialog(ChannelSelection)
238 self["ChannelSelectActions"] = ActionMap( ["InfobarChannelSelection"],
240 "switchChannelUp": self.switchChannelUp,
241 "switchChannelDown": self.switchChannelDown,
243 "zapDown": self.zapDown,
246 def switchChannelUp(self):
247 self.servicelist.moveUp()
248 self.session.execDialog(self.servicelist)
250 def switchChannelDown(self):
251 self.servicelist.moveDown()
252 self.session.execDialog(self.servicelist)
255 self.servicelist.moveUp()
256 self.servicelist.zap()
259 self.servicelist.moveDown()
260 self.servicelist.zap()
263 """ Handles a menu action, to open the (main) menu """
265 self["MenuActions"] = ActionMap( [ "InfobarMenuActions" ],
267 "mainMenu": self.mainMenu,
271 print "loading mainmenu XML..."
272 menu = mdom.childNodes[0]
273 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
274 self.session.open(MainMenu, menu, menu.childNodes)
277 """ EPG - Opens an EPG list when the showEPGList action fires """
279 self["EPGActions"] = ActionMap( [ "InfobarEPGActions" ],
281 "showEPGList": self.showEPGList,
284 def showEPGList(self):
285 ref=self.session.nav.getCurrentlyPlayingServiceReference()
286 ptr=eEPGCache.getInstance()
287 if ptr.startTimeQuery(ref) != -1:
288 self.session.open(EPGSelection, ref)
289 else: # try to show now/next
290 print 'no epg for service', ref.toString()
293 service = self.session.nav.getCurrentService()
294 info = service.info()
297 self.epglist.append(ptr)
300 self.epglist.append(ptr)
301 if len(self.epglist) > 0:
302 self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback)
306 def eventViewCallback(self, setEvent, val): #used for now/next displaying
307 if len(self.epglist) > 1:
308 tmp = self.epglist[0]
309 self.epglist[0]=self.epglist[1]
311 setEvent(self.epglist[0])
314 """provides a current/next event info display"""
316 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
317 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
319 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
320 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
322 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
323 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
325 class InfoBarServiceName:
327 self["ServiceName"] = ServiceName(self.session.nav)
330 """handles PVR specific actions like seeking, pause"""
332 self["PVRActions"] = ActionMap( [ "InfobarPVRActions" ],
334 "pauseService": self.pauseService,
335 "unPauseService": self.unPauseService,
337 "seekFwd": self.seekFwd,
338 "seekBack": self.seekBack,
341 def pauseService(self):
342 self.session.nav.pause(1)
344 def unPauseService(self):
345 self.session.nav.pause(0)
347 def doSeek(self, dir, seektime):
348 service = self.session.nav.getCurrentService()
352 seekable = service.seek()
355 seekable.seekRelative(dir, 90 * seektime)
358 self.doSeek(+1, 60000)
361 self.doSeek(-1, 60000)
363 class InfoBarInstantRecord:
364 """Instant Record - handles the instantRecord action in order to
365 start/stop instant records"""
367 self["InstnantRecordActions"] = ActionMap( [ "InfobarInstantRecord" ],
369 "instantRecord": self.instantRecord,
371 self.recording = None
373 def stopCurrentRecording(self):
374 self.session.nav.RecordTimer.removeEntry(self.recording)
375 self.recording = None
377 def startInstantRecording(self):
378 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
380 # try to get event info
383 service = self.session.nav.getCurrentService()
384 info = service.info()
385 ev = info.getEvent(0)
390 # fix me, description.
391 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
392 self.recording.dontSave = True
394 def recordQuestionCallback(self, answer):
398 if self.recording != None:
399 self.stopCurrentRecording()
401 self.startInstantRecording()
403 def instantRecord(self):
405 stat = os.stat("/hdd/movies")
407 self.session.open(MessageBox, "No HDD found!")
410 if self.recording != None:
411 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Do you want to stop the current\n(instant) recording?")
413 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Start recording?")
415 from Screens.AudioSelection import AudioSelection
417 class InfoBarAudioSelection:
419 self["AudioSelectionAction"] = ActionMap( [ "InfobarAudioSelectionActions" ],
421 "audioSelection": self.audioSelection,
424 def audioSelection(self):
425 service = self.session.nav.getCurrentService()
426 audio = service.audioTracks()
427 n = audio.getNumberOfTracks()
429 self.session.open(AudioSelection, audio)