- widget instance is now part of screen
authorFelix Domke <tmbinc@elitedvb.net>
Wed, 30 Mar 2005 08:47:01 +0000 (08:47 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Wed, 30 Mar 2005 08:47:01 +0000 (08:47 +0000)
 - skins can now contain cosmetic widgets (widgets without functionality)
   please don't abuse them! Use them only for backgrounds etc.

mytest.py
screens.py
skin.py

index a40e263..74ac273 100644 (file)
--- a/mytest.py
+++ b/mytest.py
@@ -75,20 +75,20 @@ class Session:
                if self.currentDialog.isTmp:
                        self.currentDialog.doClose()
                
-                       dump(self.currentDialog)
                        print sys.getrefcount(self.currentDialog)
+                       del self.currentDialog.instance
+                       dump(self.currentDialog)
                        del self.currentDialog
-                       del self.currentWindow
                
                self.popCurrent()
                        
        def execBegin(self):
                        self.currentDialog.execBegin()
-                       self.currentWindow.show()
+                       self.currentDialog.instance.show()
                
        def execEnd(self):
                        self.currentDialog.execEnd()
-                       self.currentWindow.hide()
+                       self.currentDialog.instance.hide()
        
        def create(self, screen, arguments):
                # creates an instance of 'screen' (which is a class)
@@ -97,35 +97,35 @@ class Session:
        def instantiateDialog(self, screen, *arguments):
                dlg = self.create(screen, arguments)
                assert self.desktop != None
-               wnd = eWindow(self.desktop)
+               dlg.instance = eWindow(self.desktop)
 
                gui = GUIOutputDevice()
-               gui.parent = wnd
+               gui.parent = dlg.instance
                gui.create(dlg)
 
-               applyGUIskin(dlg, wnd, None, dlg.skinName)
+               applyGUIskin(dlg, None, dlg.skinName)
                
-               return (dlg, wnd)
+               return dlg
         
        def pushCurrent(self):
                if self.currentDialog:
-                       self.dialogStack.append((self.currentDialog, self.currentWindow))
+                       self.dialogStack.append(self.currentDialog)
                        self.execEnd()
        
        def popCurrent(self):
                if len(self.dialogStack):
-                       (self.currentDialog, self.currentWindow) = self.dialogStack.pop()
+                       self.currentDialog = self.dialogStack.pop()
                        self.execBegin()
        
        def execDialog(self, dialog):
                self.pushCurrent()
-               (self.currentDialog, self.currentWindow) = dialog
+               self.currentDialog = dialog
                self.currentDialog.isTmp = False
                self.execBegin()
 
        def open(self, screen, *arguments):
                self.pushCurrent()
-               (self.currentDialog, self.currentWindow) = self.instantiateDialog(screen, *arguments)
+               self.currentDialog = self.instantiateDialog(screen, *arguments)
                self.currentDialog.isTmp = True
                self.execBegin()
 
index 8264628..a0d0d7f 100644 (file)
@@ -15,17 +15,22 @@ class Screen(dict, HTMLSkin, GUISkin):
                GUISkin.__init__(self)
                
        def execBegin(self):
+#              assert self.session == None, "a screen can only exec one per time"
+#              self.session = session
                for (name, val) in self.items():
                        val.execBegin()
        
        def execEnd(self):
                for (name, val) in self.items():
                        val.execEnd()
+#              assert self.session != None, "execEnd on non-execing screen!"
+#              self.session = None
        
        # never call this directly - it will be called from the session!
        def doClose(self):
                GUISkin.close(self)
                
+               del self.session
                for (name, val) in self.items():
                        print "%s -> %d" % (name, sys.getrefcount(val))
                        del self[name]
diff --git a/skin.py b/skin.py
index 6ef8f93..0367b60 100644 (file)
--- a/skin.py
+++ b/skin.py
@@ -26,10 +26,11 @@ dom = xml.dom.minidom.parseString(
                <screen name="infoBar" position="80,350" size="540,150" title="InfoBar">
                        <widget name="CurrentTime" position="10,10" size="40,30" />
                        <widget name="ServiceName" position="50,20" size="200,30" />
-                       <widget name="Event_Now" position="100,40" size="300,30" />
-                       <widget name="Event_Next" position="100,90" size="300,30" />
-                       <widget name="Event_Now_Duration" position="440,40" size="80,30" />
-                       <widget name="Event_Next_Duration" position="440,90" size="80,30" />
+                       <widget name="Event_Now" position="100,40" size="300,30" valign="top" halign="left" />
+                       <widget name="Event_Next" position="100,90" size="300,30" valign="top" halign="left" />
+                       <widget name="Event_Now_Duration" position="440,40" size="80,30" valign="top" halign="left" />
+                       <widget name="Event_Next_Duration" position="440,90" size="80,30" valign="top" halign="left" />
+                       <eLabel position="70,0" size="300,30" text=".oO skin Oo." font="Arial:20" />
                </screen>
                <screen name="channelSelection" position="100,80" size="500,240" title="Channel Selection">
                        <widget name="list" position="20,50" size="300,150" />
@@ -43,12 +44,13 @@ dom = xml.dom.minidom.parseString(
        </skin>
 """)
 
-
+# filters all elements of childNode with the specified function
+# example: nodes = elementsWithTag(childNodes, lambda x: x == "bla")
 def elementsWithTag(el, tag):
        for x in el:
                if x.nodeType != xml.dom.minidom.Element.nodeType:
                        continue
-               if x.tagName == tag:
+               if tag(x.tagName):
                        yield x
 
 def parsePosition(str):
@@ -82,6 +84,8 @@ def applyAttributes(guiObject, node):
                                guiObject.resize(parseSize(value))
                        elif attrib == 'title':
                                guiObject.setTitle(value)
+                       elif attrib == 'text':
+                               guiObject.setText(value)
                        elif attrib == 'font':
                                guiObject.setFont(parseFont(value))
                        elif attrib == "valign":
@@ -108,25 +112,24 @@ def applyAttributes(guiObject, node):
                except AttributeError:
                        print "widget %s (%s) doesn't support attribute %s!" % ("", guiObject.__class__.__name__, attrib)
 
-def applyGUIskin(screen, parent, skin, name):
-       
+def applyGUIskin(screen, skin, name):
        myscreen = None
        
        # first, find the corresponding screen element
        skin = dom.childNodes[0]
        assert skin.tagName == "skin", "root element in skin must be 'skin'!"
        
-       for x in elementsWithTag(skin.childNodes, "screen"):
+       for x in elementsWithTag(skin.childNodes, lambda x: x == "screen"):
                if x.getAttribute('name') == name:
                        myscreen = x
        del skin
        
        assert myscreen != None, "no skin for screen '" + name + "' found!"
        
-       applyAttributes(parent, myscreen)
+       applyAttributes(screen.instance, myscreen)
        
        # now walk all widgets
-       for widget in elementsWithTag(myscreen.childNodes, "widget"):
+       for widget in elementsWithTag(myscreen.childNodes, lambda x: x == "widget"):
                wname = widget.getAttribute('name')
                if wname == None:
                        print "widget has no name!"
@@ -139,3 +142,13 @@ def applyGUIskin(screen, parent, skin, name):
                        raise str("component with name '" + wname + "' was not found in skin of screen '" + name + "'!")
                
                applyAttributes(guiObject, widget)
+
+       # now walk additional objects
+       for widget in elementsWithTag(myscreen.childNodes, lambda x: x != "widget"):
+               if widget.tagName == "eLabel":
+                       guiObject = eLabel(screen.instance)
+               else:
+                       raise "unsupported stuff : %s" % widget.tagName
+               
+               applyAttributes(guiObject, widget)
+               guiObject.thisown = 0