root/trunk/RBSkinning/RBSkinning/skin/template.py

Revision 488, 4.7 kB (checked in by sholloway, 6 years ago)

A few bug fixes from code rot
Added support for creating compound skin objects
Fixed some bugs with the frame mover

Line 
1 #!/usr/bin/env python
2 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 ##~ License
4 ##~
5 ##- The RuneBlade Foundation library is intended to ease some
6 ##- aspects of writing intricate Jabber, XML, and User Interface (wxPython, etc.)
7 ##- applications, while providing the flexibility to modularly change the
8 ##- architecture. Enjoy.
9 ##~
10 ##~ Copyright (C) 2002  TechGame Networks, LLC.
11 ##~
12 ##~ This library is free software; you can redistribute it and/or
13 ##~ modify it under the terms of the BSD style License as found in the
14 ##~ LICENSE file included with this distribution.
15 ##~
16 ##~ TechGame Networks, LLC can be reached at:
17 ##~ 3578 E. Hartsel Drive #211
18 ##~ Colorado Springs, Colorado, USA, 80920
19 ##~
20 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21
22 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 #~ Imports
24 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25
26 import weakref
27 from RBSkinning.SkinObject import SkinObject
28 from RBSkinning.UtilitySkinElements import StoreXML, RestoreStoredXMLMixin
29 from RBFoundation.XMLClassBuilder import ElementFactory, ElementFactorySet
30
31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 #~ Constants / Variables / Etc.
33 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34
35 TemplateElementFactorySet = ElementFactorySet({
36     ('http://namespaces.runeblade.com/skin', 'factory'): ElementFactory.StaticImport('RBSkinning.skin.factory', 'factory'),
37     ('http://namespaces.runeblade.com/skin', 'section'): ElementFactory.StaticImport('RBSkinning.skin.section', 'section'),
38     None: ElementFactory.Static(StoreXML)
39     })
40
41 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42 #~ Definitions
43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44
45 class template(SkinObject, RestoreStoredXMLMixin):
46     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47     #~ Constants / Variables / Etc.
48     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49
50     default_settings = SkinObject.default_settings.copy()
51     #default_settings['name'] = ''
52     #default_settings['expand'] = ''
53     #default_settings['invoke'] = ''
54     #default_settings['required'] = 'True'
55
56     ElementFactories = TemplateElementFactorySet
57
58     mode = None
59     _StoringMode = 1
60     _ExpandingMode = 2
61     _InvokingMode = 3
62
63     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
64     #~ Public Methods
65     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
66
67     def __init__(self, owner, parent, node, attributes, namespacemap):
68         SkinObject.__init__(self, owner, parent, node, attributes, namespacemap)
69         self.owner = owner
70
71     def SkinInitialize(self):
72         if 'name' in self.settings:
73             self.mode = self._StoringMode
74         elif 'expand' in self.settings:
75             self.mode = self._ExpandingMode
76         elif 'invoke' in self.settings:
77             self.mode = self._InvokingMode
78         else:
79             raise AttributeError, "%r node must have one attribute in ['name','expand','invoke']" % self.__class__.__name__
80
81         if 'unravelnode' not in self.source_settings:
82             if self.mode not in [self._StoringMode]:
83                 self.settings['unravelnode'] = '1'
84
85         self.owner.PushElementFactorySet(self.ElementFactories)
86
87     def SkinComplete(self):
88         self.owner.PopElementFactorySet()
89
90         if self.mode == self._StoringMode:
91             self.object = self.settings['name']
92             self._DoStore(self.object)
93         elif self.mode == self._ExpandingMode:
94             self._DoExpand('::invoke:' + self.settings['expand'])
95         elif self.mode == self._InvokingMode:
96             try:
97                 TemplateOuter = self.context.getnamedvar(self.settings['invoke'])
98             except AttributeError:
99                 if self.EvalLocal(self.settings.get('required', '1')):
100                     raise
101             else:
102                 self._DoInvoke('::invoke:' + TemplateOuter.object, lambda: TemplateOuter.RestoreChildren(self.owner))
103
104         del self.owner
105
106     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
107     #~ Protected Methods
108     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
109
110     def _DoStore(self, name):
111         obj, (setname,) = self.context.getnamedvar(name, -1)
112         setattr(obj, setname, weakref.proxy(self))
113
114     def _DoExpand(self, name):
115         try:
116             TemplateInner = getattr(self.context, name)
117         except AttributeError:
118             if self.EvalLocal(self.settings.get('required', '1')):
119                 raise
120         else:
121             TemplateInner.RestoreChildren(self.owner)
122
123     def _DoInvoke(self, name, invokecallback):
124         self.parent().PushContext(force=1)
125         setattr(self.context, name, weakref.proxy(self))
126         invokecallback()
127         delattr(self.context, name)
128         self.parent().PopContext()
129
Note: See TracBrowser for help on using the browser.