use PyObject_Callback instead of PyEval_Callback (memleak fix?)
[enigma2.git] / lib / python / Screens / EpgSelection.py
1 from Screen import Screen
2 from Components.Button import Button
3 from Components.EpgList import *
4 from Components.ActionMap import ActionMap
5 from Screens.EventView import EventView
6 from enigma import eServiceReference, eServiceEventPtr
7 from Screens.FixedMenu import FixedMenu
8 from RecordTimer import RecordTimerEntry, parseEvent
9 from TimerEdit import TimerEditList
10 from TimerEntry import TimerEntry
11 from ServiceReference import ServiceReference
12
13 import xml.dom.minidom
14
15 class EPGSelection(Screen):
16         def __init__(self, session, service):
17                 Screen.__init__(self, session)
18
19                 self["key_red"] = Button("")
20                 self["key_green"] = Button(_("Add timer"))
21
22                 if isinstance(service, eServiceReference):
23                         self.type = EPG_TYPE_SINGLE
24                         self["key_yellow"] = Button()
25                         self["key_blue"] = Button()
26                         self.currentService=ServiceReference(service)
27                 else:
28                         self.type = EPG_TYPE_MULTI
29                         self["key_yellow"] = Button(_("Prev"))
30                         self["key_blue"] = Button(_("Next"))
31                         self.services = service
32
33                 self["list"] = EPGList(self.type)
34
35                 class ChannelActionMap(ActionMap):
36                         def action(self, contexts, action):
37                                 ActionMap.action(self, contexts, action)
38
39                 self["actions"] = ChannelActionMap(["EPGSelectActions", "OkCancelActions"],
40                         {
41                                 "cancel": self.close,
42                                 "ok": self.eventSelected,
43                                 "timerAdd": self.timerAdd,
44                                 "yellow": self.yellowButtonPressed,
45                                 "blue": self.blueButtonPressed
46                         })
47                 self["actions"].csel = self
48
49                 self.onLayoutFinish.append(self.onCreate)
50
51         #just used in multipeg
52         def onCreate(self):
53                 l = self["list"]
54                 if self.type == EPG_TYPE_MULTI:
55                         l.recalcEntrySize()
56                         l.fillMultiEPG(self.services)
57                 else:
58                         if SINGLE_CPP == 0:
59                                 l.recalcEntrySize()
60                         l.fillSingleEPG(self.currentService)
61
62         def eventViewCallback(self, setEvent, setService, val):
63                 l = self["list"]
64                 old = l.getCurrent()
65                 if val == -1:
66                         self.moveUp()
67                 elif val == +1:
68                         self.moveDown()
69                 cur = l.getCurrent()
70                 if self.type == EPG_TYPE_SINGLE:
71                         setEvent(cur)
72                 else:
73                         if self.type == EPG_TYPE_MULTI and cur[0] is None and cur[1].ref != old[1].ref:
74                                 self.eventViewCallback(setEvent, setService, val)
75                         else:
76                                 setEvent(cur[0])
77                                 setService(cur[1])
78
79         def eventSelected(self):
80                 if self.type == EPG_TYPE_SINGLE:
81                         event = self["list"].getCurrent()
82                         service = self.currentService
83                 else: # EPG_TYPE_MULTI
84                         cur = self["list"].getCurrent()
85                         event = cur[0]
86                         service = cur[1]
87                 if event is not None:
88                         self.session.open(EventView, event, service, self.eventViewCallback)
89
90         def yellowButtonPressed(self):
91                 if self.type == EPG_TYPE_MULTI:
92                         self["list"].updateMultiEPG(-1)
93
94         def blueButtonPressed(self):
95                 if self.type == EPG_TYPE_MULTI:
96                         self["list"].updateMultiEPG(1)
97
98         def timerAdd(self):
99                 if self.type == EPG_TYPE_SINGLE:
100                         event = self["list"].getCurrent()
101                         serviceref = self.currentService
102                 else:
103                         cur = self["list"].getCurrent()
104                         event = cur[0]
105                         serviceref = cur[1]
106                 if event is None:
107                         return
108                 newEntry = RecordTimerEntry(serviceref, *parseEvent(event))
109                 self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry)
110
111         def timerEditFinished(self, answer):
112                 if (answer[0]):
113                         self.session.nav.RecordTimer.record(answer[1])
114                 else:
115                         print "Timeredit aborted"       
116
117         def moveUp(self):
118                 self["list"].moveUp()
119
120         def moveDown(self):
121                 self["list"].moveDown()