fix return of getSeek
[enigma2.git] / lib / python / Screens / TimerEdit.py
1 from Screen import Screen
2 from Components.TimerList import TimerList, TimerEntryComponent
3 from Components.ConfigList import ConfigList
4 from Components.MenuList import MenuList
5 from Components.ActionMap import ActionMap
6 from Components.TimeInput import TimeInput
7 from Components.Label import Label
8 from Components.Button import Button
9 from Screens.MessageBox import MessageBox
10 from TimerEntry import TimerEntry, TimerLog
11 from RecordTimer import RecordTimerEntry, parseEvent
12 from time import *
13 from ServiceReference import ServiceReference
14 from Components.config import *
15 from Components.TimerSanityCheck import TimerSanityCheck
16
17 class TimerEditList(Screen):
18         def __init__(self, session):
19                 Screen.__init__(self, session)
20                 
21                 list = [ ]
22                 self.list = list
23                 self.fillTimerList()
24
25                 self["timerlist"] = TimerList(list)
26                 
27                 self["key_red"] = Button(_("Delete"))
28                 self["key_green"] = Button(_("Add"))
29                 self["key_yellow"] = Button("")
30                 self["key_blue"] = Button(_("Cleanup"))
31
32                 self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ShortcutActions", "TimerEditActions"], 
33                         {
34                                 "ok": self.openEdit,
35                                 "cancel": self.leave,
36                                 "red": self.removeTimer,
37                                 "green": self.addCurrentTimer,
38                                 "blue": self.cleanupQuestion,
39                                 "yellow": self.toggleDisabledState,
40                                 "log": self.showLog,
41                                 "left": self.left,
42                                 "right": self.right,
43                                 "up": self.up,
44                                 "down": self.down
45                         }, -1)
46                 self.session.nav.RecordTimer.on_state_change.append(self.onStateChange)
47                 self.onShown.append(self.updateState)
48
49         def up(self):
50                 self["timerlist"].instance.moveSelection(self["timerlist"].instance.moveUp)
51                 self.updateState()
52                 
53         def down(self):
54                 self["timerlist"].instance.moveSelection(self["timerlist"].instance.moveDown)
55                 self.updateState()
56
57         def left(self):
58                 self["timerlist"].instance.moveSelection(self["timerlist"].instance.pageUp)
59                 self.updateState()
60                 
61         def right(self):
62                 self["timerlist"].instance.moveSelection(self["timerlist"].instance.pageDown)
63                 self.updateState()
64                 
65         def toggleDisabledState(self):
66                 t = self["timerlist"].getCurrent()[0]
67                 
68                 if t.disabled:
69                         t.enable()
70                 else:
71                         t.disable()
72
73                 self.session.nav.RecordTimer.timeChanged(t)
74                 self.updateState()
75                 self.refill()
76                 
77         def updateState(self):
78                 if len(self.list) > 0:
79                         if self["timerlist"].getCurrent()[0].disabled:
80                                 self["key_yellow"].setText(_("Enable"))
81                         else:
82                                 self["key_yellow"].setText(_("Disable"))
83                         self["key_yellow"].instance.invalidate()
84
85         def fillTimerList(self):
86                 del self.list[:]
87                 
88                 for timer in self.session.nav.RecordTimer.timer_list:
89                         self.list.append(TimerEntryComponent(timer, processed=False))
90                 
91                 for timer in self.session.nav.RecordTimer.processed_timers:
92                         self.list.append(TimerEntryComponent(timer, processed=True))
93                 self.list.sort(cmp = lambda x, y: x[0].begin < y[0].begin)
94
95         def showLog(self):
96                 self.session.openWithCallback(self.finishedEdit, TimerLog, self["timerlist"].getCurrent()[0])
97
98         def openEdit(self):
99                 self.session.openWithCallback(self.finishedEdit, TimerEntry, self["timerlist"].getCurrent()[0])
100                 #self.session.open(TimerEdit, self["timerlist"].getCurrent()[0])
101                 
102         def cleanupQuestion(self):
103                 self.session.openWithCallback(self.cleanupTimer, MessageBox, _("Really delete done timers?"))
104         
105         def cleanupTimer(self, delete):
106                 if delete:
107                         self.session.nav.RecordTimer.cleanup()
108                         self.refill()
109                 
110         def removeTimer(self):
111                 list = self["timerlist"]
112                 cur = list.getCurrent()
113                 if cur is not None:
114                         timer = cur[0]
115                         self.session.nav.RecordTimer.removeEntry(timer)
116                         self.refill()
117         
118         def refill(self):
119                 self.fillTimerList()
120                 self["timerlist"].invalidate()
121         
122         def addCurrentTimer(self):
123                 event = None
124                 service = self.session.nav.getCurrentService()
125                 if service is not None:
126                         info = service.info()
127                         if info is not None:
128                                 event = info.getEvent(0)
129
130                 # FIXME only works if already playing a service
131                 serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference())
132                 
133                 if event is None:       
134                         data = (int(time()), int(time() + 60), "unknown event", "", None)
135                 else:
136                         data = parseEvent(event)
137
138                 self.addTimer(RecordTimerEntry(serviceref, *data))
139                 
140         def addTimer(self, timer):
141                 self.session.openWithCallback(self.finishedAdd, TimerEntry, timer)
142                 
143         def finishedEdit(self, answer):
144                 print "finished edit"
145                 
146                 if answer[0]:
147                         print "Edited timer"
148                         timersanitycheck = TimerSanityCheck(self.session.nav.RecordTimer.timer_list, answer[1])
149                         if not timersanitycheck.check():
150                                 print "Sanity check failed"
151                         else:
152                                 print "Sanity check passed"
153                         self.session.nav.RecordTimer.timeChanged(answer[1])
154                         self.fillTimerList()
155                 else:
156                         print "Timeredit aborted"
157
158         def finishedAdd(self, answer):
159                 print "finished add"
160                 if answer[0]:
161                         timersanitycheck = TimerSanityCheck(self.session.nav.RecordTimer.timer_list, answer[1])
162                         if not timersanitycheck.check():
163                                 print "Sanity check failed"
164                                 self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, timersanitycheck.getSimulTimerList())
165                         else:
166                                 print "Sanity check passed"
167                                 entry = answer[1]
168                                 self.session.nav.RecordTimer.record(entry)
169                                 self.fillTimerList()
170                 else:
171                         print "Timeredit aborted"               
172
173         def finishSanityCorrection(self, answer):
174                 self.finishedAdd(answer)
175
176         def leave(self):
177                 self.session.nav.RecordTimer.saveTimer()
178                 self.session.nav.RecordTimer.on_state_change.remove(self.onStateChange)
179                 self.close()
180
181         def onStateChange(self, entry):
182                 self.refill()
183                 
184 class TimerSanityConflict(Screen):
185         def __init__(self, session, timer):
186                 Screen.__init__(self, session)
187                 self.timer = timer
188                 print "TimerSanityConflict", timer
189                         
190                 self["timer1"] = TimerList(self.getTimerList(timer[0]))
191                 if len(timer) > 1:
192                         self["timer2"] = TimerList(self.getTimerList(timer[1]))
193                 else:
194                         self["timer2"] = Button("No conflict")
195                 
196                 self.list = []
197                 count = 0
198                 for x in timer:
199                         if count != 0:
200                                 self.list.append((_("Conflicting timer") + " " + str(count), x))
201                         count += 1
202
203                 self["list"] = MenuList(self.list)
204                 
205                 self["key_red"] = Button("Edit")
206                 self["key_green"] = Button("Disable")
207                 self["key_yellow"] = Button("Edit")
208                 self["key_blue"] = Button("Disable")
209
210                 self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ShortcutActions", "TimerEditActions"], 
211                         {
212                                 "ok": self.close,
213                                 #"cancel": self.leave,
214                                 "red": self.editTimer1,
215                                 "green": self.disableTimer1,
216 #                               "yellow": self.editTimer2,
217 #                               "blue": self.disableTimer2,
218                                 #"log": self.showLog,
219                                 #"left": self.left,
220                                 #"right": self.right,
221                                 "up": self.up,
222                                 "down": self.down
223                         }, -1)
224
225         def getTimerList(self, timer):
226                 return [TimerEntryComponent(timer, processed=False)]
227
228         def editTimer1(self):
229                 self.session.openWithCallback(self.finishedEdit, TimerEntry, self["timer1"].getCurrent()[0])
230
231         def disableTimer1(self):
232                 self.timer[0].disabled = True
233                 self.finishedEdit((True, self.timer[0]))
234
235         def finishedEdit(self, answer):
236                 self.close((True, self.timer[0]))
237
238         def up(self):
239                 self["list"].instance.moveSelection(self["list"].instance.moveUp)
240                 self["timer2"].l.setList(self.getTimerList(self["list"].getCurrent()[1]))
241                 
242         def down(self):
243                 self["list"].instance.moveSelection(self["list"].instance.moveDown)
244                 self["timer2"].l.setList(self.getTimerList(self["list"].getCurrent()[1]))
245                         
246