set avswitch to input vcr
[enigma2.git] / lib / python / Screens / ChannelSelection.py
1 from Screen import Screen
2 from Components.Button import Button
3 from Components.ServiceList import ServiceList
4 from Components.ActionMap import ActionMap
5 from EpgSelection import EPGSelection
6 from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr
7
8 from Screens.FixedMenu import FixedMenu
9
10 import xml.dom.minidom
11
12 class ChannelContextMenu(FixedMenu):
13         def __init__(self, session, csel):
14                 self.csel = csel
15                 
16                 menu = [("back", self.close)]
17
18                 if csel.mutableList is not None:
19                         if not csel.bouquet_mark_edit:
20                                 if csel.movemode:
21                                         menu.append(("disable move mode", self.toggleMoveMode))
22                                 else:
23                                         menu.append(("enable move mode", self.toggleMoveMode))
24
25                         if not csel.movemode:
26                                 if csel.bouquet_mark_edit:
27                                         menu.append(("end bouquet edit", self.bouquetMarkEnd))
28                                         menu.append(("abort bouquet edit", self.bouquetMarkAbort))
29                                 else:
30                                         menu.append(("edit bouquet...", self.bouquetMarkStart))
31
32                         if not csel.bouquet_mark_edit and not csel.movemode:
33                                 menu.append(("remove service", self.removeCurrentService))
34
35                 FixedMenu.__init__(self, session, "Channel Selection", menu)
36                 self.skinName = "Menu"
37
38         def removeCurrentService(self):
39                 self.close()
40                 self.csel.removeCurrentService()
41
42         def toggleMoveMode(self):
43                 self.csel.toggleMoveMode()
44                 self.close()
45
46         def bouquetMarkStart(self):
47                 self.close()
48                 self.csel.startMarkedEdit()
49
50         def bouquetMarkEnd(self):
51                 self.csel.endMarkedEdit(abort=False)
52                 self.close()
53
54         def bouquetMarkAbort(self):
55                 self.csel.endMarkedEdit(abort=True)
56                 self.close()
57  
58 class ChannelSelection(Screen):
59         def __init__(self, session):
60                 Screen.__init__(self, session)
61                 
62                 self.entry_marked = False
63                 self.movemode = False
64                 self.bouquet_mark_edit = False
65                 
66                 ## FIXME
67                 self.__marked = [ ]
68                 
69                 self["key_red"] = Button("All")
70                 self["key_green"] = Button("Provider")
71                 self["key_yellow"] = Button("Satellite")
72                 self["key_blue"] = Button("Favourites")
73                 
74                 self["list"] = ServiceList()
75                 self.setRoot(eServiceReference("""1:0:1:0:0:0:0:0:0:0:(type == 1)"""))
76                 
77                 #self["okbutton"] = Button("ok", [self.channelSelected])
78                 
79                 class ChannelActionMap(ActionMap):
80                         def action(self, contexts, action):
81                                 if action[:7] == "bouquet":
82                                         l = self.csel
83                                         l.setRoot(eServiceReference("1:7:1:0:0:0:0:0:0:0:" + action[8:]))
84                                 else:
85                                         if action == "cancel":
86                                                 l = self.csel
87                                                 if l.movemode: #movemode active?
88                                                         l.channelSelected() # unmark
89                                                         l.toggleMoveMode() # disable move mode
90                                                 elif l.bouquet_mark_edit:
91                                                         l.endMarkedEdit(True) # abort edit mode
92                                         ActionMap.action(self, contexts, action)
93
94                 self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions"], 
95                         {
96                                 "cancel": self.close,
97                                 "ok": self.channelSelected,
98                                 "mark": self.doMark,
99                                 "contextMenu": self.doContext,
100                             "showEPGList": self.showEPGList
101                         })
102                 self["actions"].csel = self
103
104         def showEPGList(self):
105                 ref=self["list"].getCurrent()
106                 ptr=eEPGCache.getInstance()
107                 if ptr.startTimeQuery(ref) != -1:
108                         self.session.open(EPGSelection, ref)
109                 else:
110                         print 'no epg for service', ref.toString()
111
112 #  multiple marked entry stuff ( edit mode, later multiepg selection )
113         def startMarkedEdit(self):
114                 l = self["list"]
115                 # add all services from the current list to internal marked set in listboxservicecontent
116                 if self.mutableList is not None:
117                         self.bouquetRoot = l.getRoot()
118                         self.clearMarks() # this clears the internal marked set in the listboxservicecontent
119                         self.bouquet_mark_edit = True
120                         self.__marked = l.getRootServices()
121                         for x in self.__marked:
122                                 l.addMarked(eServiceReference(x))
123
124         def removeCurrentService(self):
125                 l = self["list"]
126                 ref=l.getCurrent()
127                 if ref.valid() and self.mutableList is not None:
128                         self.mutableList.removeService(ref)
129                         pos = l.cursorGet()
130                         self.mutableList.flushChanges() #FIXME dont flush on each single removed service
131                         self.setRoot(l.getRoot())
132 #                       l.cursorSet(pos) #whats going wrong here????
133
134         def endMarkedEdit(self, abort):
135                 l = self["list"]
136                 if not abort and self.mutableList is not None:
137                         new_marked = set(l.getMarked())
138                         old_marked = set(self.__marked)
139                         removed = old_marked - new_marked
140                         added = new_marked - old_marked
141                         changed = False
142                         for x in removed:
143                                 changed = True
144                                 self.mutableList.removeService(eServiceReference(x))
145                         for x in added:
146                                 changed = True
147                                 self.mutableList.addService(eServiceReference(x))
148                         if changed:
149                                 self.mutableList.flushChanges()
150                                 self.setRoot(self.bouquetRoot)
151                 self.__marked = []
152                 self.clearMarks()
153                 self.bouquet_mark_edit = False
154                 self.bouquetRoot = None
155
156         def setRoot(self, root):
157                 if not self.movemode:
158                         if not self.bouquet_mark_edit:
159                                 serviceHandler = eServiceCenter.getInstance()
160                                 list = serviceHandler.list(root)
161                                 if list is not None:
162                                         self.mutableList = list.startEdit()
163                                 else:
164                                         self.mutableList = None
165                         self["list"].setRoot(root)
166
167         def clearMarks(self):
168                 self["list"].clearMarks()
169
170         def doMark(self):
171                 if not self.bouquet_mark_edit:
172                         return
173                 ref = self["list"].getCurrent()
174                 if self["list"].isMarked(ref):
175                         self["list"].removeMarked(ref)
176                 else:
177                         self["list"].addMarked(ref)
178
179         def channelSelected(self):
180                 ref = self["list"].getCurrent()
181                 if self.movemode:
182                         if self.entry_marked:
183                                 self["list"].setCurrentMarked(False)
184                                 self.entry_marked = False
185                         else:
186                                 self["list"].setCurrentMarked(True)
187                                 self.entry_marked = True
188                 elif (ref.flags & 7) == 7:
189                         self.setRoot(ref)
190                 elif self.bouquet_mark_edit:
191                         self.doMark()
192                 else:
193                         self.session.nav.playService(ref)
194                         self.close()
195
196         #called from infoBar
197         def zap(self):
198                 self.session.nav.playService(self["list"].getCurrent())
199
200         def moveUp(self):
201                 self["list"].moveUp()
202
203         def moveDown(self):
204                 self["list"].moveDown()
205
206         def doContext(self):
207                 self.session.open(ChannelContextMenu, self)
208
209         def toggleMoveMode(self):
210                 if self.movemode:
211                         self.movemode = False
212                         self.mutableList.flushChanges() # FIXME add check if changes was made
213                 else:
214                         self.movemode = True