diff options
author | Campbell Barton <campbell@blender.org> | 2022-04-13 09:40:07 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-04-20 05:19:35 +0300 |
commit | f438344cf243632e497772cf1f855b9c8856fd37 (patch) | |
tree | d7121f1e456c2f499ba0e92dd2f38869c39b844c /source/blender/python/intern/bpy_operator.c | |
parent | 6d9268c2c7362ec772a3ff956ee888e877682a01 (diff) |
PyAPI: temporary context override support
Support a way to temporarily override the context from Python.
- Added method `Context.temp_override` context manager.
- Special support for windowing variables "window", "area" and "region",
other context members such as "active_object".
- Nesting context overrides is supported.
- Previous windowing members are restored when the context exists unless
they have been removed.
- Overriding context members by passing a dictionary into operators in
`bpy.ops` has been deprecated and warns when used.
This allows the window in a newly loaded file to be used, see: T92464
Reviewed by: mont29
Ref D13126
Diffstat (limited to 'source/blender/python/intern/bpy_operator.c')
-rw-r--r-- | source/blender/python/intern/bpy_operator.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index db0067fc18e..0cfe6dab2f5 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -60,6 +60,18 @@ static wmOperatorType *ot_lookup_from_py_string(PyObject *value, const char *py_ return ot; } +static void op_context_override_deprecated_warning(void) +{ + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "Passing in context overrides is deprecated in favor of " + "Context.temp_override(..)", + 1) < 0) { + /* The function has no return value, the exception cannot + * be reported to the caller, so just log it. */ + PyErr_WriteUnraisable(NULL); + } +} + static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args) { wmOperatorType *ot; @@ -113,7 +125,10 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args) if (ELEM(context_dict, NULL, Py_None)) { context_dict = NULL; } - else if (!PyDict_Check(context_dict)) { + else if (PyDict_Check(context_dict)) { + op_context_override_deprecated_warning(); + } + else { PyErr_Format(PyExc_TypeError, "Calling operator \"bpy.ops.%s.poll\" error, " "custom context expected a dict or None, got a %.200s", @@ -218,7 +233,10 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args) if (ELEM(context_dict, NULL, Py_None)) { context_dict = NULL; } - else if (!PyDict_Check(context_dict)) { + else if (PyDict_Check(context_dict)) { + op_context_override_deprecated_warning(); + } + else { PyErr_Format(PyExc_TypeError, "Calling operator \"bpy.ops.%s\" error, " "custom context expected a dict or None, got a %.200s", |