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