Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/python/intern/bpy_rna_gizmo.c')
-rw-r--r--source/blender/python/intern/bpy_rna_gizmo.c864
1 files changed, 425 insertions, 439 deletions
diff --git a/source/blender/python/intern/bpy_rna_gizmo.c b/source/blender/python/intern/bpy_rna_gizmo.c
index 68511627d51..ec041b3054a 100644
--- a/source/blender/python/intern/bpy_rna_gizmo.c
+++ b/source/blender/python/intern/bpy_rna_gizmo.c
@@ -28,7 +28,6 @@
#include "BLI_utildefines.h"
#include "BLI_alloca.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -44,280 +43,278 @@
#include "bpy_rna.h"
-
/* -------------------------------------------------------------------- */
/** \name Gizmo Target Property Define API
* \{ */
enum {
- BPY_GIZMO_FN_SLOT_GET = 0,
- BPY_GIZMO_FN_SLOT_SET,
- BPY_GIZMO_FN_SLOT_RANGE_GET,
+ BPY_GIZMO_FN_SLOT_GET = 0,
+ BPY_GIZMO_FN_SLOT_SET,
+ BPY_GIZMO_FN_SLOT_RANGE_GET,
};
#define BPY_GIZMO_FN_SLOT_LEN (BPY_GIZMO_FN_SLOT_RANGE_GET + 1)
struct BPyGizmoHandlerUserData {
- PyObject *fn_slots[BPY_GIZMO_FN_SLOT_LEN];
+ PyObject *fn_slots[BPY_GIZMO_FN_SLOT_LEN];
};
-static void py_rna_gizmo_handler_get_cb(
- const wmGizmo *UNUSED(gz), wmGizmoProperty *gz_prop,
- void *value_p)
+static void py_rna_gizmo_handler_get_cb(const wmGizmo *UNUSED(gz),
+ wmGizmoProperty *gz_prop,
+ void *value_p)
{
- PyGILState_STATE gilstate = PyGILState_Ensure();
-
- struct BPyGizmoHandlerUserData *data = gz_prop->custom_func.user_data;
- PyObject *ret = PyObject_CallObject(data->fn_slots[BPY_GIZMO_FN_SLOT_GET], NULL);
- if (ret == NULL) {
- goto fail;
- }
-
- if (gz_prop->type->data_type == PROP_FLOAT) {
- float *value = value_p;
- if (gz_prop->type->array_length == 1) {
- if ((*value = PyFloat_AsDouble(ret)) == -1.0f && PyErr_Occurred()) {
- goto fail;
- }
- }
- else {
- if (PyC_AsArray(value, ret, gz_prop->type->array_length, &PyFloat_Type, false,
- "Gizmo get callback: ") == -1)
- {
- goto fail;
- }
- }
- }
- else {
- PyErr_SetString(PyExc_AttributeError, "internal error, unsupported type");
- goto fail;
- }
-
- Py_DECREF(ret);
-
- PyGILState_Release(gilstate);
- return;
+ PyGILState_STATE gilstate = PyGILState_Ensure();
+
+ struct BPyGizmoHandlerUserData *data = gz_prop->custom_func.user_data;
+ PyObject *ret = PyObject_CallObject(data->fn_slots[BPY_GIZMO_FN_SLOT_GET], NULL);
+ if (ret == NULL) {
+ goto fail;
+ }
+
+ if (gz_prop->type->data_type == PROP_FLOAT) {
+ float *value = value_p;
+ if (gz_prop->type->array_length == 1) {
+ if ((*value = PyFloat_AsDouble(ret)) == -1.0f && PyErr_Occurred()) {
+ goto fail;
+ }
+ }
+ else {
+ if (PyC_AsArray(value,
+ ret,
+ gz_prop->type->array_length,
+ &PyFloat_Type,
+ false,
+ "Gizmo get callback: ") == -1) {
+ goto fail;
+ }
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "internal error, unsupported type");
+ goto fail;
+ }
+
+ Py_DECREF(ret);
+
+ PyGILState_Release(gilstate);
+ return;
fail:
- PyErr_Print();
- PyErr_Clear();
+ PyErr_Print();
+ PyErr_Clear();
- PyGILState_Release(gilstate);
+ PyGILState_Release(gilstate);
}
-static void py_rna_gizmo_handler_set_cb(
- const wmGizmo *UNUSED(gz), wmGizmoProperty *gz_prop,
- const void *value_p)
+static void py_rna_gizmo_handler_set_cb(const wmGizmo *UNUSED(gz),
+ wmGizmoProperty *gz_prop,
+ const void *value_p)
{
- PyGILState_STATE gilstate = PyGILState_Ensure();
-
- struct BPyGizmoHandlerUserData *data = gz_prop->custom_func.user_data;
-
- PyObject *args = PyTuple_New(1);
-
- if (gz_prop->type->data_type == PROP_FLOAT) {
- const float *value = value_p;
- PyObject *py_value;
- if (gz_prop->type->array_length == 1) {
- py_value = PyFloat_FromDouble(*value);
- }
- else {
- py_value = PyC_Tuple_PackArray_F32(value, gz_prop->type->array_length);
- }
- if (py_value == NULL) {
- goto fail;
- }
- PyTuple_SET_ITEM(args, 0, py_value);
- }
- else {
- PyErr_SetString(PyExc_AttributeError, "internal error, unsupported type");
- goto fail;
- }
-
- PyObject *ret = PyObject_CallObject(data->fn_slots[BPY_GIZMO_FN_SLOT_SET], args);
- if (ret == NULL) {
- goto fail;
- }
- Py_DECREF(ret);
-
- PyGILState_Release(gilstate);
- return;
+ PyGILState_STATE gilstate = PyGILState_Ensure();
+
+ struct BPyGizmoHandlerUserData *data = gz_prop->custom_func.user_data;
+
+ PyObject *args = PyTuple_New(1);
+
+ if (gz_prop->type->data_type == PROP_FLOAT) {
+ const float *value = value_p;
+ PyObject *py_value;
+ if (gz_prop->type->array_length == 1) {
+ py_value = PyFloat_FromDouble(*value);
+ }
+ else {
+ py_value = PyC_Tuple_PackArray_F32(value, gz_prop->type->array_length);
+ }
+ if (py_value == NULL) {
+ goto fail;
+ }
+ PyTuple_SET_ITEM(args, 0, py_value);
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "internal error, unsupported type");
+ goto fail;
+ }
+
+ PyObject *ret = PyObject_CallObject(data->fn_slots[BPY_GIZMO_FN_SLOT_SET], args);
+ if (ret == NULL) {
+ goto fail;
+ }
+ Py_DECREF(ret);
+
+ PyGILState_Release(gilstate);
+ return;
fail:
- PyErr_Print();
- PyErr_Clear();
+ PyErr_Print();
+ PyErr_Clear();
- Py_DECREF(args);
+ Py_DECREF(args);
- PyGILState_Release(gilstate);
+ PyGILState_Release(gilstate);
}
-static void py_rna_gizmo_handler_range_get_cb(
- const wmGizmo *UNUSED(gz), wmGizmoProperty *gz_prop,
- void *value_p)
+static void py_rna_gizmo_handler_range_get_cb(const wmGizmo *UNUSED(gz),
+ wmGizmoProperty *gz_prop,
+ void *value_p)
{
- struct BPyGizmoHandlerUserData *data = gz_prop->custom_func.user_data;
-
- PyGILState_STATE gilstate = PyGILState_Ensure();
-
- PyObject *ret = PyObject_CallObject(data->fn_slots[BPY_GIZMO_FN_SLOT_RANGE_GET], NULL);
- if (ret == NULL) {
- goto fail;
- }
-
- if (!PyTuple_Check(ret)) {
- PyErr_Format(PyExc_TypeError,
- "Expected a tuple, not %.200s",
- Py_TYPE(ret)->tp_name);
- goto fail;
- }
-
- if (PyTuple_GET_SIZE(ret) != 2) {
- PyErr_Format(PyExc_TypeError,
- "Expected a tuple of size 2, not %d",
- PyTuple_GET_SIZE(ret));
- goto fail;
- }
-
- if (gz_prop->type->data_type == PROP_FLOAT) {
- float range[2];
- for (int i = 0; i < 2; i++) {
- if (((range[i] = PyFloat_AsDouble(PyTuple_GET_ITEM(ret, i))) == -1.0f && PyErr_Occurred()) == 0) {
- /* pass */
- }
- else {
- goto fail;
- }
- }
- memcpy(value_p, range, sizeof(range));
- }
- else {
- PyErr_SetString(PyExc_AttributeError, "internal error, unsupported type");
- goto fail;
- }
-
- Py_DECREF(ret);
- PyGILState_Release(gilstate);
- return;
+ struct BPyGizmoHandlerUserData *data = gz_prop->custom_func.user_data;
+
+ PyGILState_STATE gilstate = PyGILState_Ensure();
+
+ PyObject *ret = PyObject_CallObject(data->fn_slots[BPY_GIZMO_FN_SLOT_RANGE_GET], NULL);
+ if (ret == NULL) {
+ goto fail;
+ }
+
+ if (!PyTuple_Check(ret)) {
+ PyErr_Format(PyExc_TypeError, "Expected a tuple, not %.200s", Py_TYPE(ret)->tp_name);
+ goto fail;
+ }
+
+ if (PyTuple_GET_SIZE(ret) != 2) {
+ PyErr_Format(PyExc_TypeError, "Expected a tuple of size 2, not %d", PyTuple_GET_SIZE(ret));
+ goto fail;
+ }
+
+ if (gz_prop->type->data_type == PROP_FLOAT) {
+ float range[2];
+ for (int i = 0; i < 2; i++) {
+ if (((range[i] = PyFloat_AsDouble(PyTuple_GET_ITEM(ret, i))) == -1.0f && PyErr_Occurred()) ==
+ 0) {
+ /* pass */
+ }
+ else {
+ goto fail;
+ }
+ }
+ memcpy(value_p, range, sizeof(range));
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "internal error, unsupported type");
+ goto fail;
+ }
+
+ Py_DECREF(ret);
+ PyGILState_Release(gilstate);
+ return;
fail:
- Py_XDECREF(ret);
+ Py_XDECREF(ret);
- PyErr_Print();
- PyErr_Clear();
+ PyErr_Print();
+ PyErr_Clear();
- PyGILState_Release(gilstate);
+ PyGILState_Release(gilstate);
}
-static void py_rna_gizmo_handler_free_cb(
- const wmGizmo *UNUSED(gz), wmGizmoProperty *gz_prop)
+static void py_rna_gizmo_handler_free_cb(const wmGizmo *UNUSED(gz), wmGizmoProperty *gz_prop)
{
- struct BPyGizmoHandlerUserData *data = gz_prop->custom_func.user_data;
+ struct BPyGizmoHandlerUserData *data = gz_prop->custom_func.user_data;
- PyGILState_STATE gilstate = PyGILState_Ensure();
- for (int i = 0; i < BPY_GIZMO_FN_SLOT_LEN; i++) {
- Py_XDECREF(data->fn_slots[i]);
- }
- PyGILState_Release(gilstate);
-
- MEM_freeN(data);
+ PyGILState_STATE gilstate = PyGILState_Ensure();
+ for (int i = 0; i < BPY_GIZMO_FN_SLOT_LEN; i++) {
+ Py_XDECREF(data->fn_slots[i]);
+ }
+ PyGILState_Release(gilstate);
+ MEM_freeN(data);
}
-PyDoc_STRVAR(bpy_gizmo_target_set_handler_doc,
-".. method:: target_set_handler(target, get, set, range=None):\n"
-"\n"
-" Assigns callbacks to a gizmos property.\n"
-"\n"
-" :arg get: Function that returns the value for this property (single value or sequence).\n"
-" :type get: callable\n"
-" :arg set: Function that takes a single value argument and applies it.\n"
-" :type set: callable\n"
-" :arg range: Function that returns a (min, max) tuple for gizmos that use a range.\n"
-" :type range: callable\n"
-);
+PyDoc_STRVAR(
+ bpy_gizmo_target_set_handler_doc,
+ ".. method:: target_set_handler(target, get, set, range=None):\n"
+ "\n"
+ " Assigns callbacks to a gizmos property.\n"
+ "\n"
+ " :arg get: Function that returns the value for this property (single value or sequence).\n"
+ " :type get: callable\n"
+ " :arg set: Function that takes a single value argument and applies it.\n"
+ " :type set: callable\n"
+ " :arg range: Function that returns a (min, max) tuple for gizmos that use a range.\n"
+ " :type range: callable\n");
static PyObject *bpy_gizmo_target_set_handler(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
- PyGILState_STATE gilstate = PyGILState_Ensure();
-
- struct {
- PyObject *self;
- char *target;
- PyObject *py_fn_slots[BPY_GIZMO_FN_SLOT_LEN];
- } params = {
- .self = NULL,
- .target = NULL,
- .py_fn_slots = {NULL},
- };
-
- /* Note: this is a counter-part to functions:
- * '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};
- if (!_PyArg_ParseTupleAndKeywordsFast(
- args, kw, &_parser,
- &params.self,
- &params.target,
- &params.py_fn_slots[BPY_GIZMO_FN_SLOT_GET],
- &params.py_fn_slots[BPY_GIZMO_FN_SLOT_SET],
- &params.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;
- }
-
- {
- const int slots_required = 2;
- const int slots_start = 2;
- for (int i = 0; i < BPY_GIZMO_FN_SLOT_LEN; i++) {
- if (params.py_fn_slots[i] == NULL) {
- if (i < slots_required) {
- PyErr_Format(PyExc_ValueError, "Argument '%s' not given", _keywords[slots_start + i]);
- goto fail;
- }
- }
- else if (!PyCallable_Check(params.py_fn_slots[i])) {
- PyErr_Format(PyExc_ValueError, "Argument '%s' not callable", _keywords[slots_start + i]);
- goto fail;
- }
- }
- }
-
- struct BPyGizmoHandlerUserData *data = MEM_callocN(sizeof(*data), __func__);
-
- for (int i = 0; i < BPY_GIZMO_FN_SLOT_LEN; i++) {
- data->fn_slots[i] = params.py_fn_slots[i];
- Py_XINCREF(params.py_fn_slots[i]);
- }
-
- WM_gizmo_target_property_def_func_ptr(
- gz, gz_prop_type,
- &(const struct wmGizmoPropertyFnParams) {
- .value_get_fn = py_rna_gizmo_handler_get_cb,
- .value_set_fn = py_rna_gizmo_handler_set_cb,
- .range_get_fn = py_rna_gizmo_handler_range_get_cb,
- .free_fn = py_rna_gizmo_handler_free_cb,
- .user_data = data,
- });
-
- PyGILState_Release(gilstate);
-
- Py_RETURN_NONE;
+ PyGILState_STATE gilstate = PyGILState_Ensure();
+
+ struct {
+ PyObject *self;
+ char *target;
+ PyObject *py_fn_slots[BPY_GIZMO_FN_SLOT_LEN];
+ } params = {
+ .self = NULL,
+ .target = NULL,
+ .py_fn_slots = {NULL},
+ };
+
+ /* Note: this is a counter-part to functions:
+ * '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};
+ if (!_PyArg_ParseTupleAndKeywordsFast(args,
+ kw,
+ &_parser,
+ &params.self,
+ &params.target,
+ &params.py_fn_slots[BPY_GIZMO_FN_SLOT_GET],
+ &params.py_fn_slots[BPY_GIZMO_FN_SLOT_SET],
+ &params.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;
+ }
+
+ {
+ const int slots_required = 2;
+ const int slots_start = 2;
+ for (int i = 0; i < BPY_GIZMO_FN_SLOT_LEN; i++) {
+ if (params.py_fn_slots[i] == NULL) {
+ if (i < slots_required) {
+ PyErr_Format(PyExc_ValueError, "Argument '%s' not given", _keywords[slots_start + i]);
+ goto fail;
+ }
+ }
+ else if (!PyCallable_Check(params.py_fn_slots[i])) {
+ PyErr_Format(PyExc_ValueError, "Argument '%s' not callable", _keywords[slots_start + i]);
+ goto fail;
+ }
+ }
+ }
+
+ struct BPyGizmoHandlerUserData *data = MEM_callocN(sizeof(*data), __func__);
+
+ for (int i = 0; i < BPY_GIZMO_FN_SLOT_LEN; i++) {
+ data->fn_slots[i] = params.py_fn_slots[i];
+ Py_XINCREF(params.py_fn_slots[i]);
+ }
+
+ WM_gizmo_target_property_def_func_ptr(gz,
+ gz_prop_type,
+ &(const struct wmGizmoPropertyFnParams){
+ .value_get_fn = py_rna_gizmo_handler_get_cb,
+ .value_set_fn = py_rna_gizmo_handler_set_cb,
+ .range_get_fn = py_rna_gizmo_handler_range_get_cb,
+ .free_fn = py_rna_gizmo_handler_free_cb,
+ .user_data = data,
+ });
+
+ PyGILState_Release(gilstate);
+
+ Py_RETURN_NONE;
fail:
- PyGILState_Release(gilstate);
- return NULL;
+ PyGILState_Release(gilstate);
+ return NULL;
}
/** \} */
@@ -327,233 +324,222 @@ fail:
* \{ */
PyDoc_STRVAR(bpy_gizmo_target_get_value_doc,
-".. method:: target_get_value(target):\n"
-"\n"
-" Get the value of this target property.\n"
-"\n"
-" :arg target: Target property name.\n"
-" :type target: string\n"
-" :return: The value of the target property.\n"
-" :rtype: Single value or array based on the target type\n"
-);
+ ".. method:: target_get_value(target):\n"
+ "\n"
+ " Get the value of this target property.\n"
+ "\n"
+ " :arg target: Target property name.\n"
+ " :type target: string\n"
+ " :return: The value of the target property.\n"
+ " :rtype: Single value or array based on the target type\n");
static PyObject *bpy_gizmo_target_get_value(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
- struct {
- PyObject *self;
- char *target;
- } params = {
- .self = NULL,
- .target = 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,
- &params.self,
- &params.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;
- }
-
- const int array_len = WM_gizmo_target_property_array_length(gz, gz_prop);
- switch (gz_prop->type->data_type) {
- case PROP_FLOAT:
- {
- if (array_len != 0) {
- float *value = BLI_array_alloca(value, array_len);
- WM_gizmo_target_property_float_get_array(gz, gz_prop, value);
- return PyC_Tuple_PackArray_F32(value, array_len);
- }
- else {
- float value = WM_gizmo_target_property_float_get(gz, gz_prop);
- return PyFloat_FromDouble(value);
- }
- break;
- }
- default:
- {
- PyErr_SetString(PyExc_RuntimeError, "Not yet supported type");
- goto fail;
- }
- }
+ struct {
+ PyObject *self;
+ char *target;
+ } params = {
+ .self = NULL,
+ .target = 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, &params.self, &params.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;
+ }
+
+ const int array_len = WM_gizmo_target_property_array_length(gz, gz_prop);
+ switch (gz_prop->type->data_type) {
+ case PROP_FLOAT: {
+ if (array_len != 0) {
+ float *value = BLI_array_alloca(value, array_len);
+ WM_gizmo_target_property_float_get_array(gz, gz_prop, value);
+ return PyC_Tuple_PackArray_F32(value, array_len);
+ }
+ else {
+ float value = WM_gizmo_target_property_float_get(gz, gz_prop);
+ return PyFloat_FromDouble(value);
+ }
+ break;
+ }
+ default: {
+ PyErr_SetString(PyExc_RuntimeError, "Not yet supported type");
+ goto fail;
+ }
+ }
fail:
- return NULL;
+ return NULL;
}
PyDoc_STRVAR(bpy_gizmo_target_set_value_doc,
-".. method:: target_set_value(target):\n"
-"\n"
-" Set the value of this target property.\n"
-"\n"
-" :arg target: Target property name.\n"
-" :type target: string\n"
-);
+ ".. method:: target_set_value(target):\n"
+ "\n"
+ " Set the value of this target property.\n"
+ "\n"
+ " :arg target: Target property name.\n"
+ " :type target: string\n");
static PyObject *bpy_gizmo_target_set_value(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
- struct {
- PyObject *self;
- char *target;
- PyObject *value;
- } params = {
- .self = NULL,
- .target = 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,
- &params.self,
- &params.target,
- &params.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;
- }
-
- const int array_len = WM_gizmo_target_property_array_length(gz, gz_prop);
- switch (gz_prop->type->data_type) {
- case PROP_FLOAT:
- {
- if (array_len != 0) {
- float *value = BLI_array_alloca(value, array_len);
- if (PyC_AsArray(value, params.value, gz_prop->type->array_length, &PyFloat_Type, false,
- "Gizmo target property array") == -1)
- {
- goto fail;
- }
- WM_gizmo_target_property_float_set_array(BPy_GetContext(), gz, gz_prop, value);
- }
- else {
- float value;
- if ((value = PyFloat_AsDouble(params.value)) == -1.0f && PyErr_Occurred()) {
- goto fail;
- }
- WM_gizmo_target_property_float_set(BPy_GetContext(), gz, gz_prop, value);
- }
- Py_RETURN_NONE;
- }
- default:
- {
- PyErr_SetString(PyExc_RuntimeError, "Not yet supported type");
- goto fail;
- }
- }
+ struct {
+ PyObject *self;
+ char *target;
+ PyObject *value;
+ } params = {
+ .self = NULL,
+ .target = 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, &params.self, &params.target, &params.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;
+ }
+
+ const int array_len = WM_gizmo_target_property_array_length(gz, gz_prop);
+ switch (gz_prop->type->data_type) {
+ case PROP_FLOAT: {
+ if (array_len != 0) {
+ float *value = BLI_array_alloca(value, array_len);
+ if (PyC_AsArray(value,
+ params.value,
+ gz_prop->type->array_length,
+ &PyFloat_Type,
+ false,
+ "Gizmo target property array") == -1) {
+ goto fail;
+ }
+ WM_gizmo_target_property_float_set_array(BPy_GetContext(), gz, gz_prop, value);
+ }
+ else {
+ float value;
+ if ((value = PyFloat_AsDouble(params.value)) == -1.0f && PyErr_Occurred()) {
+ goto fail;
+ }
+ WM_gizmo_target_property_float_set(BPy_GetContext(), gz, gz_prop, value);
+ }
+ Py_RETURN_NONE;
+ }
+ default: {
+ PyErr_SetString(PyExc_RuntimeError, "Not yet supported type");
+ goto fail;
+ }
+ }
fail:
- return NULL;
+ return NULL;
}
-
PyDoc_STRVAR(bpy_gizmo_target_get_range_doc,
-".. method:: target_get_range(target):\n"
-"\n"
-" Get the range for this target property.\n"
-"\n"
-" :arg target: Target property name.\n"
-" :return: The range of this property (min, max).\n"
-" :rtype: tuple pair.\n"
-);
+ ".. method:: target_get_range(target):\n"
+ "\n"
+ " Get the range for this target property.\n"
+ "\n"
+ " :arg target: Target property name.\n"
+ " :return: The range of this property (min, max).\n"
+ " :rtype: tuple pair.\n");
static PyObject *bpy_gizmo_target_get_range(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
- struct {
- PyObject *self;
- char *target;
- } params = {
- .self = NULL,
- .target = 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,
- &params.self,
- &params.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;
- }
-
- switch (gz_prop->type->data_type) {
- case PROP_FLOAT:
- {
- float range[2];
- WM_gizmo_target_property_float_range_get(gz, gz_prop, range);
- return PyC_Tuple_PackArray_F32(range, 2);
- }
- default:
- {
- PyErr_SetString(PyExc_RuntimeError, "Not yet supported type");
- goto fail;
- }
- }
+ struct {
+ PyObject *self;
+ char *target;
+ } params = {
+ .self = NULL,
+ .target = 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, &params.self, &params.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;
+ }
+
+ switch (gz_prop->type->data_type) {
+ case PROP_FLOAT: {
+ float range[2];
+ WM_gizmo_target_property_float_range_get(gz, gz_prop, range);
+ return PyC_Tuple_PackArray_F32(range, 2);
+ }
+ default: {
+ PyErr_SetString(PyExc_RuntimeError, "Not yet supported type");
+ goto fail;
+ }
+ }
fail:
- return NULL;
+ return NULL;
}
/** \} */
int BPY_rna_gizmo_module(PyObject *mod_par)
{
- static PyMethodDef method_def_array[] = {
- /* Gizmo Target Property Define API */
- {"target_set_handler", (PyCFunction)bpy_gizmo_target_set_handler,
- METH_VARARGS | METH_KEYWORDS, bpy_gizmo_target_set_handler_doc},
- /* Gizmo Target Property Access API */
- {"target_get_value", (PyCFunction)bpy_gizmo_target_get_value,
- METH_VARARGS | METH_KEYWORDS, bpy_gizmo_target_get_value_doc},
- {"target_set_value", (PyCFunction)bpy_gizmo_target_set_value,
- METH_VARARGS | METH_KEYWORDS, bpy_gizmo_target_set_value_doc},
- {"target_get_range", (PyCFunction)bpy_gizmo_target_get_range,
- METH_VARARGS | METH_KEYWORDS, bpy_gizmo_target_get_range_doc},
- /* no sentinel needed. */
- };
-
- for (int i = 0; i < ARRAY_SIZE(method_def_array); i++) {
- PyMethodDef *m = &method_def_array[i];
- PyObject *func = PyCFunction_New(m, NULL);
- PyObject *func_inst = PyInstanceMethod_New(func);
- char name_prefix[128];
- PyOS_snprintf(name_prefix, sizeof(name_prefix), "_rna_gizmo_%s", m->ml_name);
- /* TODO, return a type that binds nearly to a method. */
- PyModule_AddObject(mod_par, name_prefix, func_inst);
- }
-
- return 0;
+ static PyMethodDef method_def_array[] = {
+ /* Gizmo Target Property Define API */
+ {"target_set_handler",
+ (PyCFunction)bpy_gizmo_target_set_handler,
+ METH_VARARGS | METH_KEYWORDS,
+ bpy_gizmo_target_set_handler_doc},
+ /* Gizmo Target Property Access API */
+ {"target_get_value",
+ (PyCFunction)bpy_gizmo_target_get_value,
+ METH_VARARGS | METH_KEYWORDS,
+ bpy_gizmo_target_get_value_doc},
+ {"target_set_value",
+ (PyCFunction)bpy_gizmo_target_set_value,
+ METH_VARARGS | METH_KEYWORDS,
+ bpy_gizmo_target_set_value_doc},
+ {"target_get_range",
+ (PyCFunction)bpy_gizmo_target_get_range,
+ METH_VARARGS | METH_KEYWORDS,
+ bpy_gizmo_target_get_range_doc},
+ /* no sentinel needed. */
+ };
+
+ for (int i = 0; i < ARRAY_SIZE(method_def_array); i++) {
+ PyMethodDef *m = &method_def_array[i];
+ PyObject *func = PyCFunction_New(m, NULL);
+ PyObject *func_inst = PyInstanceMethod_New(func);
+ char name_prefix[128];
+ PyOS_snprintf(name_prefix, sizeof(name_prefix), "_rna_gizmo_%s", m->ml_name);
+ /* TODO, return a type that binds nearly to a method. */
+ PyModule_AddObject(mod_par, name_prefix, func_inst);
+ }
+
+ return 0;
}