2 from Screens.Screen import Screen
3 from Screens.MessageBox import MessageBox
4 from Components.ActionMap import ActionMap
5 from Components.Label import Label
6 from Components.Input import Input
7 from Components.GUIComponent import *
8 from Components.Pixmap import Pixmap
9 from Components.MenuList import MenuList
10 from Components.FileList import FileEntryComponent, FileList
11 from Navigation import Navigation
12 import NavigationInstance
13 from Screens.ChannelSelection import SimpleChannelSelection
14 from ServiceReference import ServiceReference
15 from Plugins.Plugin import PluginDescriptor
16 from Tools.Directories import resolveFilename, SCOPE_CONFIG
17 import xml.dom.minidom
18 from Tools.XMLTools import elementsWithTag
24 def addAlternative(service1, service2):
25 if not alternatives.has_key(service1):
26 alternatives[service1] = []
27 alternatives[service1].append(service2)
28 if not alternatives.has_key(service2):
29 alternatives[service2] = []
30 alternatives[service2].append(service1)
32 def removeAlternative(service1, service2):
33 alternatives[service1].remove(service2)
34 alternatives[service2].remove(service1)
35 if len(alternatives[service1]) == 0:
36 del alternatives[service1]
37 if len(alternatives[service2]) == 0:
38 del alternatives[service2]
40 class AlternativeZapping(Screen):
42 <screen position="100,100" size="560,400" title="Services alternatives setup..." >
43 <widget name="red" position="0,0" size="140,40" backgroundColor="red" halign="center" valign="center" font="Regular;21" />
44 <widget name="green" position="140,0" size="140,40" backgroundColor="green" halign="center" valign="center" font="Regular;21" />
45 <widget name="yellow" position="280,0" size="140,40" backgroundColor="yellow" halign="center" valign="center" font="Regular;21" />
46 <widget name="blue" position="420,0" size="140,40" backgroundColor="blue" halign="center" valign="center" font="Regular;21" />
47 <widget name="serviceslist" position="0,40" size="280,360" />
48 <widget name="alternativeslist" position="280,40" size="280,360" selectionDisabled="1" />
50 def __init__(self, session):
51 self.skin = AlternativeZapping.skin
52 Screen.__init__(self, session)
54 self.filename = resolveFilename(SCOPE_CONFIG, "alternatives.xml")
57 self["red"] = self.red
58 self.green = Label(_("Add service"))
59 self["green"] = self.green
60 self.yellow = Label("")
61 self["yellow"] = self.yellow
63 self["blue"] = self.blue
65 self.alternatives = {}
67 self.serviceslist = []
68 self.alternativeslist = []
71 self.loadAlternatives()
74 self["serviceslist"] = MenuList(self.serviceslist)
75 self["alternativeslist"] = MenuList(self.alternativeslist)
77 self.onShown.append(self.updateServices)
78 self.onShown.append(self.updateAlternatives)
80 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions", "ColorActions"],
89 "green": self.greenKey,
90 "yellow": self.yellowKey,
94 def saveAlternatives(self):
95 doc = xml.dom.minidom.Document()
96 root_element = doc.createElement('alternatives')
97 doc.appendChild(root_element)
98 root_element.appendChild(doc.createTextNode("\n"))
100 for alternative in self.alternatives.keys():
101 t = doc.createTextNode("\t")
102 root_element.appendChild(t)
103 t = doc.createElement('service')
104 t.setAttribute("ref", alternative)
105 root_element.appendChild(t)
106 t.appendChild(doc.createTextNode("\n"))
107 for x in self.alternatives[alternative]:
108 t.appendChild(doc.createTextNode("\t\t"))
109 l = doc.createElement('alternative')
110 l.setAttribute("ref", str(x))
112 t.appendChild(doc.createTextNode("\n"))
113 t.appendChild(doc.createTextNode("\t"))
114 root_element.appendChild(t)
115 t = doc.createTextNode("\n")
116 root_element.appendChild(t)
117 file = open(self.filename, "w")
122 def loadAlternatives(self):
123 self.alternatives = {}
125 doc = xml.dom.minidom.parse(self.filename)
127 root = doc.childNodes[0]
128 for service in elementsWithTag(root.childNodes, 'service'):
129 newService = str(service.getAttribute('ref'))
130 if not self.alternatives.has_key(newService):
131 self.alternatives[newService] = []
132 for alternative in elementsWithTag(service.childNodes, 'alternative'):
133 newAlternative = str(alternative.getAttribute('ref'))
134 self.alternatives[newService].append(newAlternative)
135 addAlternative(newService, newAlternative)
138 self.saveAlternatives()
142 self["serviceslist"].instance.moveSelection(self["serviceslist"].instance.moveUp)
143 self.updateAlternatives()
146 self["serviceslist"].instance.moveSelection(self["serviceslist"].instance.moveDown)
147 self.updateAlternatives()
156 for x in self.alternatives[self["serviceslist"].getCurrent()[1]]:
157 removeAlternative(self["serviceslist"].getCurrent()[1], x)
158 if len(self.serviceslist) > 0:
159 del self.alternatives[self["serviceslist"].getCurrent()[1]]
160 self.updateServices()
161 self.updateAlternatives()
163 def finishedAlternativeSelection(self, args):
164 self.alternatives[self["serviceslist"].getCurrent()[1]].append(str(ServiceReference(args)))
165 addAlternative(self["serviceslist"].getCurrent()[1], str(ServiceReference(args)))
166 self.updateAlternatives()
168 def updateServices(self):
169 self.serviceslist = []
171 for x in self.alternatives.keys():
172 self.serviceslist.append((ServiceReference(x).getServiceName(), x))
174 self["serviceslist"].l.setList(self.serviceslist)
175 if len(self.serviceslist) > 0:
176 self.yellow.setText(_("Add alternative"))
177 self.red.setText(_("Remove service"))
179 self.yellow.setText("")
182 def updateAlternatives(self):
183 self.alternativeslist = []
185 if len(self.serviceslist) > 0:
186 alternativelist = self.alternatives[self["serviceslist"].getCurrent()[1]]
188 for x in alternativelist:
189 self.alternativeslist.append((ServiceReference(x).getServiceName(), x))
191 self["alternativeslist"].l.setList(self.alternativeslist)
194 self.session.openWithCallback(self.finishedChannelSelection, SimpleChannelSelection, _("Select reference service"))
196 def finishedChannelSelection(self, args):
197 if not self.alternatives.has_key(str(ServiceReference(args))):
198 self.alternatives[str(ServiceReference(args))] = []
199 print "alternatives:", self.alternatives
200 self.updateServices()
201 self.updateAlternatives()
204 if len(self.serviceslist) > 0:
205 self.session.openWithCallback(self.finishedAlternativeSelection, SimpleChannelSelection, _("Select alternative service"))
211 oldPlayService = NavigationInstance.instance.playService
213 def playService(self, ref):
214 if not oldPlayService(ref):
215 if alternatives.has_key(str(ServiceReference(ref))):
216 for x in alternatives[str(ServiceReference(ref))]:
217 if oldPlayService(ServiceReference(x).ref):
222 def autostart(reason):
224 NavigationInstance.instance.playService = type(NavigationInstance.instance.playService)(playService, NavigationInstance, Navigation)
226 def AlternativeZappingSetup(session):
227 session.open(AlternativeZapping)
230 return [PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart),
231 PluginDescriptor(name="Alternative services setup" , description="Defines alternatives for services.", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=AlternativeZappingSetup)]