Changeset 415:8146bf9e3e20


Ignore:
Timestamp:
05/05/10 12:21:25 (3 years ago)
Author:
rkuck
Branch:
default
Convert:
svn:76c98907-0e80-4c83-94c7-b346fc2aefc2/trunk@421
Message:

Made field_has_changed work again in new python script class

Location:
avango-python/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • avango-python/src/avango/script/Script.cpp

    r413 r415  
    4343  mSelf(self), 
    4444  mType(type), 
    45   mIsFloatingRef(false) 
     45  mIsFloatingRef(false), 
     46  mHasFieldHasChangedEnabled(false) 
    4647{ 
    4748} 
     
    106107    handle_exception(); 
    107108  } 
     109} 
     110 
     111/*virtual*/ void av::script::Script::fieldHasChanged(const Field& field) 
     112{ 
     113  if (mHasFieldHasChangedEnabled) 
     114    call_method<void>(mSelf, "_fieldHasChanged", boost::ref(field)); 
     115} 
     116 
     117void av::script::Script::enableFieldHasChanged(void) 
     118{ 
     119  mHasFieldHasChangedEnabled = true; 
    108120} 
    109121 
     
    207219  class_<Script, bases<av::FieldContainer>, boost::noncopyable> 
    208220    ("_Script", "Internal base class for Script nodes", init<av::Type>()) 
     221    .def("_enable_field_has_changed", &Script::enableFieldHasChanged) 
    209222    ; 
    210223 
  • avango-python/src/avango/script/Script.h

    r413 r415  
    5353      PyObject* getSelf(void) const; 
    5454 
     55      void enableFieldHasChanged(void); 
     56 
    5557      static void register_exception_handler(boost::python::object handler); 
    5658 
     
    5860 
    5961      /*virtual*/ void evaluate(); 
     62      /*virtual*/ void fieldHasChanged(const Field& field); 
    6063 
    6164    private: 
     
    7073      av::Type mType; 
    7174      bool mIsFloatingRef; 
     75      bool mHasFieldHasChangedEnabled; 
    7276      static av::Type sType; 
    7377      static boost::python::object sHandler; 
  • avango-python/src/avango/script/_meta_script.py

    r413 r415  
    2828import _script 
    2929 
     30def field_has_changed(field): 
     31    class container(object): 
     32        def __init__(self, field): 
     33            self.field = field 
     34        def __call__(self, function): 
     35            function.field_has_changed_field = self.field 
     36            return function 
     37    if isinstance(field, avango.Field): 
     38        return container(field) 
     39    else: 
     40        field.field_has_changed_field = None 
     41        return field 
     42 
    3043class ScriptMetaclass(type): 
    3144    def __init__(cls, classname, bases, classdict): 
     
    4760 
    4861        Wrapper._fields = list(getattr(base, '_fields', [])) 
     62        Wrapper._field_has_changed = {} 
    4963        for name, attribute in classdict.iteritems(): 
    5064            if isinstance(attribute, avango.Field): 
    5165                Wrapper._fields.append( (name, attribute) ) 
    5266                continue 
     67 
     68            if hasattr(attribute, "field_has_changed_field"): 
     69                Wrapper._field_has_changed[attribute.field_has_changed_field] = attribute 
     70 
    5371            setattr(Wrapper, name, attribute) 
    5472 
     
    7088    def __init__(self): 
    7189        self.super(Script, self).__init__(self._type) 
     90 
     91        # Fields that are added are clones of the prototype given in the class 
     92        # definition. We therefore need to transform the dictionary mapping 
     93        # fields to registered callbacks 
     94        transformed_field_has_changed = {} 
     95 
    7296        for name, field in self._fields: 
    7397            self.add_field(field, name) 
     98            if field in self._field_has_changed: 
     99                transformed_field_has_changed[self._get_field(name)] = self._field_has_changed[field] 
     100        self._field_has_changed = transformed_field_has_changed 
     101 
     102        if self._field_has_changed: 
     103            self._enable_field_has_changed() 
    74104 
    75105    @staticmethod 
     
    80110    def evaluate(self): 
    81111        pass 
     112 
     113    def _fieldHasChanged(self, field): 
     114        if field in self._field_has_changed: 
     115            self._field_has_changed[field](self) 
  • avango-python/src/tests/TestScript.py

    r413 r415  
    7373        values.field += 1 
    7474 
    75 #class HasFieldCallbacks(avango.script.Script): 
    76 #    value1 = avango.SFInt() 
    77 #    value2 = avango.SFInt() 
    78 # 
    79 #    def __init__(self): 
    80 #        self.set_value1 = 0 
    81 #        self.set_value2 = 0 
    82 # 
    83 #    @avango.script.field_has_changed(value1) 
    84 #    def callback1(self): 
    85 #        self.set_value1 = 2 
    86 # 
    87 #    @avango.script.field_has_changed(value2) 
    88 #    def callback2(self): 
    89 #        self.set_value2 = 3 
    90 # 
     75class HasFieldCallbacks(avango.script.Script): 
     76    value1 = avango.SFInt() 
     77    value2 = avango.SFInt() 
     78 
     79    def __init__(self): 
     80        self.super(HasFieldCallbacks, self).__init__() 
     81        self.set_value1 = 0 
     82        self.set_value2 = 0 
     83 
     84    @avango.script.field_has_changed(value1) 
     85    def callback1(self): 
     86        self.set_value1 = 2 
     87 
     88    @avango.script.field_has_changed(value2) 
     89    def callback2(self): 
     90        self.set_value2 = 3 
     91 
    9192#class DerivedHasFieldCallbacks(HasFieldCallbacks): pass 
    9293# 
     
    295296        self.assertEqual(node.field.value, 3) 
    296297 
    297 #    def testFieldHasChanged(self): 
    298 #        node = HasFieldCallbacks() 
    299 #        self.assert_(node) 
    300 # 
    301 #        node.value1.value = 1 
    302 #        self.assertEqual(node.set_value1, 2) 
    303 # 
    304 #        node.value2.value = 1 
    305 #        self.assertEqual(node.set_value2, 3) 
     298    def testFieldHasChanged(self): 
     299        node = HasFieldCallbacks() 
     300        self.assert_(node) 
     301 
     302        node.value1.value = 1 
     303        self.assertEqual(node.set_value1, 2) 
     304 
     305        node.value2.value = 1 
     306        self.assertEqual(node.set_value2, 3) 
    306307 
    307308    def testSetObjectValue(self): 
Note: See TracChangeset for help on using the changeset viewer.