diff options
Diffstat (limited to 'source/blender/python/intern/bpy_operator_wrap.c')
-rw-r--r-- | source/blender/python/intern/bpy_operator_wrap.c | 95 |
1 files changed, 76 insertions, 19 deletions
diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index 1caec294aa0..65b7bf62032 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -29,23 +29,23 @@ * functionality. */ - #include <Python.h> -#include "bpy_operator_wrap.h" +#include "BLI_utildefines.h" + #include "WM_api.h" #include "WM_types.h" -#include "BLI_utildefines.h" - #include "RNA_access.h" #include "RNA_define.h" #include "bpy_rna.h" +#include "bpy_intern_string.h" +#include "bpy_operator_wrap.h" /* own include */ static void operator_properties_init(wmOperatorType *ot) { - PyObject *py_class = ot->ext.data; + PyTypeObject *py_class = ot->ext.data; RNA_struct_blender_type_set(ot->ext.srna, ot); /* only call this so pyrna_deferred_register_class gives a useful error @@ -57,6 +57,65 @@ static void operator_properties_init(wmOperatorType *ot) PyErr_Print(); /* failed to register operator props */ PyErr_Clear(); } + + /* set the default property: ot->prop */ + { + /* picky developers will notice that 'bl_property' won't work with inheritance + * get direct from the dict to avoid raising a load of attribute errors (yes this isnt ideal) - campbell */ + PyObject *py_class_dict = py_class->tp_dict; + PyObject *bl_property = PyDict_GetItem(py_class_dict, bpy_intern_str_bl_property); + const char *prop_id; + bool prop_raise_error; + + if (bl_property) { + if (PyUnicode_Check(bl_property)) { + /* since the property is explicitly given, raise an error if its not found */ + prop_id = _PyUnicode_AsString(bl_property); + prop_raise_error = true; + } + else { + PyErr_Format(PyExc_ValueError, + "%.200s.bl_property should be a string, not %.200s", + ot->idname, Py_TYPE(bl_property)->tp_name); + + /* this could be done cleaner, for now its OK */ + PyErr_Print(); + PyErr_Clear(); + + prop_id = NULL; + prop_raise_error = false; + } + } + else { + /* fallback to hard-coded string (pre 2.66, could be deprecated) */ + prop_id = "type"; + prop_raise_error = false; + } + + if (prop_id) { + PointerRNA ptr; + PropertyRNA *prop; + + RNA_pointer_create(NULL, ot->srna, NULL, &ptr); + prop = RNA_struct_find_property(&ptr, prop_id); + if (prop) { + ot->prop = prop; + } + else { + if (prop_raise_error) { + PyErr_Format(PyExc_ValueError, + "%.200s.bl_property '%.200s' not found", + ot->idname, prop_id); + + /* this could be done cleaner, for now its OK */ + PyErr_Print(); + PyErr_Clear(); + } + } + } + } + /* end 'ot->prop' assignment */ + } void operator_wrapper(wmOperatorType *ot, void *userdata) @@ -67,19 +126,12 @@ void operator_wrapper(wmOperatorType *ot, void *userdata) *ot = *((wmOperatorType *)userdata); ot->srna = srna; /* restore */ - operator_properties_init(ot); - - /* XXX - not nice, set the first enum as searchable, should have a way for python to set */ - { - PointerRNA ptr; - PropertyRNA *prop; - - RNA_pointer_create(NULL, ot->srna, NULL, &ptr); - prop = RNA_struct_find_property(&ptr, "type"); - if (prop) { - ot->prop = prop; - } + /* Use i18n context from ext.srna if possible (py operators). */ + if (ot->ext.srna) { + RNA_def_struct_translation_context(ot->srna, RNA_struct_translation_context(ot->ext.srna)); } + + operator_properties_init(ot); } void macro_wrapper(wmOperatorType *ot, void *userdata) @@ -95,6 +147,11 @@ void macro_wrapper(wmOperatorType *ot, void *userdata) ot->ui = data->ui; ot->ext = data->ext; + /* Use i18n context from ext.srna if possible (py operators). */ + if (ot->ext.srna) { + RNA_def_struct_translation_context(ot->srna, RNA_struct_translation_context(ot->ext.srna)); + } + operator_properties_init(ot); } @@ -112,7 +169,7 @@ PyObject *PYOP_wrap_macro_define(PyObject *UNUSED(self), PyObject *args) if (!PyArg_ParseTuple(args, "Os:_bpy.ops.macro_define", ¯o, &opname)) return NULL; - if (WM_operatortype_find(opname, TRUE) == NULL) { + if (WM_operatortype_find(opname, true) == NULL) { PyErr_Format(PyExc_ValueError, "Macro Define: '%s' is not a valid operator id", opname); @@ -123,7 +180,7 @@ PyObject *PYOP_wrap_macro_define(PyObject *UNUSED(self), PyObject *args) srna = srna_from_self(macro, "Macro Define:"); macroname = RNA_struct_identifier(srna); - ot = WM_operatortype_find(macroname, TRUE); + ot = WM_operatortype_find(macroname, true); if (!ot) { PyErr_Format(PyExc_ValueError, |