b146ecf3b41516330e5a5ae28ed4d96f88b90335
[enigma2.git] / lib / python / Screens / TimerEntry.py
1 from Screen import Screen
2 import ChannelSelection
3 from ServiceReference import ServiceReference
4 from Components.config import ConfigSelection, ConfigText, ConfigSubList, ConfigSubsection, ConfigDateTime, ConfigClock, ConfigYesNo, getConfigListEntry
5 from Components.ActionMap import ActionMap, NumberActionMap
6 from Components.ConfigList import ConfigList, ConfigListScreen
7 from Components.MenuList import MenuList
8 from Components.Button import Button
9 from Components.NimManager import nimmanager
10 from Components.Label import Label
11 from Components.Pixmap import Pixmap
12 from Screens.MessageBox import MessageBox
13 from Screens.ChoiceBox import ChoiceBox
14 from RecordTimer import AFTEREVENT
15 from enigma import eEPGCache
16 import time
17 import datetime
18
19 class TimerEntry(Screen, ConfigListScreen):
20         def __init__(self, session, timer):
21                 Screen.__init__(self, session)
22                 self.timer = timer
23                 
24                 self["oktext"] = Label(_("OK"))
25                 self["canceltext"] = Label(_("Cancel"))
26                 self["ok"] = Pixmap()
27                 self["cancel"] = Pixmap()
28
29                 self.createConfig()
30
31                 self["actions"] = NumberActionMap(["SetupActions"],
32                 {
33                         "ok": self.keySelect,
34                         "save": self.keyGo,
35                         "cancel": self.keyCancel,
36                 }, -2)
37
38                 self.list = []
39                 ConfigListScreen.__init__(self, self.list, session = session)
40                 self.createSetup("config")
41
42         def createConfig(self):
43                         justplay = self.timer.justplay
44                                 
45                         afterevent = { AFTEREVENT.NONE: "nothing", AFTEREVENT.DEEPSTANDBY: "deepstandby", AFTEREVENT.STANDBY: "standby"}[self.timer.afterEvent]
46                         
47                         weekday_table = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
48
49                         # calculate default values
50                         day = []
51                         weekday = 0
52                         for x in range(0,7):
53                                 day.append(0)
54                         if self.timer.repeated: # repeated
55                                 type = "repeated"
56                                 if (self.timer.repeated == 31): # Mon-Fri
57                                         repeated = "weekdays"
58                                 elif (self.timer.repeated == 127): # daily
59                                         repeated = "daily"
60                                 else:
61                                         flags = self.timer.repeated
62                                         repeated = "user"
63                                         count = 0
64                                         for x in range(0, 7):
65                                                 if flags == 1: # weekly
66                                                         print "Set to weekday " + str(x)
67                                                         weekday = x
68                                                 if flags & 1 == 1: # set user defined flags
69                                                         day[x] = 1
70                                                         count += 1
71                                                 else:
72                                                         day[x] = 0
73                                                 flags = flags >> 1
74                                         if count == 1:
75                                                 repeated = "weekly"
76                         else: # once
77                                 type = "once"
78                                 repeated = None
79                                 weekday = (int(time.strftime("%w", time.localtime(self.timer.begin))) - 1) % 7
80                                 day[weekday] = 1
81                         
82                         self.timerentry_justplay = ConfigSelection(choices = [("zap", _("zap")), ("record", _("record"))], default = {0: "record", 1: "record"}[justplay])
83                         self.timerentry_afterevent = ConfigSelection(choices = [("nothing", _("do nothing")), ("deepstandby", _("go to deep standby"))], default = afterevent)
84                         self.timerentry_type = ConfigSelection(choices = [("once",_("once")), ("repeated", _("repeated"))], default = type)
85                         self.timerentry_name = ConfigText(default = self.timer.name, fixed_size = False)
86                         self.timerentry_description = ConfigText(default = self.timer.description, fixed_size = False)
87
88                         self.timerentry_repeated = ConfigSelection(default = repeated, choices = [("daily", _("daily")), ("weekly", _("weekly")), ("weekdays", _("Mon-Fri")), ("user", _("user defined"))])
89
90                         self.timerentry_startdate = ConfigDateTime(default = self.timer.begin, formatstring = _("%d.%B %Y"), increment = 86400)
91                         self.timerentry_starttime = ConfigClock(default = self.timer.begin)
92
93                         self.timerentry_enddate = ConfigDateTime(default = self.timer.end, formatstring =  _("%d.%B %Y"), increment = 86400)
94                         self.timerentry_endtime = ConfigClock(default = self.timer.end)
95
96                         self.timerentry_weekday = ConfigSelection(default = weekday_table[weekday], choices = [("mon",_("Monday")), ("tue", _("Tuesday")), ("wed",_("Wednesday")), ("thu", _("Thursday")), ("fri", _("Friday")), ("sat", _("Saturday")), ("sun", _("Sunday"))])
97
98                         self.timerentry_day = ConfigSubList()
99                         for x in range(0,7):
100                                 self.timerentry_day.append(ConfigYesNo(default = day[x]))
101
102                         # FIXME some service-chooser needed here
103                         servicename = "N/A"
104                         try: # no current service available?
105                                 servicename = str(self.timer.service_ref.getServiceName())
106                         except:
107                                 pass
108                         self.timerentry_service = ConfigSelection([servicename])
109                         
110                         self.timerentry_startdate.addNotifier(self.checkDate)
111                         self.timerentry_enddate.addNotifier(self.checkDate)
112
113         def checkDate(self, configElement):
114                 if configElement is self.timerentry_startdate:
115                         if self.timerentry_enddate.value < self.timerentry_startdate.value:
116                                 self.timerentry_enddate.value = self.timerentry_startdate.value
117                                 self["config"].invalidate(self.timerentry_enddate)
118                 if configElement is self.timerentry_enddate:
119                         if (self.timerentry_enddate.value < self.timerentry_startdate.value):
120                                 self.timerentry_startdate.value = self.timerentry_enddate.value
121                                 self["config"].invalidate(self.timerentry_startdate)
122
123         def createSetup(self, widget):
124                 self.list = []
125                 self.list.append(getConfigListEntry(_("Name"), self.timerentry_name))
126                 self.list.append(getConfigListEntry(_("Description"), self.timerentry_description))
127                 self.timerJustplayEntry = getConfigListEntry(_("Timer Type"), self.timerentry_justplay)
128                 self.list.append(self.timerJustplayEntry)
129                 self.timerTypeEntry = getConfigListEntry(_("Repeat Type"), self.timerentry_type)
130                 self.list.append(self.timerTypeEntry)
131
132                 if self.timerentry_type.value == "once":
133                         self.frequencyEntry = None
134                 else: # repeated
135                         self.frequencyEntry = getConfigListEntry(_("Frequency"), self.timerentry_repeated)
136                         self.list.append(self.frequencyEntry)
137                         if self.timerentry_repeated.value == "daily":
138                                 pass
139                         if self.timerentry_repeated.value == "weekdays":
140                                 pass
141                         if self.timerentry_repeated.value == "weekly":
142                                 self.list.append(getConfigListEntry(_("Weekday"), self.timerentry_weekday))
143
144                         if self.timerentry_repeated.value == "user":
145                                 self.list.append(getConfigListEntry(_("Monday"), self.timerentry_day[0]))
146                                 self.list.append(getConfigListEntry(_("Tuesday"), self.timerentry_day[1]))
147                                 self.list.append(getConfigListEntry(_("Wednesday"), self.timerentry_day[2]))
148                                 self.list.append(getConfigListEntry(_("Thursday"), self.timerentry_day[3]))
149                                 self.list.append(getConfigListEntry(_("Friday"), self.timerentry_day[4]))
150                                 self.list.append(getConfigListEntry(_("Saturday"), self.timerentry_day[5]))
151                                 self.list.append(getConfigListEntry(_("Sunday"), self.timerentry_day[6]))
152
153                         #self.list.append(getConfigListEntry("StartDate", self.timerentry_startdate))
154 #               self.list.append(getConfigListEntry("Weekday", self.timerentry_weekday))
155
156                 if self.timerentry_type.value == "once":
157                         self.list.append(getConfigListEntry(_("Start"), self.timerentry_startdate))
158                         self.list.append(getConfigListEntry(" ", self.timerentry_starttime))
159                 else:
160                         self.list.append(getConfigListEntry(_("StartTime"), self.timerentry_starttime))
161
162                 if self.timerentry_type.value == "once":
163                         if self.timerentry_justplay.value != "zap":
164                                 self.list.append(getConfigListEntry(_("End"), self.timerentry_enddate))
165                                 self.list.append(getConfigListEntry(" ", self.timerentry_endtime))
166                 else:
167                         if self.timerentry_justplay.value != "zap":
168                                 self.list.append(getConfigListEntry(_("EndTime"), self.timerentry_endtime))
169
170                 if self.timerentry_justplay.value != "zap":
171                         self.list.append(getConfigListEntry(_("After event"), self.timerentry_afterevent))
172
173                 self.channelEntry = getConfigListEntry(_("Channel"), self.timerentry_service)
174                 self.list.append(self.channelEntry)
175
176                 self[widget].list = self.list
177                 self[widget].l.setList(self.list)
178
179         def newConfig(self):
180                 print "newConfig", self["config"].getCurrent()
181                 if self["config"].getCurrent() == self.timerTypeEntry:
182                         self.createSetup("config")
183                 if self["config"].getCurrent() == self.timerJustplayEntry:
184                         self.createSetup("config")
185                 if self["config"].getCurrent() == self.frequencyEntry:
186                         self.createSetup("config")
187
188         def keyLeft(self):
189                 if self["config"].getCurrent() is self.channelEntry:
190                         self.keySelect()
191                 else:
192                         ConfigListScreen.keyLeft(self)
193                         self.newConfig()
194
195         def keyRightCallback(self, configPath):
196                 currentConfigPath = self["config"].getCurrent()[1].parent.getConfigPath()
197                 # check if we are still on the same config entry
198                 if (currentConfigPath == configPath):
199                         self.keyRight()
200
201         def keyRight(self):
202                 if self["config"].getCurrent() is self.channelEntry:
203                         self.keySelect()
204                 else:
205                         ConfigListScreen.keyRight(self)
206                         self.newConfig()
207                 
208         def keySelect(self):
209                 if self["config"].getCurrent() == self.channelEntry:
210                         self.session.openWithCallback(self.finishedChannelSelection, ChannelSelection.SimpleChannelSelection, _("Select channel to record from"))
211                 else:
212                         self.keyGo()
213
214         def finishedChannelSelection(self, *args):
215                 if len(args):
216                         self.timer.service_ref = ServiceReference(args[0])
217                         self.timerentry_service.vals = (str(self.timer.service_ref.getServiceName()),)
218                         self["config"].invalidate(self.timerentry_service)
219
220         def getTimestamp(self, date, mytime):
221                 d = time.localtime(date)
222                 dt = datetime.datetime(d.tm_year, d.tm_mon, d.tm_mday, mytime[0], mytime[1])
223                 return int(time.mktime(dt.timetuple()))
224
225         def getBeginEnd(self):
226                 enddate = self.timerentry_enddate.value
227                 endtime = self.timerentry_endtime.value
228                 
229                 startdate = self.timerentry_startdate.value
230                 starttime = self.timerentry_starttime.value
231                 
232                 begin = self.getTimestamp(startdate, starttime)
233                 end = self.getTimestamp(enddate, endtime)
234                 
235                 # because of the dateChecks, startdate can't be < enddate.
236                 # however, the endtime can be less than the starttime.
237                 # in this case, add 1 day.
238                 if end < begin:
239                         end += 86400
240                 return begin, end
241
242         def keyGo(self):
243                 self.timer.name = self.timerentry_name.value
244                 self.timer.description = self.timerentry_description.value
245                 self.timer.justplay = self.timerentry_justplay.value == "zap"
246                 self.timer.resetRepeated()
247                 self.timer.afterEvent = {"nothing": AFTEREVENT.NONE, "deepstandby": AFTEREVENT.DEEPSTANDBY, "standby": AFTEREVENT.STANDBY}[self.timerentry_afterevent.value]
248                 
249                 if self.timerentry_type.value == "once":
250                         self.timer.begin, self.timer.end = self.getBeginEnd()
251                 if self.timerentry_type.value == "repeated":
252                         if self.timerentry_repeated.value == "daily":
253                                 for x in range(0,7):
254                                         self.timer.setRepeated(x)
255
256                         if self.timerentry_repeated.value == "weekly":
257                                 self.timer.setRepeated(self.timerentry_weekday.index)
258                                 
259                         if self.timerentry_repeated.value == "weekdays":
260                                 for x in range(0,5):
261                                         self.timer.setRepeated(x)
262                                 
263                         if self.timerentry_repeated.value == "user":
264                                 for x in range(0,7):
265                                         if self.timerentry_day[x].value:
266                                                 self.timer.setRepeated(x)
267
268                         self.timer.begin = self.getTimestamp(time.time(), self.timerentry_starttime.value)
269                         self.timer.end = self.getTimestamp(time.time(), self.timerentry_endtime.value)
270                         
271                         # when a timer end is set before the start, add 1 day
272                         if self.timer.end < self.timer.begin:
273                                 self.timer.end += 86400
274
275                 if self.timer.eit is not None:
276                         event = eEPGCache.getInstance().lookupEventId(self.timer.service_ref.ref, self.timer.eit)
277                         if event is not None:
278                                 n = event.getNumOfLinkageServices()
279                                 if n > 0:
280                                         tlist = []
281                                         ref = self.session.nav.getCurrentlyPlayingServiceReference()
282                                         parent = self.timer.service_ref.ref
283                                         selection = 0
284                                         for x in range(n):
285                                                 i = event.getLinkageService(parent, x)
286                                                 if i.toString() == ref.toString():
287                                                         selection = x
288                                                 tlist.append((i.getName(), i))
289                                         self.session.openWithCallback(self.subserviceSelected, ChoiceBox, title=_("Please select a subservice to record..."), list = tlist, selection = selection)
290                                         return
291                 self.close((True, self.timer))
292
293         def subserviceSelected(self, service):
294                 if not service is None:
295                         self.timer.service_ref = ServiceReference(service[1])
296                 self.close((True, self.timer))
297
298         def keyCancel(self):
299                 self.close((False,))
300                 
301 class TimerLog(Screen):
302         def __init__(self, session, timer):
303                 Screen.__init__(self, session)
304                 self.timer = timer;
305                 self.log_entries = self.timer.log_entries[:]
306                 
307                 self.fillLogList()
308                 
309                 self["loglist"] = MenuList(self.list)
310                 self["logentry"] = Label()
311                 
312                 self["key_red"] = Button(_("Delete entry"))
313                 self["key_green"] = Button()
314                 self["key_yellow"] = Button("")
315                 self["key_blue"] = Button(_("Clear log"))
316                 
317                 self.onShown.append(self.updateText)
318
319                 self["actions"] = NumberActionMap(["OkCancelActions", "DirectionActions", "ColorActions"],
320                 {
321                         "ok": self.keyClose,
322                         "cancel": self.keyClose,
323                         "up": self.up,
324                         "down": self.down,
325                         "left": self.left,
326                         "right": self.right,
327                         "red": self.deleteEntry,
328                         "blue": self.clearLog
329                 }, -1)
330
331         def deleteEntry(self):
332                 self.log_entries.remove(self["loglist"].getCurrent()[1])
333                 self.fillLogList()
334                 self["loglist"].l.setList(self.list)
335                 self.updateText()
336
337         def fillLogList(self):
338                 self.list = [ ]
339                 for x in self.log_entries:
340                         self.list.append((str(time.strftime("%Y-%m-%d %H-%M", localtime(x[0])) + " - " + x[2]), x))
341         
342         def clearLog(self):             
343                 self.log_entries = []
344                 self.fillLogList()
345                 self["loglist"].l.setList(self.list)
346                 self.updateText()
347                 
348         def keyClose(self):
349                 if self.timer.log_entries != self.log_entries:
350                         self.timer.log_entries = self.log_entries
351                         self.close((True, self.timer))
352                 else:
353                         self.close((False,))
354                 
355         def up(self):
356                 self["loglist"].instance.moveSelection(self["loglist"].instance.moveUp)
357                 self.updateText()
358                 
359         def down(self):
360                 self["loglist"].instance.moveSelection(self["loglist"].instance.moveDown)
361                 self.updateText()
362
363         def left(self):
364                 self["loglist"].instance.moveSelection(self["loglist"].instance.pageUp)
365                 self.updateText()
366                 
367         def right(self):
368                 self["loglist"].instance.moveSelection(self["loglist"].instance.pageDown)
369                 self.updateText()
370
371         def updateText(self):
372                 if len(self.list) > 0:
373                         self["logentry"].setText(str(self["loglist"].getCurrent()[1][2]))
374                 else:
375                         self["logentry"].setText("")