Changeset 415:8146bf9e3e20
- Timestamp:
- 05/05/10 12:21:25 (3 years ago)
- Branch:
- default
- Convert:
- svn:76c98907-0e80-4c83-94c7-b346fc2aefc2/trunk@421
- Location:
- avango-python/src
- Files:
-
- 4 edited
-
avango/script/Script.cpp (modified) (3 diffs)
-
avango/script/Script.h (modified) (3 diffs)
-
avango/script/_meta_script.py (modified) (4 diffs)
-
tests/TestScript.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
avango-python/src/avango/script/Script.cpp
r413 r415 43 43 mSelf(self), 44 44 mType(type), 45 mIsFloatingRef(false) 45 mIsFloatingRef(false), 46 mHasFieldHasChangedEnabled(false) 46 47 { 47 48 } … … 106 107 handle_exception(); 107 108 } 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 117 void av::script::Script::enableFieldHasChanged(void) 118 { 119 mHasFieldHasChangedEnabled = true; 108 120 } 109 121 … … 207 219 class_<Script, bases<av::FieldContainer>, boost::noncopyable> 208 220 ("_Script", "Internal base class for Script nodes", init<av::Type>()) 221 .def("_enable_field_has_changed", &Script::enableFieldHasChanged) 209 222 ; 210 223 -
avango-python/src/avango/script/Script.h
r413 r415 53 53 PyObject* getSelf(void) const; 54 54 55 void enableFieldHasChanged(void); 56 55 57 static void register_exception_handler(boost::python::object handler); 56 58 … … 58 60 59 61 /*virtual*/ void evaluate(); 62 /*virtual*/ void fieldHasChanged(const Field& field); 60 63 61 64 private: … … 70 73 av::Type mType; 71 74 bool mIsFloatingRef; 75 bool mHasFieldHasChangedEnabled; 72 76 static av::Type sType; 73 77 static boost::python::object sHandler; -
avango-python/src/avango/script/_meta_script.py
r413 r415 28 28 import _script 29 29 30 def 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 30 43 class ScriptMetaclass(type): 31 44 def __init__(cls, classname, bases, classdict): … … 47 60 48 61 Wrapper._fields = list(getattr(base, '_fields', [])) 62 Wrapper._field_has_changed = {} 49 63 for name, attribute in classdict.iteritems(): 50 64 if isinstance(attribute, avango.Field): 51 65 Wrapper._fields.append( (name, attribute) ) 52 66 continue 67 68 if hasattr(attribute, "field_has_changed_field"): 69 Wrapper._field_has_changed[attribute.field_has_changed_field] = attribute 70 53 71 setattr(Wrapper, name, attribute) 54 72 … … 70 88 def __init__(self): 71 89 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 72 96 for name, field in self._fields: 73 97 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() 74 104 75 105 @staticmethod … … 80 110 def evaluate(self): 81 111 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 73 73 values.field += 1 74 74 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 # 75 class 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 91 92 #class DerivedHasFieldCallbacks(HasFieldCallbacks): pass 92 93 # … … 295 296 self.assertEqual(node.field.value, 3) 296 297 297 #def testFieldHasChanged(self):298 #node = HasFieldCallbacks()299 #self.assert_(node)300 # 301 #node.value1.value = 1302 #self.assertEqual(node.set_value1, 2)303 # 304 #node.value2.value = 1305 #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) 306 307 307 308 def testSetObjectValue(self):
Note: See TracChangeset
for help on using the changeset viewer.
