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 EpgSelection import EPGSelection
14 from Screens.MessageBox import MessageBox
15 from Screens.Volume import Volume
16 from Screens.Mute import Mute
17 from Screens.Standby import Standby
19 #from enigma import eTimer, eDVBVolumecontrol, quitMainloop
25 from Menu import MainMenu, mdom
27 class InfoBarVolumeControl:
28 """Volume control, handles volUp, volDown, volMute actions and display
29 a corresponding dialog"""
31 config.audio = ConfigSubsection()
32 config.audio.volume = configElement("config.audio.volume", configSequence, [5], configsequencearg.get("INTEGER", (0, 100)))
34 self["VolumeActions"] = ActionMap( ["InfobarVolumeActions"] ,
36 "volumeUp": self.volUp,
37 "volumeDown": self.volDown,
38 "volumeMute": self.volMute,
41 self.volumeDialog = self.session.instantiateDialog(Volume)
42 self.muteDialog = self.session.instantiateDialog(Mute)
44 self.hideVolTimer = eTimer()
45 self.hideVolTimer.timeout.get().append(self.volHide)
47 vol = config.audio.volume.value[0]
48 self.volumeDialog.setValue(vol)
49 eDVBVolumecontrol.getInstance().setVolume(vol, vol)
52 config.audio.volume.value = eDVBVolumecontrol.getInstance().getVolume()
53 config.audio.volume.save()
56 eDVBVolumecontrol.getInstance().volumeUp()
57 self.volumeDialog.instance.show()
58 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
60 self.hideVolTimer.start(3000)
63 eDVBVolumecontrol.getInstance().volumeDown()
64 self.volumeDialog.instance.show()
65 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
67 self.hideVolTimer.start(3000)
70 self.volumeDialog.instance.hide()
73 eDVBVolumecontrol.getInstance().volumeToggleMute()
74 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
76 if (eDVBVolumecontrol.getInstance().isMuted()):
77 self.muteDialog.instance.show()
79 self.muteDialog.instance.hide()
81 class InfoBarShowHide:
82 """ InfoBar show/hide control, accepts toggleShow and hide actions, might start
90 self["ShowHideActions"] = ActionMap( ["InfobarShowHideActions"] ,
92 "toggleShow": self.toggleShow,
96 self.state = self.STATE_HIDDEN
98 self.hideTimer = eTimer()
99 self.hideTimer.timeout.get().append(self.doTimerHide)
100 #self.hideTimer.start(1000)
105 def doTimerHide(self):
106 if self.state == self.STATE_SHOWN:
108 self.state = self.STATE_HIDDEN
110 def toggleShow(self):
111 if self.state == self.STATE_SHOWN:
113 #pls check animation support, sorry
115 self.state = self.STATE_HIDDEN
119 self.state = self.STATE_SHOWN
120 #TODO: make it customizable
121 self.hideTimer.start(5000)
124 self.instance.m_animation.startMoveAnimation(ePoint(0, 600), ePoint(0, 380), 100)
125 self.state = self.STATE_SHOWN
128 self.instance.m_animation.startMoveAnimation(ePoint(0, 380), ePoint(0, 600), 100)
129 self.state = self.STATE_HIDDEN
131 class NumberZap(Screen):
138 print "do the action here"
141 def keyNumberGlobal(self, number):
142 self.Timer.start(3000) #reset timer
143 self.field = self.field + str(number)
144 self["number"].setText(self.field)
145 if len(self.field) >= 4:
148 def __init__(self, session, number):
149 Screen.__init__(self, session)
150 self.field = str(number)
152 self["number"] = Label(self.field)
154 self["actions"] = NumberActionMap( [ "SetupActions" ],
158 "1": self.keyNumberGlobal,
159 "2": self.keyNumberGlobal,
160 "3": self.keyNumberGlobal,
161 "4": self.keyNumberGlobal,
162 "5": self.keyNumberGlobal,
163 "6": self.keyNumberGlobal,
164 "7": self.keyNumberGlobal,
165 "8": self.keyNumberGlobal,
166 "9": self.keyNumberGlobal,
167 "0": self.keyNumberGlobal
170 self.Timer = eTimer()
171 self.Timer.timeout.get().append(self.keyOK)
172 self.Timer.start(3000)
174 class InfoBarPowerKey:
175 """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
178 self.powerKeyTimer = eTimer()
179 self.powerKeyTimer.timeout.get().append(self.powertimer)
180 self["PowerKeyActions"] = ActionMap( ["PowerKeyActions"],
182 "powerdown": self.powerdown,
183 "powerup": self.powerup,
186 def powertimer(self):
187 print "PowerOff - Now!"
191 self.standbyblocked = 0
192 self.powerKeyTimer.start(3000)
195 self.powerKeyTimer.stop()
196 if self.standbyblocked == 0:
197 self.standbyblocked = 1
198 self.session.open(Standby, self)
203 class InfoBarNumberZap:
204 """ Handles an initial number for NumberZapping """
206 self["NumberZapActions"] = NumberActionMap( [ "NumberZapActions"],
208 "1": self.keyNumberGlobal,
209 "2": self.keyNumberGlobal,
210 "3": self.keyNumberGlobal,
211 "4": self.keyNumberGlobal,
212 "5": self.keyNumberGlobal,
213 "6": self.keyNumberGlobal,
214 "7": self.keyNumberGlobal,
215 "8": self.keyNumberGlobal,
216 "9": self.keyNumberGlobal,
217 "0": self.keyNumberGlobal,
220 def keyNumberGlobal(self, number):
221 print "You pressed number " + str(number)
222 self.session.open(NumberZap, number)
224 class InfoBarChannelSelection:
225 """ ChannelSelection - handles the channelSelection dialog and the initial
226 channelChange actions which open the channelSelection dialog """
229 self.servicelist = self.session.instantiateDialog(ChannelSelection)
231 self["ChannelSelectActions"] = ActionMap( ["InfobarChannelSelection"],
233 "switchChannelUp": self.switchChannelUp,
234 "switchChannelDown": self.switchChannelDown,
236 "zapDown": self.zapDown,
239 def switchChannelUp(self):
240 self.servicelist.moveUp()
241 self.session.execDialog(self.servicelist)
243 def switchChannelDown(self):
244 self.servicelist.moveDown()
245 self.session.execDialog(self.servicelist)
248 self.servicelist.moveUp()
249 self.servicelist.zap()
252 self.servicelist.moveDown()
253 self.servicelist.zap()
256 """ Handles a menu action, to open the (main) menu """
258 self["MenuActions"] = ActionMap( [ "InfobarMenuActions" ],
260 "mainMenu": self.mainMenu,
264 print "loading mainmenu XML..."
265 menu = mdom.childNodes[0]
266 assert menu.tagName == "menu", "root element in menu must be 'menu'!"
267 self.session.open(MainMenu, menu, menu.childNodes)
270 """ EPG - Opens an EPG list when the showEPGList action fires """
272 self["EPGActions"] = ActionMap( [ "InfobarEPGActions" ],
274 "showEPGList": self.showEPGList,
277 def showEPGList(self):
278 ref=self.session.nav.getCurrentlyPlayingServiceReference()
279 ptr=eEPGCache.getInstance()
280 if ptr.startTimeQuery(ref) != -1:
281 self.session.open(EPGSelection, ref)
283 print 'no epg for service', ref.toString()
286 """provides a current/next event info display"""
288 self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
289 self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
291 self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
292 self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
294 self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
295 self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
297 class InfoBarServiceName:
299 self["ServiceName"] = ServiceName(self.session.nav)
302 """handles PVR specific actions like seeking, pause"""
304 self["PVRActions"] = ActionMap( [ "InfobarPVRActions" ],
306 "pauseService": self.pauseService,
307 "unPauseService": self.unPauseService,
309 "seekFwd": self.seekFwd,
310 "seekBack": self.seekBack,
313 def pauseService(self):
314 self.session.nav.pause(1)
316 def unPauseService(self):
317 self.session.nav.pause(0)
319 def doSeek(self, dir, seektime):
320 service = self.session.nav.getCurrentService()
324 seekable = service.seek()
327 seekable.seekRelative(dir, 90 * seektime)
330 self.doSeek(+1, 60000)
333 self.doSeek(-1, 60000)
335 class InfoBarInstantRecord:
336 """Instant Record - handles the instantRecord action in order to
337 start/stop instant records"""
339 self["InstnantRecordActions"] = ActionMap( [ "InfobarInstantRecord" ],
341 "instantRecord": self.instantRecord,
343 self.recording = None
345 def stopCurrentRecording(self):
346 self.session.nav.RecordTimer.removeEntry(self.recording)
347 self.recording = None
349 def startInstantRecording(self):
350 serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
352 # try to get event info
355 service = self.session.nav.getCurrentService()
356 info = service.info()
357 ev = info.getEvent(0)
362 # fix me, description.
363 self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record")
365 def recordQuestionCallback(self, answer):
369 if self.recording != None:
370 self.stopCurrentRecording()
372 self.startInstantRecording()
374 def instantRecord(self):
375 if self.recording != None:
376 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Do you want to stop the current\n(instant) recording?")
378 self.session.openWithCallback(self.recordQuestionCallback, MessageBox, "Start recording?")
380 from Screens.AudioSelection import AudioSelection
382 class InfoBarAudioSelection:
384 self["AudioSelectionAction"] = ActionMap( [ "InfobarAudioSelectionActions" ],
386 "audioSelection": self.audioSelection,
389 def audioSelection(self):
390 service = self.session.nav.getCurrentService()
391 audio = service.audioTracks()
392 n = audio.getNumberOfTracks()
394 self.session.open(AudioSelection, audio)