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