fix 'play' doesn't disappear when config.usage.show_infobar_on_skip is set
[enigma2.git] / lib / python / Screens / EventView.py
1 from Screen import Screen
2 from Screens.TimerEdit import TimerSanityConflict
3 from Screens.MessageBox import MessageBox
4 from Components.ActionMap import ActionMap
5 from Components.Button import Button
6 from Components.Label import Label
7 from Components.ScrollLabel import ScrollLabel
8 from Components.TimerList import TimerList
9 from enigma import eEPGCache, eTimer, eServiceReference
10 from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
11 from TimerEntry import TimerEntry
12 from time import localtime
13 from Components.config import config
14
15 class EventViewBase:
16         ADD_TIMER = 0
17         REMOVE_TIMER = 1
18         
19         def __init__(self, Event, Ref, callback=None, similarEPGCB=None):
20                 self.similarEPGCB = similarEPGCB
21                 self.cbFunc = callback
22                 self.currentService=Ref
23                 self.isRecording = (not Ref.ref.flags & eServiceReference.isGroup) and len(Ref.ref.getPath())
24                 self.event = Event
25                 self["epg_description"] = ScrollLabel()
26                 self["datetime"] = Label()
27                 self["channel"] = Label()
28                 self["duration"] = Label()
29                 self["key_red"] = Button("")
30                 if similarEPGCB is not None:
31                         self.SimilarBroadcastTimer = eTimer()
32                         self.SimilarBroadcastTimer.callback.append(self.getSimilarEvents)
33                 else:
34                         self.SimilarBroadcastTimer = None
35                 self.key_green_choice = self.ADD_TIMER
36                 if self.isRecording:
37                         self["key_green"] = Button("")
38                 else:
39                         self["key_green"] = Button(_("Add timer"))
40                 self["key_yellow"] = Button("")
41                 self["key_blue"] = Button("")
42                 self["actions"] = ActionMap(["OkCancelActions", "EventViewActions"],
43                         {
44                                 "cancel": self.close,
45                                 "ok": self.close,
46                                 "pageUp": self.pageUp,
47                                 "pageDown": self.pageDown,
48                                 "prevEvent": self.prevEvent,
49                                 "nextEvent": self.nextEvent,
50                                 "timerAdd": self.timerAdd,
51                                 "openSimilarList": self.openSimilarList
52                         })
53                 self.onShown.append(self.onCreate)
54
55         def onCreate(self):
56                 self.setService(self.currentService)
57                 self.setEvent(self.event)
58
59         def prevEvent(self):
60                 if self.cbFunc is not None:
61                         self.cbFunc(self.setEvent, self.setService, -1)
62
63         def nextEvent(self):
64                 if self.cbFunc is not None:
65                         self.cbFunc(self.setEvent, self.setService, +1)
66
67         def removeTimer(self, timer):
68                 timer.afterEvent = AFTEREVENT.NONE
69                 self.session.nav.RecordTimer.removeEntry(timer)
70                 self["key_green"].setText(_("Add timer"))
71                 self.key_green_choice = self.ADD_TIMER
72         
73         def timerAdd(self):
74                 event = self.event
75                 serviceref = self.currentService
76                 if event is None:
77                         return
78                 eventid = event.getEventId()
79                 refstr = serviceref.ref.toString()
80                 for timer in self.session.nav.RecordTimer.timer_list:
81                         if timer.eit == eventid and timer.service_ref.ref.toString() == refstr:
82                                 cb_func = lambda ret : not ret or self.removeTimer(timer)
83                                 self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName())
84                                 break
85                 else:
86                         newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, *parseEvent(self.event))
87                         self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
88
89         def finishedAdd(self, answer):
90                 print "finished add"
91                 if answer[0]:
92                         entry = answer[1]
93                         simulTimerList = self.session.nav.RecordTimer.record(entry)
94                         if simulTimerList is not None:
95                                 for x in simulTimerList:
96                                         if x.setAutoincreaseEnd(entry):
97                                                 self.session.nav.RecordTimer.timeChanged(x)
98                                 simulTimerList = self.session.nav.RecordTimer.record(entry)
99                                 if simulTimerList is not None:
100                                         self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, simulTimerList)
101                         self["key_green"].setText(_("Remove timer"))
102                         self.key_green_choice = self.REMOVE_TIMER
103                 else:
104                         self["key_green"].setText(_("Add timer"))
105                         self.key_green_choice = self.ADD_TIMER
106                         print "Timeredit aborted"               
107
108         def finishSanityCorrection(self, answer):
109                 self.finishedAdd(answer)
110
111         def setService(self, service):
112                 self.currentService=service
113                 if self.isRecording:
114                         self["channel"].setText(_("Recording"))
115                 else:
116                         name = self.currentService.getServiceName()
117                         if name is not None:
118                                 self["channel"].setText(name)
119                         else:
120                                 self["channel"].setText(_("unknown service"))
121
122         def sort_func(self,x,y):
123                 if x[1] < y[1]:
124                         return -1
125                 elif x[1] == y[1]:
126                         return 0
127                 else:
128                         return 1
129
130         def setEvent(self, event):
131                 self.event = event
132                 if event is None:
133                         return
134                 text = event.getEventName()
135                 short = event.getShortDescription()
136                 ext = event.getExtendedDescription()
137                 if len(short) > 0 and short != text:
138                         text = text + '\n\n' + short
139                 if len(ext) > 0:
140                         if len(text) > 0:
141                                 text = text + '\n\n'
142                         text = text + ext
143
144                 self.setTitle(event.getEventName())
145                 self["epg_description"].setText(text)
146                 self["datetime"].setText(event.getBeginTimeString())
147                 self["duration"].setText(_("%d min")%(event.getDuration()/60))
148                 self["key_red"].setText("")
149                 if self.SimilarBroadcastTimer is not None:
150                         self.SimilarBroadcastTimer.start(400,True)
151
152                 serviceref = self.currentService
153                 eventid = self.event.getEventId()
154                 refstr = serviceref.ref.toString()
155                 isRecordEvent = False
156                 for timer in self.session.nav.RecordTimer.timer_list:
157                         if timer.eit == eventid and timer.service_ref.ref.toString() == refstr:
158                                 isRecordEvent = True
159                                 break
160                 if isRecordEvent and self.key_green_choice != self.REMOVE_TIMER:
161                         self["key_green"].setText(_("Remove timer"))
162                         self.key_green_choice = self.REMOVE_TIMER
163                 elif not isRecordEvent and self.key_green_choice != self.ADD_TIMER:
164                         self["key_green"].setText(_("Add timer"))
165                         self.key_green_choice = self.ADD_TIMER
166
167
168         def pageUp(self):
169                 self["epg_description"].pageUp()
170
171         def pageDown(self):
172                 self["epg_description"].pageDown()
173
174         def getSimilarEvents(self):
175          # search similar broadcastings
176                 refstr = str(self.currentService)
177                 id = self.event.getEventId()
178                 epgcache = eEPGCache.getInstance()
179                 ret = epgcache.search(('NB', 100, eEPGCache.SIMILAR_BROADCASTINGS_SEARCH, refstr, id))
180                 if ret is not None:
181                         descr = self["epg_description"]
182                         text = descr.getText()
183                         text += '\n\n' + _('Similar broadcasts:')
184                         ret.sort(self.sort_func)
185                         for x in ret:
186                                 t = localtime(x[1])
187                                 text += '\n%d.%d.%d, %02d:%02d  -  %s'%(t[2], t[1], t[0], t[3], t[4], x[0])
188                         descr.setText(text)
189                         self["key_red"].setText(_("Similar"))
190
191         def openSimilarList(self):
192                 if self.similarEPGCB is not None and len(self["key_red"].getText()):
193                         id = self.event and self.event.getEventId()
194                         refstr = str(self.currentService)
195                         if id is not None:
196                                 self.similarEPGCB(id, refstr)
197
198 class EventViewSimple(Screen, EventViewBase):
199         def __init__(self, session, Event, Ref, callback=None, similarEPGCB=None):
200                 Screen.__init__(self, session)
201                 self.skinName = "EventView"
202                 EventViewBase.__init__(self, Event, Ref, callback, similarEPGCB)
203
204 class EventViewEPGSelect(Screen, EventViewBase):
205         def __init__(self, session, Event, Ref, callback=None, singleEPGCB=None, multiEPGCB=None, similarEPGCB=None):
206                 Screen.__init__(self, session)
207                 self.skinName = "EventView"
208                 EventViewBase.__init__(self, Event, Ref, callback, similarEPGCB)
209                 self["key_yellow"].setText(_("Single EPG"))
210                 self["key_blue"].setText(_("Multi EPG"))
211                 self["epgactions"] = ActionMap(["EventViewEPGActions"],
212                         {
213                                 "openSingleServiceEPG": singleEPGCB,
214                                 "openMultiServiceEPG": multiEPGCB,
215                         })