make bouquet +/- useable in multiepg to change directly from one to another bouquet 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, 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                                 "zapTo": 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 != None:
157                         self.closeRecursive = True
158                         ref = self["list"].getCurrent()[1]
159                         self.zapFunc(ref.ref)
160
161         def eventSelected(self):
162                 if self.type == EPG_TYPE_MULTI:
163                         self.zapTo()
164                 else:
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                 else:
212                         if state == 1:
213                                 self["now_button_sel"].show()
214                                 self["now_button"].hide()
215                         else:
216                                 self["now_button"].show()
217                                 self["now_button_sel"].hide()
218
219                         if state == 2:
220                                 self["next_button_sel"].show()
221                                 self["next_button"].hide()
222                         else:
223                                 self["next_button"].show()
224                                 self["next_button_sel"].hide()
225
226                         if state == 3:
227                                 self["more_button_sel"].show()
228                                 self["more_button"].hide()
229                         else:
230                                 self["more_button"].show()
231                                 self["more_button_sel"].hide()
232
233         def onSelectionChanged(self):
234                 if self.type == EPG_TYPE_MULTI:
235                         count = self["list"].getCurrentChangeCount()
236                         if self.ask_time != -1:
237                                 self.applyButtonState(0)
238                         elif count > 1:
239                                 self.applyButtonState(3)
240                         elif count > 0:
241                                 self.applyButtonState(2)
242                         else:
243                                 self.applyButtonState(1)
244                         days = [ _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ]
245                         datastr = ""
246                         event = self["list"].getCurrent()[0]
247                         if event is not None:
248                                 now = time()
249                                 beg = event.getBeginTime()
250                                 nowTime = localtime(now)
251                                 begTime = localtime(beg)
252                                 if nowTime[2] != begTime[2]:
253                                         datestr = '%s %d.%d.'%(days[begTime[6]], begTime[2], begTime[1])
254                                 else:
255                                         datestr = '%s %d.%d.'%(_("Today"), begTime[2], begTime[1])
256                         self["date"].setText(datestr)