X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/9cdb47a4f3b391239c100081b85dc2620ec4b4d1..ade1717b033340b8e644ebd1856e2c1220b2d7c4:/lib/python/Screens/InfoBarGenerics.py diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index 605a15fd..2f12d033 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -18,7 +18,7 @@ from EpgSelection import EPGSelection from Screens.MessageBox import MessageBox from Screens.Dish import Dish from Screens.Standby import Standby -from Screens.EventView import EventView +from Screens.EventView import EventViewEPGSelect from Screens.MinuteInput import MinuteInput from Components.Harddisk import harddiskmanager @@ -41,7 +41,7 @@ from Menu import MainMenu, mdom class InfoBarDish: def __init__(self): self.dishDialog = self.session.instantiateDialog(Dish) - self.onShown.append(self.dishDialog.instance.show) + self.onShown.append(self.dishDialog.show) class InfoBarShowHide: """ InfoBar show/hide control, accepts toggleShow and hide actions, might start @@ -58,49 +58,63 @@ class InfoBarShowHide: "hide": self.hide, }) - self.state = self.STATE_SHOWN + self.__state = self.STATE_SHOWN + self.__locked = 0 self.onExecBegin.append(self.show) - self.onClose.append(self.delHideTimer) self.hideTimer = eTimer() self.hideTimer.timeout.get().append(self.doTimerHide) self.hideTimer.start(5000, True) + + self.onShow.append(self.__onShow) + self.onHide.append(self.__onHide) - def delHideTimer(self): - del self.hideTimer + def __onShow(self): + self.__state = self.STATE_SHOWN + self.startHideTimer() + + def startHideTimer(self): + if self.__state == self.STATE_SHOWN and not self.__locked: + self.hideTimer.start(5000, True) - def hide(self): - self.instance.hide() - - def show(self): - self.state = self.STATE_SHOWN - self.hideTimer.start(5000, True) + def __onHide(self): + self.__state = self.STATE_HIDDEN + + def doShow(self): + self.show() + self.startHideTimer() def doTimerHide(self): self.hideTimer.stop() - if self.state == self.STATE_SHOWN: - self.instance.hide() - self.state = self.STATE_HIDDEN + if self.__state == self.STATE_SHOWN: + self.hide() def toggleShow(self): - if self.state == self.STATE_SHOWN: - self.instance.hide() - #pls check animation support, sorry -# self.startHide() + if self.__state == self.STATE_SHOWN: + self.hide() self.hideTimer.stop() - self.state = self.STATE_HIDDEN - elif self.state == self.STATE_HIDDEN: - self.instance.show() + elif self.__state == self.STATE_HIDDEN: self.show() - - def startShow(self): - self.instance.m_animation.startMoveAnimation(ePoint(0, 600), ePoint(0, 380), 100) - self.state = self.STATE_SHOWN + + def lockShow(self): + self.__locked = self.__locked + 1 + if self.execing: + self.show() + self.hideTimer.stop() - def startHide(self): - self.instance.m_animation.startMoveAnimation(ePoint(0, 380), ePoint(0, 600), 100) - self.state = self.STATE_HIDDEN + def unlockShow(self): + self.__locked = self.__locked - 1 + if self.execing: + self.startHideTimer() + +# def startShow(self): +# self.instance.m_animation.startMoveAnimation(ePoint(0, 600), ePoint(0, 380), 100) +# self.__state = self.STATE_SHOWN +# +# def startHide(self): +# self.instance.m_animation.startMoveAnimation(ePoint(0, 380), ePoint(0, 600), 100) +# self.__state = self.STATE_HIDDEN class NumberZap(Screen): def quit(self): @@ -202,8 +216,7 @@ class InfoBarNumberZap: # print "You pressed number " + str(number) if number == 0: self.servicelist.recallPrevService() - self.instance.show() - self.show() + self.doShow() else: self.session.openWithCallback(self.numberEntered, NumberZap, number) @@ -265,27 +278,30 @@ class InfoBarChannelSelection: "zapUp": (self.zapUp, _("next channel")), "zapDown": (self.zapDown, _("previous channel")), }) - - def switchChannelUp(self): + + def switchChannelUp(self): self.servicelist.moveUp() self.session.execDialog(self.servicelist) - def switchChannelDown(self): + def switchChannelDown(self): self.servicelist.moveDown() self.session.execDialog(self.servicelist) - def zapUp(self): + def zapUp(self): + if self.servicelist.inBouquet() and self.servicelist.atBegin(): + self.servicelist.prevBouquet() self.servicelist.moveUp() self.servicelist.zap() - self.instance.show() - self.show() + self.doShow() - def zapDown(self): - self.servicelist.moveDown() + def zapDown(self): + if self.servicelist.inBouquet() and self.servicelist.atEnd(): + self.servicelist.nextBouquet() + else: + self.servicelist.moveDown() self.servicelist.zap() - self.instance.show() - self.show() - + self.doShow() + class InfoBarMenu: """ Handles a menu action, to open the (main) menu """ def __init__(self): @@ -305,59 +321,18 @@ class InfoBarEPG: def __init__(self): self["EPGActions"] = HelpableActionMap(self, "InfobarEPGActions", { - "showEPGList": (self.showEPG, _("show EPG...")), + "showEventInfo": (self.openEventView, _("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 zapToService(self, service): + if not service is None: + if self.servicelist.getRoot() != self.epg_bouquet: #already in correct bouquet? + self.servicelist.clearPath() + if self.servicelist.bouquet_root != self.epg_bouquet: + self.servicelist.enterPath(self.servicelist.bouquet_root) + self.servicelist.enterPath(self.epg_bouquet) + self.servicelist.setCurrentSelection(service) #select the service in servicelist + self.servicelist.zap() def openBouquetEPG(self, bouquet): ptr=eEPGCache.getInstance() @@ -372,28 +347,53 @@ class InfoBarEPG: continue services.append(ServiceReference(service)) if len(services): - self.session.openWithCallback(self.bouquetEPGCallback, EPGSelection, services) + self.epg_bouquet = bouquet + self.session.openWithCallback(self.closed, EPGSelection, services, self.zapToService) + + def closed(self, ret): + if ret: + self.close(ret) - def openSingleEPGSelector(self, ref): + def openMultiServiceEPG(self): + bouquets = self.servicelist.getBouquetList() + if bouquets is None: + cnt = 0 + else: + cnt = len(bouquets) + if cnt > 1: # show bouquet list + self.session.openWithCallback(self.closed, BouquetSelector, bouquets, self.openBouquetEPG) + elif cnt == 1: + self.openBouquetEPG(bouquets[0][1]) + + def openSingleServiceEPG(self): + ref=self.session.nav.getCurrentlyPlayingServiceReference() ptr=eEPGCache.getInstance() - if ptr.startTimeQuery(ref) != -1: - self.session.open(EPGSelection, ref) - else: # try to show now/next - print 'no epg for service', ref.toString() - 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) + self.session.openWithCallback(self.closed, EPGSelection, ref) + + def openEventView(self): + self.epglist = [ ] + service = self.session.nav.getCurrentService() + ref = self.session.nav.getCurrentlyPlayingServiceReference() + 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: + epg = eEPGCache.getInstance() + ptr = epg.lookupEventTime(ref, -1) + if ptr: + self.epglist.append(ptr) + ptr = epg.lookupEventTime(ref, ptr.getBeginTime(), +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 + if len(self.epglist) > 0: + self.session.open(EventViewEPGSelect, self.epglist[0], ServiceReference(ref), self.eventViewCallback, self.openSingleServiceEPG, self.openMultiServiceEPG) + else: + print "no epg for the service avail.. so we show multiepg instead of eventinfo" + self.openMultiServiceEPG() def eventViewCallback(self, setEvent, setService, val): #used for now/next displaying if len(self.epglist) > 1: @@ -467,30 +467,33 @@ class InfoBarServiceName: 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) - SEEK_STATE_FF_2X = (0, 2, 0, 0) - SEEK_STATE_FF_4X = (0, 4, 0, 0) - SEEK_STATE_FF_8X = (0, 8, 0, 0) - SEEK_STATE_FF_32X = (0, 4, 0, 32) - SEEK_STATE_FF_64X = (0, 4, 0, 64) - SEEK_STATE_FF_128X = (0, 4, 0, 128) + # ispause, isff, issm + SEEK_STATE_PLAY = (0, 0, 0, ">") + SEEK_STATE_PAUSE = (1, 0, 0, "||") + SEEK_STATE_FF_2X = (0, 2, 0, ">> 2x") + SEEK_STATE_FF_4X = (0, 4, 0, ">> 4x") + SEEK_STATE_FF_8X = (0, 8, 0, ">> 8x") + SEEK_STATE_FF_32X = (0, 32, 0, ">> 32x") + SEEK_STATE_FF_64X = (0, 64, 0, ">> 64x") + SEEK_STATE_FF_128X = (0, 128, 0, ">> 128x") - SEEK_STATE_BACK_4X = (0, 0, 0, -4) - SEEK_STATE_BACK_32X = (0, 0, 0, -32) - SEEK_STATE_BACK_64X = (0, 0, 0, -64) - SEEK_STATE_BACK_128X = (0, 0, 0, -128) + SEEK_STATE_BACK_4X = (0, -4, 0, "<< 4x") + SEEK_STATE_BACK_32X = (0, -32, 0, "<< 32x") + SEEK_STATE_BACK_64X = (0, -64, 0, "<< 64x") + SEEK_STATE_BACK_128X = (0, -128, 0, "<< 128x") - SEEK_STATE_SM_HALF = (0, 0, 2, 0) - SEEK_STATE_SM_QUARTER = (0, 0, 4, 0) - SEEK_STATE_SM_EIGHTH = (0, 0, 8, 0) + SEEK_STATE_SM_HALF = (0, 0, 2, "/2") + SEEK_STATE_SM_QUARTER = (0, 0, 4, "/4") + SEEK_STATE_SM_EIGHTH = (0, 0, 8, "/8") def __init__(self): self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { - pNavigation.evSeekableStatusChanged: self.__seekableStatusChanged, - pNavigation.evNewService: self.__serviceStarted + iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged, + iPlayableService.evStart: self.__serviceStarted, + + iPlayableService.evEOF: self.__evEOF, + iPlayableService.evSOF: self.__evSOF, }) self["SeekActions"] = HelpableActionMap(self, "InfobarSeekActions", { @@ -505,10 +508,7 @@ class InfoBarSeek: # give them a little more priority to win over color buttons self.seekstate = self.SEEK_STATE_PLAY - self.seekTimer = eTimer() - self.seekTimer.timeout.get().append(self.seekTimerFired) - self.skipinterval = 500 # 500ms skip interval - self.onClose.append(self.delSeekTimer) + self.onClose.append(self.delTimer) self.fwdtimer = False self.fwdKeyTimer = eTimer() @@ -517,6 +517,10 @@ class InfoBarSeek: self.rwdtimer = False self.rwdKeyTimer = eTimer() self.rwdKeyTimer.timeout.get().append(self.rwdTimerFire) + + self.onPlayStateChanged = [ ] + + self.lockedBecauseOfSkipping = False def up(self): pass @@ -524,29 +528,26 @@ class InfoBarSeek: def down(self): pass - def delSeekTimer(self): - del self.seekTimer + def delTimer(self): del self.fwdKeyTimer del self.rwdKeyTimer - def seekTimerFired(self): - self.seekbase += self.skipmode * self.skipinterval - - # check if we bounced against the beginning of the file - if self.seekbase < 0: - self.seekbase = 0; - self.setSeekState(self.SEEK_STATE_PLAY) - - self.doSeek(self.seekbase) - - def isSeekable(self): + def getSeek(self): service = self.session.nav.getCurrentService() if service is None: return False - if service.seek() is None: + + seek = service.seek() + + if seek is None or not seek.isCurrentlySeekable(): + return None + + return seek + + def isSeekable(self): + if self.getSeek() is None: return False - else: - return True + return True def __seekableStatusChanged(self): print "seekable status changed!" @@ -563,12 +564,11 @@ class InfoBarSeek: def setSeekState(self, state): service = self.session.nav.getCurrentService() - self.seekTimer.stop() if service is None: return False - if service.seek() is None: + if not self.isSeekable(): if state not in [self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE]: state = self.SEEK_STATE_PLAY @@ -581,35 +581,17 @@ class InfoBarSeek: oldstate = self.seekstate self.seekstate = state - for i in range(4): + for i in range(3): if oldstate[i] != self.seekstate[i]: - (self.session.nav.pause, pauseable.setFastForward, pauseable.setSlowMotion, self.setSkipMode)[i](self.seekstate[i]) + (self.session.nav.pause, pauseable.setFastForward, pauseable.setSlowMotion)[i](self.seekstate[i]) - return True - - def setSkipMode(self, skipmode): - print "setskipmode", skipmode - self.skipmode = skipmode - if skipmode == 0: - self.seekTimer.stop() - else: - self.seekTimer.start(500) - - service = self.session.nav.getCurrentService() - if service is None: - return + for c in self.onPlayStateChanged: + c(self.seekstate) - seekable = service.seek() - if seekable is None: - return + self.checkSkipShowHideLock() - if skipmode: - seekable.setTrickmode(1) - else: - seekable.setTrickmode(0) + return True - self.seekbase = seekable.getPlayPosition()[1] / 90 - def pauseService(self): if self.seekstate == self.SEEK_STATE_PAUSE: print "pause, but in fact unpause" @@ -632,9 +614,10 @@ class InfoBarSeek: if service is None: return - seekable = service.seek() + seekable = self.getSeek() if seekable is None: return + seekable.seekTo(90 * seektime) def seekFwd(self): @@ -705,13 +688,9 @@ class InfoBarSeek: def fwdSeekTo(self, minutes): print "Seek", minutes, "minutes forward" if minutes != 0: - service = self.session.nav.getCurrentService() - if service is None: - return - seekable = service.seek() - if seekable is None: - return - seekable.seekRelative(1, minutes * 60 * 90000) + seekable = self.getSeek() + if seekable is not None: + seekable.seekRelative(1, minutes * 60 * 90000) def rwdTimerFire(self): print "rwdTimerFire" @@ -722,6 +701,47 @@ class InfoBarSeek: def rwdSeekTo(self, minutes): print "rwdSeekTo" self.fwdSeekTo(0 - minutes) + + def checkSkipShowHideLock(self): + wantlock = self.seekstate != self.SEEK_STATE_PLAY + + if self.lockedBecauseOfSkipping and not wantlock: + self.unlockShow() + self.lockedBecauseOfSkipping = False + + if wantlock and not self.lockedBecauseOfSkipping: + self.lockShow() + self.lockedBecauseOfSkipping = True + + def __evEOF(self): + self.setSeekState(self.SEEK_STATE_PAUSE) + + def __evSOF(self): + self.setSeekState(self.SEEK_STATE_PLAY) + self.doSeek(0) + + def seekRelative(self, diff): + seekable = self.getSeek() + if seekable is not None: + seekable.seekRelative(0, diff) + +from Screens.PVRState import PVRState + +class InfoBarPVRState: + def __init__(self): + self.onPlayStateChanged.append(self.__playStateChanged) + self.pvrStateDialog = self.session.instantiateDialog(PVRState) + self.onShow.append(self.__mayShow) + self.onHide.append(self.pvrStateDialog.hide) + + def __mayShow(self): + if self.seekstate != self.SEEK_STATE_PLAY: + self.pvrStateDialog.show() + + def __playStateChanged(self, state): + playstateString = state[3] + self.pvrStateDialog["state"].setText(playstateString) + self.__mayShow() class InfoBarShowMovies: @@ -775,7 +795,7 @@ class InfoBarTimeshift: { "timeshiftActivateEnd": self.activateTimeshiftEnd, # something like "pause key" "timeshiftActivateEndAndPause": self.activateTimeshiftEndAndPause # something like "backward key" - }) + }, prio=-1) # priority over record self.timeshift_enabled = 0 self.timeshift_state = 0 @@ -784,7 +804,7 @@ class InfoBarTimeshift: self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { - pNavigation.evSeekableStatusChanged: self.__seekableStatusChanged + iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged }) def getTimeshift(self): @@ -792,9 +812,6 @@ class InfoBarTimeshift: 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: @@ -817,7 +834,6 @@ class InfoBarTimeshift: else: print "timeshift failed" - # nyi def stopTimeshift(self): print "disable timeshift" ts = self.getTimeshift() @@ -842,6 +858,7 @@ class InfoBarTimeshift: else: self.setSeekState(self.SEEK_STATE_PLAY) ts.activateTimeshift() + self.seekRelative(0) # same as activateTimeshiftEnd, but pauses afterwards. def activateTimeshiftEndAndPause(self): @@ -910,15 +927,8 @@ class InfoBarInstantRecord: if event is not None: data = parseEvent(event) - begin = data[0] - if begin < time.time(): - begin = time.time() - - end = data[1] - if end < begin: - end = begin - - end += 3600 * 10 + begin = time.time() + end = begin + 3600 * 10 data = (begin, end, data[2], data[3], data[4]) else: @@ -1067,13 +1077,13 @@ class InfoBarAdditionalInfo: def gotServiceEvent(self, ev): service = self.session.nav.getCurrentService() - if ev == pNavigation.evUpdatedEventInfo: + if ev == iPlayableService.evUpdatedEventInfo: self.checkSubservices(service) self.checkFormat(service) - elif ev == pNavigation.evUpdatedInfo: + elif ev == iPlayableService.evUpdatedInfo: self.checkCrypted(service) self.checkDolby(service) - elif ev == pNavigation.evStopService: + elif ev == iPlayableService.evEnd: self.hideSubServiceIndication() self["CryptActive"].hideWidget() self["DolbyActive"].hideWidget() @@ -1103,7 +1113,7 @@ class InfoBarServiceNotifications: def __init__(self): self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { - pNavigation.evEnd: self.serviceHasEnded + iPlayableService.evEnd: self.serviceHasEnded }) def serviceHasEnded(self):