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