add timeout for MessageBox screens (just add timeout=<seconds> as argument when creat...
[enigma2.git] / lib / python / Screens / TimerEntry.py
index 752ace42c1bca74fc05ac537874fc1c88eb9b126..85f41fb2bfb43815c363e407b45c66ab61299009 100644 (file)
@@ -2,15 +2,16 @@ from Screen import Screen
 import ChannelSelection
 from ServiceReference import ServiceReference
 from Components.config import *
 import ChannelSelection
 from ServiceReference import ServiceReference
 from Components.config import *
-from Components.ActionMap import NumberActionMap
+from Components.ActionMap import ActionMap, NumberActionMap
 from Components.ConfigList import ConfigList
 from Components.MenuList import MenuList
 from Components.Button import Button
 from Components.NimManager import nimmanager
 from Components.Label import Label
 from Components.Pixmap import Pixmap
 from Components.ConfigList import ConfigList
 from Components.MenuList import MenuList
 from Components.Button import Button
 from Components.NimManager import nimmanager
 from Components.Label import Label
 from Components.Pixmap import Pixmap
-from Screens.SubserviceSelection import SubserviceSelection
 from Screens.MessageBox import MessageBox
 from Screens.MessageBox import MessageBox
+from Screens.ChoiceBox import ChoiceBox
+from RecordTimer import AFTEREVENT
 from enigma import eEPGCache
 import time
 import datetime
 from enigma import eEPGCache
 import time
 import datetime
@@ -49,11 +50,18 @@ class TimerEntry(Screen):
 
                self.list = []
                self["config"] = ConfigList(self.list)
 
                self.list = []
                self["config"] = ConfigList(self.list)
-               self.createSetup()
+               self.createSetup("config")
 
        def createConfig(self):
                        config.timerentry = ConfigSubsection()
                        
 
        def createConfig(self):
                        config.timerentry = ConfigSubsection()
                        
+                       if (self.timer.justplay):
+                               justplay = 0
+                       else:
+                               justplay = 1
+                               
+                       afterevent = { AFTEREVENT.NONE: 0, AFTEREVENT.DEEPSTANDBY: 1, AFTEREVENT.STANDBY: 2}[self.timer.afterEvent]
+
                        # calculate default values
                        day = []
                        weekday = 0
                        # calculate default values
                        day = []
                        weekday = 0
@@ -87,6 +95,8 @@ class TimerEntry(Screen):
                                weekday = (int(strftime("%w", time.localtime(self.timer.begin))) - 1) % 7
                                day[weekday] = 0
                        
                                weekday = (int(strftime("%w", time.localtime(self.timer.begin))) - 1) % 7
                                day[weekday] = 0
                        
+                       config.timerentry.justplay = configElement_nonSave("config.timerentry.justplay", configSelection, justplay, (("zap", _("zap")), ("record", _("record"))))
+                       config.timerentry.afterevent = configElement_nonSave("config.timerentry.afterevent", configSelection, afterevent, (("nothing", _("do nothing")), ("deepstandby", _("go to deep standby"))))
                        config.timerentry.type = configElement_nonSave("config.timerentry.type", configSelection, type, (_("once"), _("repeated")))
                        config.timerentry.name = configElement_nonSave("config.timerentry.name", configText, self.timer.name, (configText.extendableSize, self.keyRightCallback))
                        config.timerentry.description = configElement_nonSave("config.timerentry.description", configText, self.timer.description, (configText.extendableSize, self.keyRightCallback))
                        config.timerentry.type = configElement_nonSave("config.timerentry.type", configSelection, type, (_("once"), _("repeated")))
                        config.timerentry.name = configElement_nonSave("config.timerentry.name", configText, self.timer.name, (configText.extendableSize, self.keyRightCallback))
                        config.timerentry.description = configElement_nonSave("config.timerentry.description", configText, self.timer.description, (configText.extendableSize, self.keyRightCallback))
@@ -124,7 +134,7 @@ class TimerEntry(Screen):
                                config.timerentry.enddate.change()
                                try:
                                        self["config"].invalidate(config.timerentry.enddate)
                                config.timerentry.enddate.change()
                                try:
                                        self["config"].invalidate(config.timerentry.enddate)
-                               except:
+                               except: # FIXME: what could go wrong here?
                                        pass
                if (configElement.getConfigPath() == "config.timerentry.enddate"):
                        if (config.timerentry.enddate.value < config.timerentry.startdate.value):
                                        pass
                if (configElement.getConfigPath() == "config.timerentry.enddate"):
                        if (config.timerentry.enddate.value < config.timerentry.startdate.value):
@@ -132,14 +142,16 @@ class TimerEntry(Screen):
                                config.timerentry.startdate.change()
                                try:
                                        self["config"].invalidate(config.timerentry.startdate)
                                config.timerentry.startdate.change()
                                try:
                                        self["config"].invalidate(config.timerentry.startdate)
-                               except:
+                               except: # FIXME: what could go wrong here?
                                        pass
 
                                        pass
 
-       def createSetup(self):
+       def createSetup(self, widget):
                self.list = []
                self.list.append(getConfigListEntry(_("Name"), config.timerentry.name))
                self.list.append(getConfigListEntry(_("Description"), config.timerentry.description))
                self.list = []
                self.list.append(getConfigListEntry(_("Name"), config.timerentry.name))
                self.list.append(getConfigListEntry(_("Description"), config.timerentry.description))
-               self.timerTypeEntry = getConfigListEntry(_("Timer Type"), config.timerentry.type)
+               self.timerJustplayEntry = getConfigListEntry(_("Timer Type"), config.timerentry.justplay)
+               self.list.append(self.timerJustplayEntry)
+               self.timerTypeEntry = getConfigListEntry(_("Repeat Type"), config.timerentry.type)
                self.list.append(self.timerTypeEntry)
 
                if (config.timerentry.type.value == 0): # once
                self.list.append(self.timerTypeEntry)
 
                if (config.timerentry.type.value == 0): # once
@@ -172,23 +184,30 @@ class TimerEntry(Screen):
                else:
                        self.list.append(getConfigListEntry(_("StartTime"), config.timerentry.starttime))
                if (config.timerentry.type.value == 0): # once
                else:
                        self.list.append(getConfigListEntry(_("StartTime"), config.timerentry.starttime))
                if (config.timerentry.type.value == 0): # once
-                       self.list.append(getConfigListEntry(_("End"), config.timerentry.enddate))
-                       self.list.append(getConfigListEntry(" ", config.timerentry.endtime))
+                       if currentConfigSelectionElement(config.timerentry.justplay) != "zap":
+                               self.list.append(getConfigListEntry(_("End"), config.timerentry.enddate))
+                               self.list.append(getConfigListEntry(" ", config.timerentry.endtime))
                else:
                else:
-                       self.list.append(getConfigListEntry(_("EndTime"), config.timerentry.endtime))
+                       if currentConfigSelectionElement(config.timerentry.justplay) != "zap":
+                               self.list.append(getConfigListEntry(_("EndTime"), config.timerentry.endtime))
+
+               if currentConfigSelectionElement(config.timerentry.justplay) != "zap":
+                       self.list.append(getConfigListEntry(_("After event"), config.timerentry.afterevent))
 
                self.channelEntry = getConfigListEntry(_("Channel"), config.timerentry.service)
                self.list.append(self.channelEntry)
 
 
                self.channelEntry = getConfigListEntry(_("Channel"), config.timerentry.service)
                self.list.append(self.channelEntry)
 
-               self["config"].list = self.list
-               self["config"].l.setList(self.list)
+               self[widget].list = self.list
+               self[widget].l.setList(self.list)
 
        def newConfig(self):
 
        def newConfig(self):
-               print self["config"].getCurrent()
+               print "newConfig", self["config"].getCurrent()
                if self["config"].getCurrent() == self.timerTypeEntry:
                if self["config"].getCurrent() == self.timerTypeEntry:
-                       self.createSetup()
+                       self.createSetup("config")
+               if self["config"].getCurrent() == self.timerJustplayEntry:
+                       self.createSetup("config")
                if self["config"].getCurrent() == self.frequencyEntry:
                if self["config"].getCurrent() == self.frequencyEntry:
-                       self.createSetup()
+                       self.createSetup("config")
 
        def keyLeft(self):
                if self["config"].getCurrent() == self.channelEntry:
 
        def keyLeft(self):
                if self["config"].getCurrent() == self.channelEntry:
@@ -219,15 +238,11 @@ class TimerEntry(Screen):
                else:
                        self.keyGo()
 
                else:
                        self.keyGo()
 
-       def finishedChannelSelection(self, args):
-               oldref = self.timer.service_ref
-               try:
-                       self.timer.service_ref = ServiceReference(args)
+       def finishedChannelSelection(self, *args):
+               if len(args):
+                       self.timer.service_ref = ServiceReference(args[0])
                        config.timerentry.service.vals = (str(self.timer.service_ref.getServiceName()),)
                        self["config"].invalidate(config.timerentry.service)
                        config.timerentry.service.vals = (str(self.timer.service_ref.getServiceName()),)
                        self["config"].invalidate(config.timerentry.service)
-               except:
-                       print "you pressed cancel"
-                       self.timer.service_ref = oldref
 
        def keyNumberGlobal(self, number):
                print "You pressed number " + str(number)
 
        def keyNumberGlobal(self, number):
                print "You pressed number " + str(number)
@@ -237,17 +252,34 @@ class TimerEntry(Screen):
        def getTimestamp(self, date, mytime):
                d = time.localtime(date)
                dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
        def getTimestamp(self, date, mytime):
                d = time.localtime(date)
                dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
-               print dt
                return int(mktime(dt.timetuple()))
 
                return int(mktime(dt.timetuple()))
 
+       def getBeginEnd(self):
+               enddate = config.timerentry.enddate.value
+               endtime = config.timerentry.endtime.value
+               
+               startdate = config.timerentry.startdate.value
+               starttime = config.timerentry.starttime.value
+               
+               begin = self.getTimestamp(startdate, starttime)
+               end = self.getTimestamp(enddate, endtime)
+               
+               # because of the dateChecks, startdate can't be < enddate.
+               # however, the endtime can be less than the starttime.
+               # in this case, add 1 day.
+               if end < begin:
+                       end += 86400
+               return begin, end
+
        def keyGo(self):
                self.timer.name = config.timerentry.name.value
                self.timer.description = config.timerentry.description.value
        def keyGo(self):
                self.timer.name = config.timerentry.name.value
                self.timer.description = config.timerentry.description.value
+               self.timer.justplay = (currentConfigSelectionElement(config.timerentry.justplay) == "zap")
                self.timer.resetRepeated()
                self.timer.resetRepeated()
+               self.timer.afterEvent = { 0: AFTEREVENT.NONE, 1: AFTEREVENT.DEEPSTANDBY, 2: AFTEREVENT.STANDBY}[config.timerentry.afterevent.value]
                
                if (config.timerentry.type.value == 0): # once
                
                if (config.timerentry.type.value == 0): # once
-                       self.timer.begin = self.getTimestamp(config.timerentry.startdate.value, config.timerentry.starttime.value)
-                       self.timer.end = self.getTimestamp(config.timerentry.enddate.value, config.timerentry.endtime.value)
+                       self.timer.begin, self.timer.end = self.getBeginEnd()
                if (config.timerentry.type.value == 1): # repeated
                        if (config.timerentry.repeated.value == 0): # daily
                                for x in range(0,7):
                if (config.timerentry.type.value == 1): # repeated
                        if (config.timerentry.repeated.value == 0): # daily
                                for x in range(0,7):
@@ -266,23 +298,37 @@ class TimerEntry(Screen):
 
                        self.timer.begin = self.getTimestamp(time.time(), config.timerentry.starttime.value)
                        self.timer.end = self.getTimestamp(time.time(), config.timerentry.endtime.value)
 
                        self.timer.begin = self.getTimestamp(time.time(), config.timerentry.starttime.value)
                        self.timer.end = self.getTimestamp(time.time(), config.timerentry.endtime.value)
+                       
+                       # when a timer end is set before the start, add 1 day
+                       if self.timer.end < self.timer.begin:
+                               self.timer.end += 86400
 
                if self.timer.eit is not None:
                        event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
                        if event is not None:
 
                if self.timer.eit is not None:
                        event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
                        if event is not None:
-                               if event.getNumOfLinkageServices() > 0:
-                                       self.session.openWithCallback(self.subserviceSelected, SubserviceSelection, event, self.timer.service_ref.ref)
+                               n = event.getNumOfLinkageServices()
+                               if n > 0:
+                                       tlist = []
+                                       ref = self.session.nav.getCurrentlyPlayingServiceReference()
+                                       parent = self.timer.service_ref.ref
+                                       selection = 0
+                                       for x in range(n):
+                                               i = event.getLinkageService(parent, x)
+                                               if i.toString() == ref.toString():
+                                                       selection = x
+                                               tlist.append((i.getName(), i))
+                                       self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list = tlist, selection = selection)
                                        return
                self.close((True, self.timer))
 
        def subserviceSelected(self, service):
                if not service is None:
                                        return
                self.close((True, self.timer))
 
        def subserviceSelected(self, service):
                if not service is None:
-                       self.timer.service_ref = ServiceReference(service)
+                       self.timer.service_ref = ServiceReference(service[1])
                self.close((True, self.timer))
 
        def keyCancel(self):
                self.close((False,))
                self.close((True, self.timer))
 
        def keyCancel(self):
                self.close((False,))
-
+               
 class TimerLog(Screen):
        def __init__(self, session, timer):
                Screen.__init__(self, session)
 class TimerLog(Screen):
        def __init__(self, session, timer):
                Screen.__init__(self, session)