add support for event progressbar per service in channelselection
[vuplus_dvbapp] / lib / python / Components / ServiceList.py
1 from HTMLComponent import HTMLComponent
2 from GUIComponent import GUIComponent
3 from skin import parseColor, parseFont
4
5 from enigma import eListboxServiceContent, eListbox, eServiceCenter, eServiceReference, gFont, eRect
6 from Tools.LoadPixmap import LoadPixmap
7
8 from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
9
10 from Components.config import config
11
12 class ServiceList(HTMLComponent, GUIComponent):
13         MODE_NORMAL = 0
14         MODE_FAVOURITES = 1
15
16         def __init__(self):
17                 GUIComponent.__init__(self)
18                 self.l = eListboxServiceContent()
19
20                 pic = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png"))
21                 if pic:
22                         self.l.setPixmap(self.l.picFolder, pic)
23
24                 pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/marker.png"))
25                 if pic:
26                         self.l.setPixmap(self.l.picMarker, pic)
27
28                 pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_s-fs8.png"))
29                 if pic:
30                         self.l.setPixmap(self.l.picDVB_S, pic)
31
32                 pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_c-fs8.png"))
33                 if pic:
34                         self.l.setPixmap(self.l.picDVB_C, pic)
35
36                 pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_t-fs8.png"))
37                 if pic:
38                         self.l.setPixmap(self.l.picDVB_T, pic)
39
40                 pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_service_group-fs8.png"))
41                 if pic:
42                         self.l.setPixmap(self.l.picServiceGroup, pic)
43
44                 self.root = None
45                 self.mode = self.MODE_NORMAL
46                 self.ItemHeight = 28
47                 self.ServiceNameFont = parseFont("Regular;22", ((1,1),(1,1)))
48                 self.ServiceInfoFont = parseFont("Regular;18", ((1,1),(1,1)))
49                 self.ServiceNumberFont = parseFont("Regular;20", ((1,1),(1,1)))
50                 self.onSelectionChanged = [ ]
51
52         def applySkin(self, desktop, parent):
53                 attribs = [ ]
54                 if self.skinAttributes is not None:
55                         attribs = [ ]
56                         for (attrib, value) in self.skinAttributes:
57                                 if attrib == "foregroundColorMarked":
58                                         self.l.setColor(eListboxServiceContent.markedForeground, parseColor(value))
59                                 elif attrib == "foregroundColorMarkedSelected":
60                                         self.l.setColor(eListboxServiceContent.markedForegroundSelected, parseColor(value))
61                                 elif attrib == "backgroundColorMarked":
62                                         self.l.setColor(eListboxServiceContent.markedBackground, parseColor(value))
63                                 elif attrib == "backgroundColorMarkedSelected":
64                                         self.l.setColor(eListboxServiceContent.markedBackgroundSelected, parseColor(value))
65                                 elif attrib == "foregroundColorServiceNotAvail":
66                                         self.l.setColor(eListboxServiceContent.serviceNotAvail, parseColor(value))
67                                 elif attrib == "colorEventProgressbar":
68                                         self.l.setColor(eListboxServiceContent.serviceEventProgressbarColor, parseColor(value))
69                                 elif attrib == "colorEventProgressbarSelected":
70                                         self.l.setColor(eListboxServiceContent.serviceEventProgressbarColorSelected, parseColor(value))
71                                 elif attrib == "colorEventProgressbarBorder":
72                                         self.l.setColor(eListboxServiceContent.serviceEventProgressbarBorderColor, parseColor(value))
73                                 elif attrib == "colorEventProgressbarBorderSelected":
74                                         self.l.setColor(eListboxServiceContent.serviceEventProgressbarBorderColorSelected, parseColor(value))
75                                 elif attrib == "picServiceEventProgressbar":
76                                         pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value))
77                                         if pic:
78                                                 self.l.setPixmap(self.l.picServiceEventProgressbar, pic)
79                                 elif attrib == "serviceItemHeight":
80                                         self.ItemHeight = int(value)
81                                 elif attrib == "serviceNameFont":
82                                         self.ServiceNameFont = parseFont(value, ((1,1),(1,1)))
83                                 elif attrib == "serviceInfoFont":
84                                         self.ServiceInfoFont = parseFont(value, ((1,1),(1,1)))
85                                 elif attrib == "serviceNumberFont":
86                                         self.ServiceNumberFont = parseFont(value, ((1,1),(1,1)))
87                                 else:
88                                         attribs.append((attrib, value))
89                 self.skinAttributes = attribs
90                 return GUIComponent.applySkin(self, desktop, parent)
91
92         def connectSelChanged(self, fnc):
93                 if not fnc in self.onSelectionChanged:
94                         self.onSelectionChanged.append(fnc)
95
96         def disconnectSelChanged(self, fnc):
97                 if fnc in self.onSelectionChanged:
98                         self.onSelectionChanged.remove(fnc)
99
100         def selectionChanged(self):
101                 for x in self.onSelectionChanged:
102                         x()
103
104         def setCurrent(self, ref):
105                 self.l.setCurrent(ref)
106
107         def getCurrent(self):
108                 r = eServiceReference()
109                 self.l.getCurrent(r)
110                 return r
111
112         def atBegin(self):
113                 return self.instance.atBegin()
114
115         def atEnd(self):
116                 return self.instance.atEnd()
117
118         def moveUp(self):
119                 self.instance.moveSelection(self.instance.moveUp)
120
121         def moveDown(self):
122                 self.instance.moveSelection(self.instance.moveDown)
123
124         def moveToChar(self, char):
125                 # TODO fill with life
126                 print "Next char: "
127                 index = self.l.getNextBeginningWithChar(char)
128                 indexup = self.l.getNextBeginningWithChar(char.upper())
129                 if indexup != 0:
130                         if (index > indexup or index == 0):
131                                 index = indexup
132
133                 self.instance.moveSelectionTo(index)
134                 print "Moving to character " + str(char)
135
136         def moveToNextMarker(self):
137                 idx = self.l.getNextMarkerPos()
138                 self.instance.moveSelectionTo(idx)
139
140         def moveToPrevMarker(self):
141                 idx = self.l.getPrevMarkerPos()
142                 self.instance.moveSelectionTo(idx)
143
144         def moveToIndex(self, index):
145                 self.instance.moveSelectionTo(index)
146
147         def getCurrentIndex(self):
148                 return self.instance.getCurrentIndex()
149
150         GUI_WIDGET = eListbox
151         
152         def postWidgetCreate(self, instance):
153                 instance.setWrapAround(True)
154                 instance.setContent(self.l)
155                 instance.selectionChanged.get().append(self.selectionChanged)
156                 self.setMode(self.mode)
157
158         def preWidgetRemove(self, instance):
159                 instance.setContent(None)
160                 instance.selectionChanged.get().remove(self.selectionChanged)
161
162         def getRoot(self):
163                 return self.root
164
165         def getRootServices(self):
166                 serviceHandler = eServiceCenter.getInstance()
167                 list = serviceHandler.list(self.root)
168                 dest = [ ]
169                 if list is not None:
170                         while 1:
171                                 s = list.getNext()
172                                 if s.valid():
173                                         dest.append(s.toString())
174                                 else:
175                                         break
176                 return dest
177
178         def setNumberOffset(self, offset):
179                 self.l.setNumberOffset(offset)
180
181         def setPlayableIgnoreService(self, ref):
182                 self.l.setIgnoreService(ref)
183
184         def setRoot(self, root, justSet=False):
185                 self.root = root
186                 self.l.setRoot(root, justSet)
187                 if not justSet:
188                         self.l.sort()
189                 self.selectionChanged()
190
191         def removeCurrent(self):
192                 self.l.removeCurrent()
193
194         def addService(self, service, beforeCurrent=False):
195                 self.l.addService(service, beforeCurrent)
196
197         def finishFill(self):
198                 self.l.FillFinished()
199                 self.l.sort()
200
201 # stuff for multiple marks (edit mode / later multiepg)
202         def clearMarks(self):
203                 self.l.initMarked()
204
205         def isMarked(self, ref):
206                 return self.l.isMarked(ref)
207
208         def addMarked(self, ref):
209                 self.l.addMarked(ref)
210
211         def removeMarked(self, ref):
212                 self.l.removeMarked(ref)
213
214         def getMarked(self):
215                 i = self.l
216                 i.markedQueryStart()
217                 ref = eServiceReference()
218                 marked = [ ]
219                 while i.markedQueryNext(ref) == 0:
220                         marked.append(ref.toString())
221                         ref = eServiceReference()
222                 return marked
223
224 #just for movemode.. only one marked entry..
225         def setCurrentMarked(self, state):
226                 self.l.setCurrentMarked(state)
227
228         def setMode(self, mode):
229                 self.mode = mode
230                 self.l.setItemHeight(self.ItemHeight)
231                 self.l.setVisualMode(eListboxServiceContent.visModeComplex)
232                 if mode == self.MODE_NORMAL:
233                         if config.usage.show_event_progress_in_servicelist.value:
234                                 self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(0, 0, 52, self.ItemHeight))
235                         else:
236                                 self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(0, 0, 0, 0))
237                         self.l.setElementFont(self.l.celServiceName, self.ServiceNameFont)
238                         self.l.setElementPosition(self.l.celServiceName, eRect(0, 0, self.instance.size().width(), self.ItemHeight))
239                         self.l.setElementFont(self.l.celServiceInfo, self.ServiceInfoFont)
240                 else:
241                         if config.usage.show_event_progress_in_servicelist.value:
242                                 self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(60, 0, 52, self.ItemHeight))
243                         else:
244                                 self.l.setElementPosition(self.l.celServiceEventProgressbar, eRect(60, 0, 0, 0))
245                         self.l.setElementFont(self.l.celServiceNumber, self.ServiceNumberFont)
246                         self.l.setElementPosition(self.l.celServiceNumber, eRect(0, 0, 50, self.ItemHeight))
247                         self.l.setElementFont(self.l.celServiceName, self.ServiceNameFont)
248                         self.l.setElementPosition(self.l.celServiceName, eRect(60, 0, self.instance.size().width()-60, self.ItemHeight))
249                         self.l.setElementFont(self.l.celServiceInfo, self.ServiceInfoFont)
250