allow styleable TemplatedMultiContent lists
authorFraxinas <andreas.frisch@multimedia-labs.de>
Thu, 15 Jan 2009 12:21:08 +0000 (13:21 +0100)
committerFraxinas <andreas.frisch@multimedia-labs.de>
Thu, 15 Jan 2009 12:21:08 +0000 (13:21 +0100)
lib/python/Components/Converter/TemplatedMultiContent.py
lib/python/Components/Sources/List.py

index a1b601d66002b04ee4d8195f513d59a2a79692a0..cc00455c23beff4518a8bc937b12fd21dae40480 100644 (file)
@@ -11,16 +11,21 @@ class TemplatedMultiContent(StringList):
                del l["args"]
 
                self.template = eval(args, {}, l)
                del l["args"]
 
                self.template = eval(args, {}, l)
+               self.active_style = None
                assert "fonts" in self.template
                assert "itemHeight" in self.template
                assert "fonts" in self.template
                assert "itemHeight" in self.template
-               assert "template" in self.template
+               assert "template" in self.template or "templates" in self.template
+               assert "template" in self.template or "default" in self.template["templates"] # we need to have a default template
+
+               if not "template" in self.template: # default template can be ["template"] or ["templates"]["default"]
+                       self.template["template"] = self.template["templates"]["default"]
 
        def changed(self, what):
                if not self.content:
                        from enigma import eListboxPythonMultiContent
                        self.content = eListboxPythonMultiContent()
                        self.content.setItemHeight(self.template["itemHeight"])
 
        def changed(self, what):
                if not self.content:
                        from enigma import eListboxPythonMultiContent
                        self.content = eListboxPythonMultiContent()
                        self.content.setItemHeight(self.template["itemHeight"])
-                       self.content.setTemplate(self.template["template"])
+                       self.setTemplate()
 
                        # also setup fonts (also given by source)
                        index = 0
 
                        # also setup fonts (also given by source)
                        index = 0
@@ -28,7 +33,28 @@ class TemplatedMultiContent(StringList):
                                self.content.setFont(index, f)
                                index += 1
 
                                self.content.setFont(index, f)
                                index += 1
 
+               # if only template changed, don't reload list
+               if what[0] == self.CHANGED_SPECIFIC and what[1] == "style":
+                       self.setTemplate()
+                       return
+                       
                if self.source:
                        self.content.setList(self.source.list)
                if self.source:
                        self.content.setList(self.source.list)
+                       self.setTemplate()
 
                self.downstream_elements.changed(what)
 
                self.downstream_elements.changed(what)
+
+       def setTemplate(self):
+               if self.source:
+                       style = self.source.style
+                       if style == self.active_style:
+                               return # style did not change
+
+                       # if skin defined "templates", that means that it defines multiple styles in a dict. template should still be a default 
+                       templates = self.template.get("templates")
+                       template = self.template.get("template")
+
+                       if templates and style: # if we have a custom style defined in the source, and different templates in the skin, look it up
+                               template = templates.get(self.source.style, template) # default to default template
+
+                       self.content.setTemplate(template)
index ef9c1c8960e9c9d0a37e828b619612e449fc7f56..26c68ab5a874f30ef6e29ab6eadb9e2d9b80bf9b 100644 (file)
@@ -17,6 +17,7 @@ to generate HTML."""
                self.fonts = fonts
                self.disable_callbacks = False
                self.enableWrapAround = enableWrapAround
                self.fonts = fonts
                self.disable_callbacks = False
                self.enableWrapAround = enableWrapAround
+               self.__style = "default" # style might be an optional string which can be used to define different visualisations in the skin
 
        def setList(self, list):
                self.__list = list
 
        def setList(self, list):
                self.__list = list
@@ -76,17 +77,21 @@ to generate HTML."""
                        self.index -= 1
                self.setIndex(self.index)
 
                        self.index -= 1
                self.setIndex(self.index)
 
+       @cached
+       def getStyle(self):
+               return self.__style
+
+       def setStyle(self, style):
+               self.__style = style
+               self.changed((self.CHANGED_SPECIFIC, "style"))
+
+       style = property(getStyle, setStyle)
+
        def updateList(self, list):
                """Changes the list without changing the selection or emitting changed Events"""
                assert len(list) == len(self.__list)
        def updateList(self, list):
                """Changes the list without changing the selection or emitting changed Events"""
                assert len(list) == len(self.__list)
-               print "get old index"
                old_index = self.index
                old_index = self.index
-               print "disable callback"
                self.disable_callbacks = True
                self.disable_callbacks = True
-               print "set list"
                self.list = list
                self.list = list
-               print "set index"
                self.index = old_index
                self.index = old_index
-               print "reenable callbacks"
                self.disable_callbacks = False
                self.disable_callbacks = False
-               print "done"