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 = []
70 self.loadAlternatives()
71 self["serviceslist"] = MenuList(self.serviceslist)
72 self["alternativeslist"] = MenuList(self.alternativeslist)
74 self.onShown.append(self.updateServices)
75 self.onShown.append(self.updateAlternatives)
77 self["actions"] = ActionMap(["DirectionActions", "OkCancelActions", "ColorActions"],
86 "green": self.greenKey,
87 "yellow": self.yellowKey,
91 def saveAlternatives(self):
92 doc = xml.dom.minidom.Document()
93 root_element = doc.createElement('alternatives')
94 doc.appendChild(root_element)
95 root_element.appendChild(doc.createTextNode("\n"))
97 for alternative in self.alternatives.keys():
98 t = doc.createTextNode("\t")
99 root_element.appendChild(t)
100 t = doc.createElement('service')
101 t.setAttribute("ref", alternative)
102 root_element.appendChild(t)
103 t.appendChild(doc.createTextNode("\n"))
104 for x in self.alternatives[alternative]:
105 t.appendChild(doc.createTextNode("\t\t"))
106 l = doc.createElement('alternative')
107 l.setAttribute("ref", str(x))
109 t.appendChild(doc.createTextNode("\n"))
110 t.appendChild(doc.createTextNode("\t"))
111 root_element.appendChild(t)
112 t = doc.createTextNode("\n")
113 root_element.appendChild(t)
114 file = open(self.filename, "w")
119 def loadAlternatives(self):
120 self.alternatives = {}
122 doc = xml.dom.minidom.parse(self.filename)
124 root = doc.childNodes[0]
125 for service in elementsWithTag(root.childNodes, 'service'):
126 newService = str(service.getAttribute('ref'))
127 if not self.alternatives.has_key(newService):
128 self.alternatives[newService] = []
129 for alternative in elementsWithTag(service.childNodes, 'alternative'):
130 newAlternative = str(alternative.getAttribute('ref'))
131 self.alternatives[newService].append(newAlternative)
132 addAlternative(newService, newAlternative)
135 self.saveAlternatives()
139 self["serviceslist"].instance.moveSelection(self["serviceslist"].instance.moveUp)
140 self.updateAlternatives()
143 self["serviceslist"].instance.moveSelection(self["serviceslist"].instance.moveDown)
144 self.updateAlternatives()
153 for x in self.alternatives[self["serviceslist"].getCurrent()[1]]:
154 removeAlternative(self["serviceslist"].getCurrent()[1], x)
155 if len(self.serviceslist) > 0:
156 del self.alternatives[self["serviceslist"].getCurrent()[1]]
157 self.updateServices()
158 self.updateAlternatives()
160 def finishedAlternativeSelection(self, args):
161 self.alternatives[self["serviceslist"].getCurrent()[1]].append(str(ServiceReference(args)))
162 addAlternative(self["serviceslist"].getCurrent()[1], str(ServiceReference(args)))
163 self.updateAlternatives()
165 def updateServices(self):
166 self.serviceslist = []
168 for x in self.alternatives.keys():
169 self.serviceslist.append((ServiceReference(x).getServiceName(), x))
171 self["serviceslist"].l.setList(self.serviceslist)
172 if len(self.serviceslist) > 0:
173 self.yellow.setText(_("Add alternative"))
174 self.red.setText(_("Remove service"))
176 self.yellow.setText("")
179 def updateAlternatives(self):
180 self.alternativeslist = []
182 if len(self.serviceslist) > 0:
183 alternativelist = self.alternatives[self["serviceslist"].getCurrent()[1]]
185 for x in alternativelist:
186 self.alternativeslist.append((ServiceReference(x).getServiceName(), x))
188 self["alternativeslist"].l.setList(self.alternativeslist)
191 self.session.openWithCallback(self.finishedChannelSelection, SimpleChannelSelection, _("Select reference service"))
193 def finishedChannelSelection(self, args):
194 if not self.alternatives.has_key(str(ServiceReference(args))):
195 self.alternatives[str(ServiceReference(args))] = []
196 print "alternatives:", self.alternatives
197 self.updateServices()
198 self.updateAlternatives()
201 if len(self.serviceslist) > 0:
202 self.session.openWithCallback(self.finishedAlternativeSelection, SimpleChannelSelection, _("Select alternative service"))
208 oldPlayService = NavigationInstance.instance.playService
210 def playService(self, ref):
211 if not oldPlayService(ref):
212 if alternatives.has_key(str(ServiceReference(ref))):
213 for x in alternatives[str(ServiceReference(ref))]:
214 if oldPlayService(ServiceReference(x).ref):
219 def autostart(reason):
221 NavigationInstance.instance.playService = type(NavigationInstance.instance.playService)(playService, NavigationInstance, Navigation)
223 def AlternativeZappingSetup(session):
224 session.open(AlternativeZapping)
227 return [PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart),
228 PluginDescriptor(name="Alternative services setup" , description="Defines alternatives for services.", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=AlternativeZappingSetup)]