From 29a034f2d2cc8e6b63632d6d959388b719f7c9fd Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Wed, 30 Mar 2005 08:47:01 +0000 Subject: [PATCH] - widget instance is now part of screen - skins can now contain cosmetic widgets (widgets without functionality) please don't abuse them! Use them only for backgrounds etc. --- mytest.py | 24 ++++++++++++------------ screens.py | 5 +++++ skin.py | 35 ++++++++++++++++++++++++----------- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/mytest.py b/mytest.py index a40e2635..74ac2736 100644 --- 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() diff --git a/screens.py b/screens.py index 82646282..a0d0d7f6 100644 --- a/screens.py +++ b/screens.py @@ -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 6ef8f939..0367b60f 100644 --- a/skin.py +++ b/skin.py @@ -26,10 +26,11 @@ dom = xml.dom.minidom.parseString( - - - - + + + + + @@ -43,12 +44,13 @@ dom = xml.dom.minidom.parseString( """) - +# 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 -- 2.30.2