28#include "RNA_prototypes.hh"
66 if (!PyUnicode_Check(o)) {
67 PyErr_Format(PyExc_TypeError,
"expected a string (got %.200s)", Py_TYPE(o)->tp_name);
70 const char *gz_prop_id = PyUnicode_AsUTF8(o);
72 if (gz_prop ==
nullptr) {
73 PyErr_Format(PyExc_ValueError,
74 "Gizmo target property '%s.%s' not found!",
79 gizmo_with_target->
gz_prop = gz_prop;
92 const char *gz_prop_id = PyUnicode_AsUTF8(o);
93 PyErr_Format(PyExc_ValueError,
94 "Gizmo target property '%s.%s' has not been initialized, "
95 "Call \"target_set_prop\" first!",
110 if (!PyUnicode_Check(o)) {
111 PyErr_Format(PyExc_TypeError,
"expected a string (got %.200s)", Py_TYPE(o)->tp_name);
114 const char *gz_prop_id = PyUnicode_AsUTF8(o);
117 if (gz_prop_type ==
nullptr) {
118 PyErr_Format(PyExc_ValueError,
119 "Gizmo target property '%s.%s' not found!",
139#define BPY_GIZMO_FN_SLOT_LEN (BPY_GIZMO_FN_SLOT_RANGE_GET + 1)
150 const PyGILState_STATE gilstate = PyGILState_Ensure();
155 if (
ret ==
nullptr) {
160 float *value =
static_cast<float *
>(value_p);
162 if ((*value = PyFloat_AsDouble(
ret)) == -1.0f && PyErr_Occurred()) {
172 "Gizmo get callback: ") == -1)
179 PyErr_SetString(PyExc_AttributeError,
"internal error, unsupported type");
185 PyGILState_Release(gilstate);
193 PyGILState_Release(gilstate);
200 const PyGILState_STATE gilstate = PyGILState_Ensure();
205 PyObject *args = PyTuple_New(1);
209 const float *value =
static_cast<const float *
>(value_p);
212 py_value = PyFloat_FromDouble(*value);
217 if (py_value ==
nullptr) {
220 PyTuple_SET_ITEM(args, 0, py_value);
223 PyErr_SetString(PyExc_AttributeError,
"internal error, unsupported type");
228 if (
ret ==
nullptr) {
234 PyGILState_Release(gilstate);
242 PyGILState_Release(gilstate);
249 const PyGILState_STATE gilstate = PyGILState_Ensure();
255 if (
ret ==
nullptr) {
259 if (!PyTuple_Check(
ret)) {
260 PyErr_Format(PyExc_TypeError,
"Expected a tuple, not %.200s", Py_TYPE(
ret)->tp_name);
264 if (PyTuple_GET_SIZE(
ret) != 2) {
265 PyErr_Format(PyExc_TypeError,
"Expected a tuple of size 2, not %d", PyTuple_GET_SIZE(
ret));
271 for (
int i = 0;
i < 2;
i++) {
272 if (((range[
i] = PyFloat_AsDouble(PyTuple_GET_ITEM(
ret,
i))) == -1.0f && PyErr_Occurred()) ==
281 memcpy(value_p, range,
sizeof(range));
284 PyErr_SetString(PyExc_AttributeError,
"internal error, unsupported type");
289 PyGILState_Release(gilstate);
297 PyGILState_Release(gilstate);
302 const PyGILState_STATE gilstate = PyGILState_Ensure();
308 Py_XDECREF(
data->fn_slots[
i]);
310 PyGILState_Release(gilstate);
317 bpy_gizmo_target_set_handler_doc,
318 ".. method:: target_set_handler(target, get, set, range=None):\n"
320 " Assigns callbacks to a gizmos property.\n"
322 " :arg target: Target property name.\n"
323 " :type target: str\n"
324 " :arg get: Function that returns the value for this property (single value or sequence).\n"
325 " :type get: Callable[[], float | Sequence[float]]\n"
326 " :arg set: Function that takes a single value argument and applies it.\n"
327 " :type set: Callable[[tuple[float, ...]], Any]\n"
328 " :arg range: Function that returns a (min, max) tuple for gizmos that use a range. "
329 "The returned value is not used.\n"
330 " :type range: callable\n");
344 static const char *
const _keywords[] = {
"self",
"target",
"get",
"set",
"range",
nullptr};
345 static _PyArg_Parser _parser = {
353 ":target_set_handler",
362 if (!_PyArg_ParseTupleAndKeywordsFast(args,
367 &
params.gz_with_target_type.gz,
370 &
params.gz_with_target_type,
379 gz =
params.gz_with_target_type.gz;
380 gz_prop_type =
params.gz_with_target_type.gz_prop_type;
383 const int slots_required = 2;
384 const int slots_start = 2;
386 if (
params.py_fn_slots[
i] ==
nullptr) {
387 if (
i < slots_required) {
388 PyErr_Format(PyExc_ValueError,
"Argument '%s' not given", _keywords[slots_start +
i]);
392 else if (!PyCallable_Check(
params.py_fn_slots[
i])) {
393 PyErr_Format(PyExc_ValueError,
"Argument '%s' not callable", _keywords[slots_start +
i]);
403 Py_XINCREF(
params.py_fn_slots[
i]);
430 bpy_gizmo_target_get_value_doc,
431 ".. method:: target_get_value(target):\n"
433 " Get the value of this target property.\n"
435 " :arg target: Target property name.\n"
436 " :type target: str\n"
437 " :return: The value of the target property as a value or array based on the target type.\n"
438 " :rtype: float | tuple[float, ...]\n");
447 static const char *
const _keywords[] = {
"self",
"target",
nullptr};
448 static _PyArg_Parser _parser = {
461 if (!_PyArg_ParseTupleAndKeywordsFast(args,
466 &
params.gz_with_target.gz,
474 gz =
params.gz_with_target.gz;
475 gz_prop =
params.gz_with_target.gz_prop;
480 if (array_len != 0) {
487 return PyFloat_FromDouble(value);
490 PyErr_SetString(PyExc_RuntimeError,
"Not yet supported type");
501 bpy_gizmo_target_set_value_doc,
502 ".. method:: target_set_value(target):\n"
504 " Set the value of this target property.\n"
506 " :arg target: Target property name.\n"
507 " :type target: str\n");
518 static const char *
const _keywords[] = {
"self",
"target",
"value",
nullptr};
519 static _PyArg_Parser _parser = {
533 if (!_PyArg_ParseTupleAndKeywordsFast(args,
538 &
params.gz_with_target.gz,
548 gz =
params.gz_with_target.gz;
549 gz_prop =
params.gz_with_target.gz_prop;
554 if (array_len != 0) {
561 "Gizmo target property array: ") == -1)
569 if ((value = PyFloat_AsDouble(
params.value)) == -1.0f && PyErr_Occurred()) {
577 PyErr_SetString(PyExc_RuntimeError,
"Not yet supported type");
588 bpy_gizmo_target_get_range_doc,
589 ".. method:: target_get_range(target):\n"
591 " Get the range for this target property.\n"
593 " :arg target: Target property name.\n"
594 " :return: The range of this property (min, max).\n"
595 " :rtype: tuple[float, float]\n");
604 static const char *
const _keywords[] = {
"self",
"target",
nullptr};
605 static _PyArg_Parser _parser = {
617 if (!_PyArg_ParseTupleAndKeywordsFast(args,
622 &
params.gz_with_target.gz,
630 gz =
params.gz_with_target.gz;
631 gz_prop =
params.gz_with_target.gz_prop;
640 PyErr_SetString(PyExc_RuntimeError,
"Not yet supported type");
660# pragma clang diagnostic push
661# pragma clang diagnostic ignored "-Wcast-function-type"
663# pragma GCC diagnostic push
664# pragma GCC diagnostic ignored "-Wcast-function-type"
668 static PyMethodDef method_def_array[] = {
670 {
"target_set_handler",
672 METH_VARARGS | METH_KEYWORDS,
673 bpy_gizmo_target_set_handler_doc},
677 METH_VARARGS | METH_KEYWORDS,
678 bpy_gizmo_target_get_value_doc},
681 METH_VARARGS | METH_KEYWORDS,
682 bpy_gizmo_target_set_value_doc},
685 METH_VARARGS | METH_KEYWORDS,
686 bpy_gizmo_target_get_range_doc},
692# pragma clang diagnostic pop
694# pragma GCC diagnostic pop
699 PyMethodDef *m = &method_def_array[
i];
700 PyObject *func = PyCFunction_New(m,
nullptr);
701 PyObject *func_inst = PyInstanceMethod_New(func);
702 char name_prefix[128];
703 PyOS_snprintf(name_prefix,
sizeof(name_prefix),
"_rna_gizmo_%s", m->ml_name);
705 PyModule_AddObject(mod_par, name_prefix, func_inst);
#define BLI_array_alloca(arr, realsize)
Read Guarded memory(de)allocation.
BMesh const char void * data
struct bContext * BPY_context_get()
#define BPy_StructRNA_Check(v)
static void py_rna_gizmo_handler_range_get_cb(const wmGizmo *, wmGizmoProperty *gz_prop, void *value_p)
static void py_rna_gizmo_handler_free_cb(const wmGizmo *, wmGizmoProperty *gz_prop)
bool BPY_rna_gizmo_module(PyObject *mod_par)
static int py_rna_gizmo_target_id_parse(PyObject *o, void *p)
static int py_rna_gizmo_target_id_parse_and_ensure_is_valid(PyObject *o, void *p)
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 target: Target property name.\n" " :type target: str\n" " :arg get: Function that returns the value for this property (single value or sequence).\n" " :type get: Callable[[], float | Sequence[float]]\n" " :arg set: Function that takes a single value argument and applies it.\n" " :type set: Callable[[tuple[float, ...]], Any]\n" " :arg range: Function that returns a (min, max) tuple for gizmos that use a range. " "The returned value is not used.\n" " :type range: callable\n")
static PyObject * bpy_gizmo_target_set_handler(PyObject *, PyObject *args, PyObject *kw)
static PyObject * bpy_gizmo_target_set_value(PyObject *, PyObject *args, PyObject *kw)
static PyObject * bpy_gizmo_target_get_value(PyObject *, PyObject *args, PyObject *kw)
#define BPY_GIZMO_FN_SLOT_LEN
static PyObject * bpy_gizmo_target_get_range(PyObject *, PyObject *args, PyObject *kw)
static int py_rna_gizmo_target_type_id_parse(PyObject *o, void *p)
@ BPY_GIZMO_FN_SLOT_RANGE_GET
static void py_rna_gizmo_handler_get_cb(const wmGizmo *, wmGizmoProperty *gz_prop, void *value_p)
static void py_rna_gizmo_handler_set_cb(const wmGizmo *, wmGizmoProperty *gz_prop, const void *value_p)
static int py_rna_gizmo_parse(PyObject *o, void *p)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
int PyC_AsArray(void *array, const size_t array_item_size, PyObject *value, const Py_ssize_t length, const PyTypeObject *type, const char *error_prefix)
PyObject * PyC_Tuple_PackArray_F32(const float *array, uint len)
header-only compatibility defines.
#define PY_ARG_PARSER_HEAD_COMPAT()
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
PyObject * fn_slots[BPY_GIZMO_FN_SLOT_LEN]
const wmGizmoPropertyType * gz_prop_type
wmGizmoProperty * gz_prop
wmGizmoPropertyFnGet value_get_fn
wmGizmoPropertyFnRangeGet range_get_fn
wmGizmoPropertyFnFree free_fn
wmGizmoPropertyFnSet value_set_fn
const wmGizmoPropertyType * type
struct wmGizmoProperty::@331027022007232055216276241130041346111314317052 custom_func
void WM_gizmo_target_property_float_set(bContext *C, const wmGizmo *gz, wmGizmoProperty *gz_prop, const float value)
const wmGizmoPropertyType * WM_gizmotype_target_property_find(const wmGizmoType *gzt, const char *idname)
bool WM_gizmo_target_property_is_valid(const wmGizmoProperty *gz_prop)
void WM_gizmo_target_property_float_get_array(const wmGizmo *gz, wmGizmoProperty *gz_prop, float *value)
int WM_gizmo_target_property_array_length(const wmGizmo *, wmGizmoProperty *gz_prop)
void WM_gizmo_target_property_def_func_ptr(wmGizmo *gz, const wmGizmoPropertyType *gz_prop_type, const wmGizmoPropertyFnParams *params)
float WM_gizmo_target_property_float_get(const wmGizmo *gz, wmGizmoProperty *gz_prop)
void WM_gizmo_target_property_float_set_array(bContext *C, const wmGizmo *gz, wmGizmoProperty *gz_prop, const float *value)
wmGizmoProperty * WM_gizmo_target_property_find(wmGizmo *gz, const char *idname)
bool WM_gizmo_target_property_float_range_get(const wmGizmo *gz, wmGizmoProperty *gz_prop, float range[2])