diff options
author | Campbell Barton <ideasman42@gmail.com> | 2020-05-13 08:57:29 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2020-05-13 08:57:29 +0300 |
commit | 75d0287cee1aae1a94e46d3fb90379ce016eda8c (patch) | |
tree | b2c7cb52b5ff9803b56541e87906bda9eee56c30 /source/blender/python | |
parent | 8f4f3cce0393f2fdbf91133feb147096c53fee3d (diff) |
PyAPI: support PyGetSetDef when extending RNA types
Support extending properties as well as methods.
Diffstat (limited to 'source/blender/python')
-rw-r--r-- | source/blender/python/intern/bpy_rna.c | 16 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_rna.h | 4 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_rna_types_capi.c | 5 |
3 files changed, 19 insertions, 6 deletions
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 4da81e3380f..55bf87051ec 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -9034,9 +9034,11 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla } /** - * Extend RNA types with C/API methods. + * Extend RNA types with C/API methods, properties. */ -void pyrna_struct_type_extend_capi(struct StructRNA *srna, struct PyMethodDef *method) +void pyrna_struct_type_extend_capi(struct StructRNA *srna, + struct PyMethodDef *method, + struct PyGetSetDef *getset) { PyObject *cls = pyrna_srna_Subtype(srna); if (method != NULL) { @@ -9052,6 +9054,16 @@ void pyrna_struct_type_extend_capi(struct StructRNA *srna, struct PyMethodDef *m Py_DECREF(args); /* Clears 'func' too. */ } } + + if (getset != NULL) { + for (; getset->name != NULL; getset++) { + PyObject *dict = ((PyTypeObject *)cls)->tp_dict; + PyObject *descr = PyDescr_NewGetSet((PyTypeObject *)cls, getset); + BLI_assert(PyDict_GetItem(dict, PyDescr_NAME(descr)) == NULL); + PyDict_SetItem(dict, PyDescr_NAME(descr), descr); + Py_DECREF(descr); + } + } Py_DECREF(cls); } diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h index 3f73ea20205..652d65fe64c 100644 --- a/source/blender/python/intern/bpy_rna.h +++ b/source/blender/python/intern/bpy_rna.h @@ -220,7 +220,9 @@ int pyrna_enum_value_from_id(const EnumPropertyItem *item, int pyrna_deferred_register_class(struct StructRNA *srna, PyTypeObject *py_class); -void pyrna_struct_type_extend_capi(struct StructRNA *srna, struct PyMethodDef *py_method); +void pyrna_struct_type_extend_capi(struct StructRNA *srna, + struct PyMethodDef *py_method, + struct PyGetSetDef *py_getset); /* called before stopping python */ void pyrna_alloc_types(void); diff --git a/source/blender/python/intern/bpy_rna_types_capi.c b/source/blender/python/intern/bpy_rna_types_capi.c index 1b4533224b8..00442295e0b 100644 --- a/source/blender/python/intern/bpy_rna_types_capi.c +++ b/source/blender/python/intern/bpy_rna_types_capi.c @@ -121,9 +121,8 @@ static struct PyMethodDef pyrna_space_methods[] = { void BPY_rna_types_extend_capi(void) { - pyrna_struct_type_extend_capi(&RNA_Space, pyrna_space_methods); - pyrna_struct_type_extend_capi( - &RNA_WindowManager, pyrna_windowmanager_methods); + pyrna_struct_type_extend_capi(&RNA_Space, pyrna_space_methods, NULL); + pyrna_struct_type_extend_capi(&RNA_WindowManager, pyrna_windowmanager_methods, NULL); } /** \} */ |