Changeset 3676

Show
Ignore:
Timestamp:
28/11/08 15:00:35 (6 weeks ago)
Author:
dmeyer
Message:

autoregister to candyxml using metaclass

Location:
trunk/candy/src
Files:
12 modified

Legend:

Unmodified
Added
Removed
  • trunk/candy/src/candyxml.py

    r3602 r3676  
    6868      def candyxml_parse(cls, element): 
    6969          ... 
    70  
    71   # register 
    72   Foo.candyxml_register() 
    73   SimpleBar.candyxml_register() 
    74   ComplexBar.candyxml_register() 
    7570 
    7671XML example:: 
     
    151146""" 
    152147 
    153 __all__ = [ 'parse', 'register', 'get_class', 'STYLE_HANDLER' ] 
     148__all__ = [ 'parse', 'register', 'get_class' ] 
    154149 
    155150# python imports 
     
    160155# kaa.candy imports 
    161156import core 
    162  
    163 STYLE_HANDLER = 'STYLE_HANDLER' 
    164157 
    165158# get logging object 
     
    404397_parser = {} 
    405398 
    406 def register(cls, style=None): 
    407     """ 
    408     Register a class with the given style. 
    409     @param cls: class with candyxml variables and functions 
    410     @param style: optional style if there is more than one parser for the node 
     399def register(cls): 
     400    """ 
     401    Register a class 
    411402    """ 
    412403    name = cls.candyxml_name 
    413     style = style or getattr(cls, 'candyxml_style', None) 
    414404    parser = _parser 
    415     if style != STYLE_HANDLER: 
     405    if not isinstance(cls, Styles): 
    416406        if not name in parser: 
    417407            parser[name] = Styles() 
    418         parser, name = parser[name], style 
     408        parser, name = parser[name], getattr(cls, 'candyxml_style', None) 
    419409    if name in parser: 
    420410        raise RuntimeError('%s already registered' % name) 
    421411    parser[name] = cls 
    422412 
    423 def get_class(name, style=None): 
    424     """ 
    425     Get the class registered to the given name. 
    426     @param name: parser name 
    427     @param style: style of the parser if there is more than one for the name 
    428     @returns: class of the parser (e.g. Widget) 
    429     """ 
    430     result = _parser.get(name) 
    431     if isinstance(result, dict): 
    432         return result.get(style) 
    433     return result 
     413def get_class(name, style): 
     414    """ 
     415    Get the class registered to the given name and style 
     416    """ 
     417    return _parser.get(name).get(style) 
  • trunk/candy/src/core.py

    r3516 r3676  
    188188            size += 1 
    189189 
     190 
    190191class Modifier(object): 
    191192    """ 
     
    194195    to change. Examples are Properties and ReflectionModifier. 
    195196    """ 
    196     __modifier = {} 
     197 
     198    class __metaclass__(type): 
     199        def __new__(meta, name, bases, attrs): 
     200            cls = type.__new__(meta, name, bases, attrs) 
     201            if 'candyxml_name' in attrs.keys(): 
     202                if cls.candyxml_name in Modifier._candyxml_modifier: 
     203                    raise RuntimeError('%s already defined' % cls.candyxml_name) 
     204                Modifier._candyxml_modifier[cls.candyxml_name] = cls 
     205            return cls 
     206     
     207    _candyxml_modifier = {} 
    197208 
    198209    def modify(self, widget): 
     
    213224            implementation variant, not the other way around. 
    214225        """ 
    215         cls = Modifier.__modifier.get(element.node) 
     226        cls = Modifier._candyxml_modifier.get(element.node) 
    216227        if cls is None: 
    217228            return cls 
    218229        return cls.candyxml_create(element) 
    219  
    220     @classmethod 
    221     def candyxml_register(cls): 
    222         """ 
    223         Register class to candyxml. This function can only be called 
    224         once when the class is loaded. 
    225         """ 
    226         Modifier.__modifier[cls.candyxml_name] = cls 
    227230 
    228231 
     
    273276            properties[key] = value 
    274277        return properties 
    275  
    276 # register Properties modifier 
    277 Properties.candyxml_register() 
  • trunk/candy/src/eventhandler.py

    r3603 r3676  
    120120        eventhandler.condition = element.condition 
    121121        return eventhandler 
    122  
    123 # register Properties modifier 
    124 Eventhandler.candyxml_register() 
  • trunk/candy/src/widgets/container.py

    r3603 r3676  
    425425        return super(Container, cls).candyxml_parse(element).update( 
    426426            dependency=dependency, widgets=widgets) 
    427  
    428  
    429 # register widget to candyxml 
    430 Container.candyxml_register() 
  • trunk/candy/src/widgets/grid.py

    r3567 r3676  
    533533        return super(SelectionGrid, cls).candyxml_parse(element).update( 
    534534            selection=selection) 
    535  
    536  
    537 # register widgets to candyxml 
    538 Grid.candyxml_register() 
    539 SelectionGrid.candyxml_register() 
  • trunk/candy/src/widgets/image.py

    r3639 r3676  
    322322        return Imlib2Texture.candyxml_parse(element).update( 
    323323            thumbnail=element.thumbnail, default=element.default) 
    324  
    325  
    326 # register widgets to candyxml 
    327 Image.candyxml_register() 
    328 Thumbnail.candyxml_register() 
  • trunk/candy/src/widgets/label.py

    r3517 r3676  
    186186        return super(Label, cls).candyxml_parse(element).update( 
    187187            font=element.font, color=element.color, text=element.content) 
    188  
    189  
    190 # register widget to candyxml 
    191 Label.candyxml_register() 
  • trunk/candy/src/widgets/progressbar.py

    r3517 r3676  
    101101        return super(Progressbar, cls).candyxml_parse(element).update( 
    102102            progress=element[0].xmlcreate()) 
    103  
    104  
    105 # register widget to candyxml 
    106 Progressbar.candyxml_register() 
  • trunk/candy/src/widgets/rectangle.py

    r3638 r3676  
    172172            radius=int(element.radius or 0), border_size=float(element.border_size or 0), 
    173173            color=element.color, border_color=element.border_color) 
    174  
    175  
    176 # register widget to candyxml 
    177 Rectangle.candyxml_register() 
  • trunk/candy/src/widgets/reflection.py

    r3517 r3676  
    149149        """ 
    150150        return cls(opacity = int(element.opacity or 50)) 
    151  
    152 # register widget to candyxml 
    153 ReflectionModifier.candyxml_register() 
  • trunk/candy/src/widgets/text.py

    r3517 r3676  
    186186            text=element.content, align=element.align, color=element.color, 
    187187            font=element.font) 
    188  
    189  
    190 # register widget to candyxml 
    191 Text.candyxml_register() 
  • trunk/candy/src/widgets/widget.py

    r3586 r3676  
    107107        """ 
    108108        Parse the candyxml element for parameter and create a Template. 
    109  
    110         @param element: kaa.candy.candyxml.Element with widget information 
    111         @returns: Template object 
    112109        """ 
    113110        modifier = [] 
     
    134131        depends on the context. 
    135132    """ 
     133 
     134    class __metaclass__(type): 
     135        def __new__(meta, name, bases, attrs): 
     136            cls = type.__new__(meta, name, bases, attrs) 
     137            if 'candyxml_name' in attrs.keys() or 'candyxml_style' in attrs.keys(): 
     138                candyxml.register(cls) 
     139            return cls 
    136140 
    137141    #: set if the object reacts on context 
     
    611615        return _dict(pos=element.pos, size=(element.width, element.height)) 
    612616 
    613     @classmethod 
    614     def candyxml_register(cls, style=None): 
    615         """ 
    616         Register class to candyxml. This function can only be called 
    617         once when the class is loaded. 
    618         """ 
    619         candyxml.register(cls, style) 
    620  
    621617#     def __del__(self): 
    622618#         print '__del__', self