fix frequently vacancies in multiepg
[enigma2.git] / lib / python / Plugins / Extensions / GraphMultiEPG / GraphMultiEpg.py
index 648d4f1135c0f9e1496e8b43a5acf3dcbe0e72ab..bf8323151d3fac28208a0a3fa5f1e4e00e1aed6c 100644 (file)
@@ -1,4 +1,4 @@
-from skin import queryColor
+from skin import parseColor
 from Components.config import config, ConfigClock, ConfigInteger
 from Components.Pixmap import Pixmap
 from Components.Button import Button
@@ -7,7 +7,8 @@ from Components.HTMLComponent import HTMLComponent
 from Components.GUIComponent import GUIComponent
 from Components.EpgList import Rect
 from Components.Sources.Event import Event
-from Components.Sources.Clock import Clock
+from Components.Sources.Source import ObsoleteSource
+from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
 from Screens.Screen import Screen
 from Screens.EventView import EventViewSimple
 from Screens.TimeDateInput import TimeDateInput
@@ -16,7 +17,7 @@ from Screens.EpgSelection import EPGSelection
 from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
 from RecordTimer import RecordTimerEntry, parseEvent
 from ServiceReference import ServiceReference
-from enigma import eEPGCache, eListbox, eListboxPythonMultiContent, gFont, loadPNG, \
+from enigma import eEPGCache, eListbox, gFont, loadPNG, eListboxPythonMultiContent, \
        RT_HALIGN_LEFT, RT_HALIGN_CENTER, RT_VALIGN_CENTER, RT_WRAP, eRect, eTimer
 
 from time import localtime, time, strftime
@@ -43,24 +44,36 @@ class EPGList(HTMLComponent, GUIComponent):
                self.list = None
                self.event_rect = None
 
-               #query skin colors
-               col = queryColor("GraphEpg.Foreground")
-               self.foreColor = col and col.argb()
-
-               col = queryColor("GraphEpg.Border")
-               self.borderColor = col and col.argb()
-
-               col = queryColor("GraphEpg.Background")
-               if col is None:
-                       self.backColor = 0x586d88
-               else:
-                       self.backColor = col.argb()
-
-               col = queryColor("GraphEpg.BackgroundSelected")
-               if col is None:
-                       self.backColorSelected = 0x808080
-               else:
-                       self.backColorSelected = col.argb()
+               self.foreColor = None
+               self.foreColorSelected = None
+               self.borderColor = None
+               self.backColor = 0x586d88
+               self.backColorSelected = 0x808080
+               self.foreColorService = None
+               self.backColorService = None
+
+       def applySkin(self, desktop):
+               if self.skinAttributes is not None:
+                       attribs = [ ]
+                       for (attrib, value) in self.skinAttributes:
+                               if attrib == "EntryForegroundColor":
+                                       self.foreColor = parseColor(value).argb()
+                               elif attrib == "EntryForegroundColorSelected":
+                                       self.foreColorSelected = parseColor(value).argb()
+                               elif attrib == "EntryBorderColor":
+                                       self.borderColor = parseColor(value).argb()
+                               elif attrib == "EntryBackgroundColor":
+                                       self.backColor = parseColor(value).argb()
+                               elif attrib == "EntryBackgroundColorSelected":
+                                       self.backColorSelected = parseColor(value).argb()
+                               elif attrib == "ServiceNameForegroundColor":
+                                       self.foreColorService = parseColor(value).argb()
+                               elif attrib == "ServiceNameBackgroundColor":
+                                       self.backColorService = parseColor(value).argb()
+                               else:
+                                       attribs.append((attrib,value))
+                       self.skinAttributes = attribs
+               return GUIComponent.applySkin(self, desktop)
 
        def isSelectable(self, service, sname, event_list):
                return (event_list and len(event_list) and True) or False
@@ -107,10 +120,13 @@ class EPGList(HTMLComponent, GUIComponent):
                old_service = self.cur_service  #(service, service_name, events)
                cur_service = self.cur_service = self.l.getCurrentSelection()
                last_time = 0;
+               time_base = self.getTimeBase()
                if old_service and self.cur_event is not None:
                        events = old_service[2]
                        cur_event = events[self.cur_event] #(event_id, event_title, begin_time, duration)
                        last_time = cur_event[2]
+                       if last_time < time_base:
+                               last_time = time_base
                if cur_service:
                        self.cur_event = 0
                        events = cur_service[2]
@@ -120,7 +136,10 @@ class EPGList(HTMLComponent, GUIComponent):
                                        best = len(events) #set invalid
                                        idx = 0
                                        for event in events: #iterate all events
-                                               diff = abs(event[2]-last_time)
+                                               ev_time = event[2]
+                                               if ev_time < time_base:
+                                                       ev_time = time_base
+                                               diff = abs(ev_time-last_time)
                                                if (best == len(events)) or (diff < best_diff):
                                                        best = idx
                                                        best_diff = diff
@@ -179,8 +198,7 @@ class EPGList(HTMLComponent, GUIComponent):
        def buildEntry(self, service, service_name, events):
                r1=self.service_rect
                r2=self.event_rect
-               res = [ None ] # no private data needed
-               res.append((eListboxPythonMultiContent.TYPE_TEXT, r1.left(), r1.top(), r1.width(), r1.height(), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, service_name))
+               res = [ None, MultiContentEntryText(pos = (r1.left(),r1.top()), size = (r1.width(), r1.height()), font = 0, flags = RT_HALIGN_LEFT | RT_VALIGN_CENTER, text = service_name, color = self.foreColorService, backcolor = self.backColorService) ]
 
                if events:
                        start = self.time_base+self.offs*self.time_epoch*60
@@ -190,6 +208,7 @@ class EPGList(HTMLComponent, GUIComponent):
                        width = r2.width()
                        height = r2.height()
                        foreColor = self.foreColor
+                       foreColorSelected = self.foreColorSelected
                        backColor = self.backColor
                        backColorSelected = self.backColorSelected
                        borderColor = self.borderColor
@@ -197,37 +216,36 @@ class EPGList(HTMLComponent, GUIComponent):
                        for ev in events:  #(event_id, event_title, begin_time, duration)
                                rec=self.timer.isInTimer(ev[0], ev[2], ev[3], service) > ((ev[3]/10)*8)
                                xpos, ewidth = self.calcEntryPosAndWidthHelper(ev[2], ev[3], start, end, width)
-                               if self.borderColor is None:
-                                       res.append((eListboxPythonMultiContent.TYPE_TEXT, left+xpos, top, ewidth, height, 1, RT_HALIGN_CENTER|RT_VALIGN_CENTER|RT_WRAP, ev[1], foreColor, backColor, backColorSelected, 1))
-                               else:
-                                       res.append((eListboxPythonMultiContent.TYPE_TEXT, left+xpos, top, ewidth, height, 1, RT_HALIGN_CENTER|RT_VALIGN_CENTER|RT_WRAP, ev[1], foreColor, backColor, backColorSelected, 1, borderColor))
+                               res.append(MultiContentEntryText(pos = (left+xpos, top), size = (ewidth, height), font = 1, flags = RT_HALIGN_CENTER | RT_VALIGN_CENTER | RT_WRAP, text = ev[1], color = foreColor, color_sel = foreColorSelected, backcolor = backColor, backcolor_sel = backColorSelected, border_width = 1, border_color = borderColor))
                                if rec and ewidth > 23:
-                                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, left+xpos+ewidth-22, top+height-22, 21, 21, self.clock_pixmap, backColor, backColorSelected))
+                                       res.append(MultiContentEntryPixmapAlphaTest(pos = (left+xpos+ewidth-22, top+height-22), size = (21, 21), png = self.clock_pixmap, backcolor = backColor, backcolor_selected = backColorSelected))
                return res
 
        def selEntry(self, dir, visible=True):
                cur_service = self.cur_service #(service, service_name, events)
                if not self.event_rect:
                        self.recalcEntrySize()
-               if cur_service and self.cur_event is not None:
+               valid_event = self.cur_event is not None
+               if cur_service:
                        update = True
                        entries = cur_service[2]
                        if dir == 0: #current
                                update = False
                        elif dir == +1: #next
-                               if self.cur_event+1 < len(entries):
+                               if valid_event and self.cur_event+1 < len(entries):
                                        self.cur_event+=1
                                else:
                                        self.offs += 1
                                        self.fillMultiEPG(None) # refill
                                        return True
                        elif dir == -1: #prev
-                               if self.cur_event-1 >= 0:
+                               if valid_event and self.cur_event-1 >= 0:
                                        self.cur_event-=1
                                elif self.offs > 0:
                                        self.offs -= 1
                                        self.fillMultiEPG(None) # refill
                                        return True
+               if cur_service and valid_event:
                        entry = entries[self.cur_event] #(event_id, event_title, begin_time, duration)
                        time_base = self.time_base+self.offs*self.time_epoch*60
                        xpos, width = self.calcEntryPosAndWidth(self.event_rect, time_base, self.time_epoch, entry[2], entry[3])
@@ -264,13 +282,13 @@ class EPGList(HTMLComponent, GUIComponent):
                for x in epg_data:
                        if service != x[0]:
                                if tmp_list is not None:
-                                       self.list.append((service, sname, tmp_list[0][0] and tmp_list))
+                                       self.list.append((service, sname, tmp_list[0][0] is not None and tmp_list or None))
                                service = x[0]
                                sname = x[1]
                                tmp_list = [ ]
                        tmp_list.append((x[2], x[3], x[4], x[5]))
                if tmp_list and len(tmp_list):
-                       self.list.append((service, sname, tmp_list[0][0] and tmp_list))
+                       self.list.append((service, sname, tmp_list[0][0] is not None and tmp_list or None))
 
                self.l.setList(self.list)
                self.findBestEvent()
@@ -325,7 +343,7 @@ class GraphMultiEPG(Screen):
                self["key_green"] = Button(_("Add timer"))
                self["timeline_text"] = TimelineText()
                self["Event"] = Event()
-               self["Clock"] = Clock()
+               self["Clock"] = ObsoleteSource(new_source = "global.CurrentTime", removal_date = "2008-01")
                self.time_lines = [ ]
                for x in (0,1,2,3,4,5):
                        pm = Pixmap()