X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/21ad640445f0812c5fa954015a3389e4824dc5e1..562f08b0d0d53a3b79516dff47a7eea7ba971d17:/lib/python/Screens/InfoBarGenerics.py?ds=sidebyside diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index a659b5be..7a2f985e 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -5,19 +5,17 @@ from Components.Label import * from Components.ProgressBar import * from Components.config import configfile, configsequencearg from Components.config import config, configElement, ConfigSubsection, configSequence -from ChannelSelection import ChannelSelection +from ChannelSelection import ChannelSelection, BouquetSelector from Components.Pixmap import Pixmap, PixmapConditional from Components.BlinkingPixmap import BlinkingPixmapConditional from Components.ServiceName import ServiceName -from Components.EventInfo import EventInfo +from Components.EventInfo import EventInfo, EventInfoProgress from ServiceReference import ServiceReference from EpgSelection import EPGSelection from Screens.MessageBox import MessageBox -from Screens.Volume import Volume -from Screens.Mute import Mute from Screens.Dish import Dish from Screens.Standby import Standby from Screens.EventView import EventView @@ -33,71 +31,15 @@ from enigma import * import time import os +from Components.config import config, currentConfigSelectionElement + # hack alert! from Menu import MainMenu, mdom -class InfoBarVolumeControl: - """Volume control, handles volUp, volDown, volMute actions and display - a corresponding dialog""" - def __init__(self): - config.audio = ConfigSubsection() - config.audio.volume = configElement("config.audio.volume", configSequence, [100], configsequencearg.get("INTEGER", (0, 100))) - - self["VolumeActions"] = ActionMap( ["InfobarVolumeActions"] , - { - "volumeUp": self.volUp, - "volumeDown": self.volDown, - "volumeMute": self.volMute, - }) - - self.volumeDialog = self.session.instantiateDialog(Volume) - self.muteDialog = self.session.instantiateDialog(Mute) - - self.hideVolTimer = eTimer() - self.hideVolTimer.timeout.get().append(self.volHide) - - vol = config.audio.volume.value[0] - self.volumeDialog.setValue(vol) - eDVBVolumecontrol.getInstance().setVolume(vol, vol) - - def volSave(self): - config.audio.volume.value = eDVBVolumecontrol.getInstance().getVolume() - config.audio.volume.save() - - def volUp(self): - if (eDVBVolumecontrol.getInstance().isMuted()): - self.volMute() - eDVBVolumecontrol.getInstance().volumeUp() - self.volumeDialog.instance.show() - self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume()) - self.volSave() - self.hideVolTimer.start(3000, True) - - def volDown(self): - if (eDVBVolumecontrol.getInstance().isMuted()): - self.volMute() - eDVBVolumecontrol.getInstance().volumeDown() - self.volumeDialog.instance.show() - self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume()) - self.volSave() - self.hideVolTimer.start(3000, True) - - def volHide(self): - self.volumeDialog.instance.hide() - - def volMute(self): - eDVBVolumecontrol.getInstance().volumeToggleMute() - self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume()) - - if (eDVBVolumecontrol.getInstance().isMuted()): - self.muteDialog.instance.show() - else: - self.muteDialog.instance.hide() - class InfoBarDish: def __init__(self): self.dishDialog = self.session.instantiateDialog(Dish) - self.onShown.append(self.dishDialog.instance.hide) + self.onShown.append(self.dishDialog.instance.show) class InfoBarShowHide: """ InfoBar show/hide control, accepts toggleShow and hide actions, might start @@ -257,7 +199,7 @@ class InfoBarNumberZap: def keyNumberGlobal(self, number): # print "You pressed number " + str(number) if number == 0: - self.session.nav.zapLast() + self.servicelist.recallPrevService() self.instance.show() self.show() else: @@ -292,17 +234,20 @@ class InfoBarNumberZap: bouquetlist = serviceHandler.list(bouquet) if not bouquetlist is None: while number: - bouquet = bouquetlist.getNext() + bouquet = self.servicelist.appendDVBTypes(bouquetlist.getNext()) if not bouquet.valid(): #check end of list break if ((bouquet.flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory): continue service, number = self.searchNumberHelper(serviceHandler, number, bouquet) if not service is None: - self.session.nav.playService(service) #play service if self.servicelist.getRoot() != bouquet: #already in correct bouquet? - self.servicelist.setRoot(bouquet) + self.servicelist.clearPath() + if self.servicelist.bouquet_root != bouquet: + self.servicelist.enterPath(self.servicelist.bouquet_root) + self.servicelist.enterPath(bouquet) self.servicelist.setCurrentSelection(service) #select the service in servicelist + self.servicelist.zap() class InfoBarChannelSelection: """ ChannelSelection - handles the channelSelection dialog and the initial @@ -358,11 +303,77 @@ class InfoBarEPG: def __init__(self): self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions", { - "showEPGList": (self.showEPGList, _("show EPG...")), + "showEPGList": (self.showEPG, _("show EPG...")), }) + def showEPG(self): + if currentConfigSelectionElement(config.usage.epgtoggle) == "yes": + self.openSingleServiceEPG() + else: + self.showEPGList() + def showEPGList(self): + bouquets = self.servicelist.getBouquetList() + if bouquets is None: + cnt = 0 + else: + cnt = len(bouquets) + if cnt > 1: # show bouquet list + self.session.open(BouquetSelector, bouquets, self.openBouquetEPG) + elif cnt == 1: # add to only one existing bouquet + self.openBouquetEPG(bouquets[0][1]) + else: #no bouquets so we open single epg + self.openSingleEPGSelector(self.session.nav.getCurrentlyPlayingServiceReference()) + + def bouquetEPGCallback(self, info): + if info: + self.openSingleServiceEPG() + + def singleEPGCallback(self, info): + if info: + self.showEPGList() + + def openEventView(self): + try: + self.epglist = [ ] + service = self.session.nav.getCurrentService() + info = service.info() + ptr=info.getEvent(0) + if ptr: + self.epglist.append(ptr) + ptr=info.getEvent(1) + if ptr: + self.epglist.append(ptr) + if len(self.epglist) > 0: + self.session.open(EventView, self.epglist[0], ServiceReference(ref), self.eventViewCallback) + except: + pass + + def openSingleServiceEPG(self): ref=self.session.nav.getCurrentlyPlayingServiceReference() + ptr=eEPGCache.getInstance() + if ptr.startTimeQuery(ref) != -1: + self.session.openWithCallback(self.singleEPGCallback, EPGSelection, ref) + else: # try to show now/next + print 'no epg for service', ref.toString() + + + def openBouquetEPG(self, bouquet): + ptr=eEPGCache.getInstance() + services = [ ] + servicelist = eServiceCenter.getInstance().list(bouquet) + if not servicelist is None: + while True: + service = servicelist.getNext() + if not service.valid(): #check if end of list + break + if service.flags: #ignore non playable services + continue + services.append(ServiceReference(service)) + if len(services): + self.session.openWithCallback(self.bouquetEPGCallback, EPGSelection, services) + + def openSingleEPGSelector(self, ref): ptr=eEPGCache.getInstance() if ptr.startTimeQuery(ref) != -1: self.session.open(EPGSelection, ref) @@ -383,7 +394,7 @@ class InfoBarEPG: except: pass - def eventViewCallback(self, setEvent, val): #used for now/next displaying + def eventViewCallback(self, setEvent, setService, val): #used for now/next displaying if len(self.epglist) > 1: tmp = self.epglist[0] self.epglist[0]=self.epglist[1] @@ -446,12 +457,15 @@ class InfoBarEvent: self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration) self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration) + self["Now_ProgressBar"] = EventInfoProgress(self.session.nav, EventInfo.Now) + class InfoBarServiceName: def __init__(self): self["ServiceName"] = ServiceName(self.session.nav) -class InfoBarPVR: - +class InfoBarSeek: + """handles actions like seeking, pause""" + # ispause, isff, issm, skip SEEK_STATE_PLAY = (0, 0, 0, 0) SEEK_STATE_PAUSE = (1, 0, 0, 0) @@ -471,9 +485,8 @@ class InfoBarPVR: SEEK_STATE_SM_QUARTER = (0, 0, 4, 0) SEEK_STATE_SM_EIGHTH = (0, 0, 8, 0) - """handles PVR specific actions like seeking, pause""" def __init__(self): - self["PVRActions"] = HelpableActionMap(self, "InfobarPVRActions", + self["SeekActions"] = HelpableActionMap(self, "InfobarSeekActions", { "pauseService": (self.pauseService, "pause"), "unPauseService": (self.unPauseService, "continue"), @@ -482,9 +495,6 @@ class InfoBarPVR: "seekFwdUp": (self.seekFwdUp, "skip forward"), "seekBack": (self.seekBack, "skip backward"), "seekBackUp": (self.seekBackUp, "skip backward"), - - "up": (self.showMovies, "movie list"), - "down": (self.showMovies, "movie list") }) self.seekstate = self.SEEK_STATE_PLAY @@ -658,6 +668,59 @@ class InfoBarPVR: def rwdSeekTo(self, minutes): self.fwdSeekTo(0 - minutes) +class InfoBarShowMovies: + + # i don't really like this class. + # it calls a not further specified "movie list" on up/down/movieList, + # so this is not moe than an action map + def __init__(self): + self["MovieListActions"] = HelpableActionMap(self, "InfobarMovieListActions", + { + "movieList": (self.showMovies, "movie list"), + "up": (self.showMovies, "movie list"), + "down": (self.showMovies, "movie list") + }) + +class InfoBarTimeshift: + def __init__(self): + self["TimeshiftActions"] = HelpableActionMap(self, "InfobarTimeshiftActions", + { + "timeshiftStart": (self.startTimeshift, "start timeshift "), + "timeshiftStop": (self.stopTimeshift, "stop timeshift") + }) + self.tshack = 0 + + def getTimeshift(self): + service = self.session.nav.getCurrentService() + return service.timeshift() + + def startTimeshift(self): + # TODO: check for harddisk! (or do this in the interface? would make + # more sense... for example radio could be timeshifted in memory, + # and the decision can't be made here) + print "enable timeshift" + ts = self.getTimeshift() + if ts is None: + self.session.open(MessageBox, _("Timeshift not possible!"), MessageBox.TYPE_ERROR) + print "no ts interface" + return + print "ok, timeshift enabled" + if self.tshack == 0: + ts.startTimeshift() + self.tshack = 1 + else: + pauseable = self.session.nav.getCurrentService().pause() + pauseable.pause() # switch to record + + def stopTimeshift(self): + print "disable timeshift" + ts = self.getTimeshift() + if ts is None: + return + ts.stopTimeshift() + self.tshack = 0 + + from RecordTimer import parseEvent class InfoBarInstantRecord: @@ -693,7 +756,17 @@ class InfoBarInstantRecord: if event is not None: data = parseEvent(event) - data = (data[0], data[1] + 3600 * 10, data[2], data[3], data[4]) + begin = data[0] + if begin < time.time(): + begin = time.time() + + end = data[1] + if end < begin: + end = begin + + end += 3600 * 10 + + data = (begin, end, data[2], data[3], data[4]) else: data = (time.time(), time.time() + 3600 * 10, "instant record", "", None) @@ -814,6 +887,7 @@ class InfoBarAdditionalInfo: self.hideSubServiceIndication() def checkDolby(self, service): + # FIXME dolby = False audio = service.audioTracks() if audio is not None: