[Bf-blender-cvs] [a6d34f4c3f2] master: Cleanup: add utility functions to parse gizmos and target properties
Campbell Barton
noreply at git.blender.org
Mon Oct 11 11:20:35 CEST 2021
Commit: a6d34f4c3f2a86af1cabf75c89e85a35d38073c3
Author: Campbell Barton
Date: Mon Oct 11 19:59:06 2021 +1100
Branches: master
https://developer.blender.org/rBa6d34f4c3f2a86af1cabf75c89e85a35d38073c3
Cleanup: add utility functions to parse gizmos and target properties
===================================================================
M source/blender/python/intern/bpy_rna_gizmo.c
===================================================================
diff --git a/source/blender/python/intern/bpy_rna_gizmo.c b/source/blender/python/intern/bpy_rna_gizmo.c
index f121bfd6e36..5294f56d5c6 100644
--- a/source/blender/python/intern/bpy_rna_gizmo.c
+++ b/source/blender/python/intern/bpy_rna_gizmo.c
@@ -17,7 +17,7 @@
/** \file
* \ingroup pythonintern
*
- * .
+ * This file defines utility methods for `bpy.types.Gizmo`.
*/
#include <Python.h>
@@ -43,6 +43,84 @@
#include "bpy_rna.h"
+/* -------------------------------------------------------------------- */
+/** \name Parsing Utility Functions
+ *
+ * Functions used as callbacks for #PyArg_ParseTuple `O&` format string.
+ * \{ */
+
+struct BPyGizmoWithTarget {
+ wmGizmo *gz; /* Must be first. */
+ wmGizmoProperty *gz_prop;
+};
+
+struct BPyGizmoWithTargetType {
+ wmGizmo *gz; /* Must be first. */
+ const wmGizmoPropertyType *gz_prop_type;
+};
+
+static int py_rna_gizmo_parse(PyObject *o, void *p)
+{
+ /* No type checking (this is `self` not a user defined argument). */
+ BLI_assert(BPy_StructRNA_Check(o));
+ BLI_assert(((const BPy_StructRNA *)o)->ptr.type == &RNA_Gizmo);
+
+ wmGizmo **gz_p = p;
+ *gz_p = ((const BPy_StructRNA *)o)->ptr.data;
+ return 1;
+}
+
+static int py_rna_gizmo_target_id_parse(PyObject *o, void *p)
+{
+ struct BPyGizmoWithTarget *gizmo_with_target = p;
+ /* Must be set by `py_rna_gizmo_parse`. */
+ wmGizmo *gz = gizmo_with_target->gz;
+ BLI_assert(gz != NULL);
+
+ if (!PyUnicode_Check(o)) {
+ PyErr_Format(PyExc_TypeError, "expected a string (got %.200s)", Py_TYPE(o)->tp_name);
+ return 0;
+ }
+ const char *gz_prop_id = PyUnicode_AsUTF8(o);
+ wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, gz_prop_id);
+ if (gz_prop == NULL) {
+ PyErr_Format(PyExc_ValueError,
+ "Gizmo target property '%s.%s' not found!",
+ gz->type->idname,
+ gz_prop_id);
+ return 0;
+ }
+ gizmo_with_target->gz_prop = gz_prop;
+ return 1;
+}
+
+static int py_rna_gizmo_target_type_id_parse(PyObject *o, void *p)
+{
+ struct BPyGizmoWithTargetType *gizmo_with_target = p;
+ /* Must be set first. */
+ wmGizmo *gz = gizmo_with_target->gz;
+ BLI_assert(gz != NULL);
+
+ if (!PyUnicode_Check(o)) {
+ PyErr_Format(PyExc_TypeError, "expected a string (got %.200s)", Py_TYPE(o)->tp_name);
+ return 0;
+ }
+ const char *gz_prop_id = PyUnicode_AsUTF8(o);
+ const wmGizmoPropertyType *gz_prop_type = WM_gizmotype_target_property_find(gz->type,
+ gz_prop_id);
+ if (gz_prop_type == NULL) {
+ PyErr_Format(PyExc_ValueError,
+ "Gizmo target property '%s.%s' not found!",
+ gz->type->idname,
+ gz_prop_id);
+ return 0;
+ }
+ gizmo_with_target->gz_prop_type = gz_prop_type;
+ return 1;
+}
+
+/** \} */
+
/* -------------------------------------------------------------------- */
/** \name Gizmo Target Property Define API
* \{ */
@@ -240,12 +318,10 @@ static PyObject *bpy_gizmo_target_set_handler(PyObject *UNUSED(self), PyObject *
const PyGILState_STATE gilstate = PyGILState_Ensure();
struct {
- PyObject *self;
- char *target;
+ struct BPyGizmoWithTargetType gz_with_target_type;
PyObject *py_fn_slots[BPY_GIZMO_FN_SLOT_LEN];
} params = {
- .self = NULL,
- .target = NULL,
+ .gz_with_target_type = {NULL, NULL},
.py_fn_slots = {NULL},
};
@@ -253,29 +329,25 @@ static PyObject *bpy_gizmo_target_set_handler(PyObject *UNUSED(self), PyObject *
* 'Gizmo.target_set_prop & target_set_operator'
* (see: rna_wm_gizmo_api.c). conventions should match. */
static const char *const _keywords[] = {"self", "target", "get", "set", "range", NULL};
- static _PyArg_Parser _parser = {"Os|$OOO:target_set_handler", _keywords, 0};
+ static _PyArg_Parser _parser = {"O&O&|$OOO:target_set_handler", _keywords, 0};
if (!_PyArg_ParseTupleAndKeywordsFast(args,
kw,
&_parser,
- ¶ms.self,
- ¶ms.target,
+ /* `self` */
+ py_rna_gizmo_parse,
+ ¶ms.gz_with_target_type.gz,
+ /* `target` */
+ py_rna_gizmo_target_type_id_parse,
+ ¶ms.gz_with_target_type,
+ /* `get/set/range` */
¶ms.py_fn_slots[BPY_GIZMO_FN_SLOT_GET],
¶ms.py_fn_slots[BPY_GIZMO_FN_SLOT_SET],
¶ms.py_fn_slots[BPY_GIZMO_FN_SLOT_RANGE_GET])) {
goto fail;
}
- wmGizmo *gz = ((BPy_StructRNA *)params.self)->ptr.data;
-
- const wmGizmoPropertyType *gz_prop_type = WM_gizmotype_target_property_find(gz->type,
- params.target);
- if (gz_prop_type == NULL) {
- PyErr_Format(PyExc_ValueError,
- "Gizmo target property '%s.%s' not found",
- gz->type->idname,
- params.target);
- goto fail;
- }
+ wmGizmo *gz = params.gz_with_target_type.gz;
+ const wmGizmoPropertyType *gz_prop_type = params.gz_with_target_type.gz_prop_type;
{
const int slots_required = 2;
@@ -338,29 +410,27 @@ PyDoc_STRVAR(bpy_gizmo_target_get_value_doc,
static PyObject *bpy_gizmo_target_get_value(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
struct {
- PyObject *self;
- char *target;
+ struct BPyGizmoWithTarget gz_with_target;
} params = {
- .self = NULL,
- .target = NULL,
+ .gz_with_target = {NULL, NULL},
};
static const char *const _keywords[] = {"self", "target", NULL};
- static _PyArg_Parser _parser = {"Os:target_get_value", _keywords, 0};
- if (!_PyArg_ParseTupleAndKeywordsFast(args, kw, &_parser, ¶ms.self, ¶ms.target)) {
+ static _PyArg_Parser _parser = {"O&O&:target_get_value", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args,
+ kw,
+ &_parser,
+ /* `self` */
+ py_rna_gizmo_parse,
+ ¶ms.gz_with_target.gz,
+ /* `target` */
+ py_rna_gizmo_target_id_parse,
+ ¶ms.gz_with_target)) {
goto fail;
}
- wmGizmo *gz = ((BPy_StructRNA *)params.self)->ptr.data;
-
- wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, params.target);
- if (gz_prop == NULL) {
- PyErr_Format(PyExc_ValueError,
- "Gizmo target property '%s.%s' not found",
- gz->type->idname,
- params.target);
- goto fail;
- }
+ wmGizmo *gz = params.gz_with_target.gz;
+ wmGizmoProperty *gz_prop = params.gz_with_target.gz_prop;
const int array_len = WM_gizmo_target_property_array_length(gz, gz_prop);
switch (gz_prop->type->data_type) {
@@ -396,32 +466,31 @@ PyDoc_STRVAR(bpy_gizmo_target_set_value_doc,
static PyObject *bpy_gizmo_target_set_value(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
struct {
- PyObject *self;
- char *target;
+ struct BPyGizmoWithTarget gz_with_target;
PyObject *value;
} params = {
- .self = NULL,
- .target = NULL,
+ .gz_with_target = {NULL, NULL},
.value = NULL,
};
static const char *const _keywords[] = {"self", "target", "value", NULL};
- static _PyArg_Parser _parser = {"OsO:target_set_value", _keywords, 0};
- if (!_PyArg_ParseTupleAndKeywordsFast(
- args, kw, &_parser, ¶ms.self, ¶ms.target, ¶ms.value)) {
+ static _PyArg_Parser _parser = {"O&O&O:target_set_value", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args,
+ kw,
+ &_parser,
+ /* `self` */
+ py_rna_gizmo_parse,
+ ¶ms.gz_with_target.gz,
+ /* `target` */
+ py_rna_gizmo_target_id_parse,
+ ¶ms.gz_with_target,
+ /* `value` */
+ ¶ms.value)) {
goto fail;
}
- wmGizmo *gz = ((BPy_StructRNA *)params.self)->ptr.data;
-
- wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(gz, params.target);
- if (gz_prop == NULL) {
- PyErr_Format(PyExc_ValueError,
- "Gizmo target property '%s.%s' not found",
- gz->type->idname,
- params.target);
- goto fail;
- }
+ wmGizmo *gz = params.gz_with_target.gz;
+ wmGizmoProperty *gz_prop = params.gz_with_target.gz_prop;
const int array_len = WM_gizmo_target_property_array_length(gz, gz_prop);
switch (gz_prop->type->data_type) {
@@ -468,29 +537,27 @@ PyDoc_STRVAR(bpy_gizmo_target_get_range_doc,
static PyObject *bpy_gizmo_target_get_range(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
struct {
- PyObject *self;
- char *target;
+ struct BPyGizmoWithTarget gz_with_target;
} params = {
- .self = NULL,
- .target = NULL,
+ .gz_with_target = {NULL, NULL},
};
static const char *const _keywords[] = {"self", "target", NULL};
- static _PyArg_Parser _parser = {"Os:target_get_range", _keywords, 0};
- if (!_PyArg_ParseTupleAndKeywordsFast(args, kw, &_parser, ¶ms.self, ¶ms.target)) {
+ static _PyArg_Parser _parser = {"O&O&:target_get_range", _keywords, 0};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args,
+ kw,
+ &_parser,
+ /* `self
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list