audio selection - fake
[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                         self.mutableList.flushChanges() #FIXME dont flush on each single removed service
130                         self.setRoot(l.getRoot())
131
132         def endMarkedEdit(self, abort):
133                 l = self["list"]
134                 if not abort and self.mutableList is not None:
135                         new_marked = set(l.getMarked())
136                         old_marked = set(self.__marked)
137                         removed = old_marked - new_marked
138                         added = new_marked - old_marked
139                         changed = False
140                         for x in removed:
141                                 changed = True
142                                 self.mutableList.removeService(eServiceReference(x))
143                         for x in added:
144                                 changed = True
145                                 self.mutableList.addService(eServiceReference(x))
146                         if changed:
147                                 self.mutableList.flushChanges()
148                                 self.setRoot(self.bouquetRoot)
149                 self.__marked = []
150                 self.clearMarks()
151                 self.bouquet_mark_edit = False
152                 self.bouquetRoot = None
153
154         def setRoot(self, root):
155                 if not self.movemode:
156                         if not self.bouquet_mark_edit:
157                                 serviceHandler = eServiceCenter.getInstance()
158                                 list = serviceHandler.list(root)
159                                 if list is not None:
160                                         self.mutableList = list.startEdit()
161                                 else:
162                                         self.mutableList = None
163                         self["list"].setRoot(root)
164
165         def clearMarks(self):
166                 self["list"].clearMarks()
167
168         def doMark(self):
169                 if not self.bouquet_mark_edit:
170                         return
171                 ref = self["list"].getCurrent()
172                 if self["list"].isMarked(ref):
173                         self["list"].removeMarked(ref)
174                 else:
175                         self["list"].addMarked(ref)
176
177         def channelSelected(self):
178                 ref = self["list"].getCurrent()
179                 if self.movemode:
180                         if self.entry_marked:
181                                 self["list"].setCurrentMarked(False)
182                                 self.entry_marked = False
183                         else:
184                                 self["list"].setCurrentMarked(True)
185                                 self.entry_marked = True
186                 elif (ref.flags & 7) == 7:
187                         self.setRoot(ref)
188                 elif self.bouquet_mark_edit:
189                         self.doMark()
190                 else:
191                         self.session.nav.playService(ref)
192                         self.close()
193
194         #called from infoBar
195         def zap(self):
196                 self.session.nav.playService(self["list"].getCurrent())
197
198         def moveUp(self):
199                 self["list"].moveUp()
200
201         def moveDown(self):
202                 self["list"].moveDown()
203
204         def doContext(self):
205                 self.session.open(ChannelContextMenu, self)
206
207         def toggleMoveMode(self):
208                 if self.movemode:
209                         if self.entry_marked:
210                                 self.channelSelected() # unmark current entry
211                         self.movemode = False
212                         self.mutableList.flushChanges() # FIXME add check if changes was made
213                 else:
214                         self.movemode = True