fix bluescreen when try to use the epg time search function in single epg
[vuplus_dvbapp] / lib / python / Screens / EpgSelection.py
1 from Screen import Screen
2 from Components.Button import Button
3 from Components.Pixmap import Pixmap
4 from Components.Label import Label
5 from Components.EpgList import *
6 from Components.ActionMap import ActionMap
7 from Components.ScrollLabel import ScrollLabel
8 from Screens.EventView import EventViewSimple
9 from TimeDateInput import TimeDateInput
10 from enigma import eServiceReference, eServiceEventPtr
11 from Screens.FixedMenu import FixedMenu
12 from RecordTimer import RecordTimerEntry, parseEvent
13 from TimerEdit import TimerEditList
14 from TimerEntry import TimerEntry
15 from ServiceReference import ServiceReference
16 from Components.config import config, currentConfigSelectionElement
17 from time import localtime
18
19 import xml.dom.minidom
20
21 class EPGSelection(Screen):
22         def __init__(self, session, service, zapFunc=None, eventid=None):
23                 Screen.__init__(self, session)
24                 self.asked_specific_time = False
25                 self["key_red"] = Button("")
26                 self.closeRecursive = False
27                 if isinstance(service, str) and eventid != None:
28                         self.type = EPG_TYPE_SIMILAR
29                         self["key_yellow"] = Button()
30                         self["key_blue"] = Button()
31                         self["key_red"] = Button()
32                         self.currentService=service
33                         self.eventid = eventid
34                 elif isinstance(service, eServiceReference) or isinstance(service, str):
35                         self.type = EPG_TYPE_SINGLE
36                         self["key_yellow"] = Button()
37                         self["key_blue"] = Button()
38                         self.currentService=ServiceReference(service)
39                 else:
40                         self.skinName = "EPGSelectionMulti"
41                         self.type = EPG_TYPE_MULTI
42                         self["key_yellow"] = Button(_("Prev"))
43                         self["key_blue"] = Button(_("Next"))
44                         self["now_button"] = Pixmap()
45                         self["next_button"] = Pixmap()
46                         self["more_button"] = Pixmap()
47                         self["now_button_sel"] = Pixmap()
48                         self["next_button_sel"] = Pixmap()
49                         self["more_button_sel"] = Pixmap()
50                         self["now_text"] = Label()
51                         self["next_text"] = Label()
52                         self["more_text"] = Label()
53                         self["date"] = Label()
54                         self.services = service
55                         self.zapFunc = zapFunc
56
57                 self["key_green"] = Button(_("Add timer"))
58                 self["list"] = EPGList(type = self.type, selChangedCB = self.onSelectionChanged, timer = self.session.nav.RecordTimer)
59
60                 class ChannelActionMap(ActionMap):
61                         def action(self, contexts, action):
62                                 return ActionMap.action(self, contexts, action)
63
64                 self["actions"] = ChannelActionMap(["EPGSelectActions", "OkCancelActions"],
65                         {
66                                 "cancel": self.closeScreen,
67                                 "ok": self.eventSelected,
68                                 "timerAdd": self.timerAdd,
69                                 "yellow": self.yellowButtonPressed,
70                                 "blue": self.blueButtonPressed,
71                                 "info": self.infoKeyPressed,
72                                 "zapTo": self.zapTo,
73                                 "input_date_time": self.enterDateTime
74                         })
75                 self["actions"].csel = self
76
77                 self.onLayoutFinish.append(self.onCreate)
78
79         def enterDateTime(self):
80                 if self.type == EPG_TYPE_MULTI:
81                         self.session.openWithCallback(self.onDateTimeInputClosed, TimeDateInput)
82
83         def onDateTimeInputClosed(self, ret):
84                 if len(ret) > 1:
85                         if ret[0]:
86                                 self.asked_specific_time=True
87                                 self["list"].fillMultiEPG(self.services, ret[1])
88
89         def closeScreen(self):
90                 self.close(self.closeRecursive)
91
92         def infoKeyPressed(self):
93                 if self.type == EPG_TYPE_MULTI or self.type == EPG_TYPE_SIMILAR:
94                         cur = self["list"].getCurrent()
95                         event = cur[0]
96                         service = cur[1]
97                 else:
98                         event = self["list"].getCurrent()
99                         service = self.currentService
100                 if event is not None:
101                         if self.type != EPG_TYPE_SIMILAR:
102                                 self.session.open(EventViewSimple, event, service, self.eventViewCallback, self.openSimilarList)
103                         else:
104                                 self.session.open(EventViewSimple, event, service, self.eventViewCallback)
105
106         def openSimilarList(self, eventid, refstr):
107                 self.session.open(EPGSelection, refstr, None, eventid)
108
109         #just used in multipeg
110         def onCreate(self):
111                 l = self["list"]
112                 if self.type == EPG_TYPE_MULTI:
113                         l.recalcEntrySize()
114                         l.fillMultiEPG(self.services)
115                 elif self.type == EPG_TYPE_SINGLE:
116                         if SINGLE_CPP == 0:
117                                 l.recalcEntrySize()
118                         l.fillSingleEPG(self.currentService)
119                 else:
120                         l.recalcEntrySize()
121                         l.fillSimilarList(self.currentService, self.eventid)
122
123         def eventViewCallback(self, setEvent, setService, val):
124                 l = self["list"]
125                 old = l.getCurrent()
126                 if val == -1:
127                         self.moveUp()
128                 elif val == +1:
129                         self.moveDown()
130                 cur = l.getCurrent()
131                 if self.type == EPG_TYPE_SINGLE:
132                         setEvent(cur)
133                 else:
134                         if self.type == EPG_TYPE_MULTI and cur[0] is None and cur[1].ref != old[1].ref:
135                                 self.eventViewCallback(setEvent, setService, val)
136                         else:
137                                 setService(cur[1])
138                                 setEvent(cur[0])
139
140         def zapTo(self): # just used in multiepg
141                 if self.zapFunc != None:
142                         self.closeRecursive = True
143                         ref = self["list"].getCurrent()[1]
144                         self.zapFunc(ref.ref)
145
146         def eventSelected(self):
147                 if self.type == EPG_TYPE_MULTI:
148                         self.zapTo()
149                 else:
150                         self.infoKeyPressed()
151
152         def yellowButtonPressed(self):
153                 if self.type == EPG_TYPE_MULTI:
154                         self["list"].updateMultiEPG(-1)
155
156         def blueButtonPressed(self):
157                 if self.type == EPG_TYPE_MULTI:
158                         self["list"].updateMultiEPG(1)
159
160         def timerAdd(self):
161                 if self.type == EPG_TYPE_SINGLE:
162                         event = self["list"].getCurrent()
163                         serviceref = self.currentService
164                 else:
165                         cur = self["list"].getCurrent()
166                         event = cur[0]
167                         serviceref = cur[1]
168                 if event is None:
169                         return
170                 newEntry = RecordTimerEntry(serviceref, *parseEvent(event))
171                 self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry)
172
173         def timerEditFinished(self, answer):
174                 if answer[0]:
175                         self.session.nav.RecordTimer.record(answer[1])
176                 else:
177                         print "Timeredit aborted"       
178
179         def moveUp(self):
180                 self["list"].moveUp()
181
182         def moveDown(self):
183                 self["list"].moveDown()
184
185         def applyButtonState(self, state):
186                 if state == 0:
187                         self["now_button"].hide()
188                         self["now_button_sel"].hide()
189                         self["next_button"].hide()
190                         self["next_button_sel"].hide()
191                         self["more_button"].hide()
192                         self["more_button_sel"].hide()
193                         self["now_text"].hide()
194                         self["next_text"].hide()
195                         self["more_text"].hide()
196                 else:
197                         if state == 1:
198                                 self["now_button_sel"].show()
199                                 self["now_button"].hide()
200                         else:
201                                 self["now_button"].show()
202                                 self["now_button_sel"].hide()
203
204                         if state == 2:
205                                 self["next_button_sel"].show()
206                                 self["next_button"].hide()
207                         else:
208                                 self["next_button"].show()
209                                 self["next_button_sel"].hide()
210
211                         if state == 3:
212                                 self["more_button_sel"].show()
213                                 self["more_button"].hide()
214                         else:
215                                 self["more_button"].show()
216                                 self["more_button_sel"].hide()
217
218         def onSelectionChanged(self):
219                 if self.type == EPG_TYPE_MULTI:
220                         count = self["list"].getCurrentChangeCount()
221                         if self.asked_specific_time:
222                                 self.applyButtonState(0)
223                         elif count > 1:
224                                 self.applyButtonState(3)
225                         elif count > 0:
226                                 self.applyButtonState(2)
227                         else:
228                                 self.applyButtonState(1)
229                         days = [ _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ]
230                         datastr = ""
231                         event = self["list"].getCurrent()[0]
232                         if event is not None:
233                                 now = time()
234                                 beg = event.getBeginTime()
235                                 nowTime = localtime(now)
236                                 begTime = localtime(beg)
237                                 if nowTime[2] != begTime[2]:
238                                         datestr = '%s %d.%d.'%(days[begTime[6]], begTime[2], begTime[1])
239                                 else:
240                                         datestr = '%s %d.%d.'%(_("Today"), begTime[2], begTime[1])
241                         self["date"].setText(datestr)