25#define USE_STRING_COERCE
27#ifdef USE_STRING_COERCE
42 return kwargs && PyDict_GetItemString(kwargs, name) !=
nullptr;
49 const char *rna_subtype,
50 const char *description)
52 if (rna_subtype !=
nullptr) {
56 "IDPropertyUIManager.update") == -1)
62 if (description !=
nullptr) {
72 if (PyLong_CheckExact(py_long)) {
73 *r_int =
int(PyLong_AS_LONG(py_long));
86 if (!PyTuple_CheckExact(py_item)) {
89 Py_ssize_t item_size = PyTuple_GET_SIZE(py_item);
90 if (item_size < 3 || item_size > 5) {
94 Py_ssize_t identifier_len;
96 Py_ssize_t description_len;
97 const char *identifier = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(py_item, 0), &identifier_len);
98 const char *name = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(py_item, 1), &name_len);
99 const char *description = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(py_item, 2),
101 if (!identifier || !name || !description) {
105 const char *icon_name =
nullptr;
106 if (item_size <= 3) {
109 else if (item_size == 4) {
114 else if (item_size == 5) {
117 !(icon_name = PyUnicode_AsUTF8(PyTuple_GET_ITEM(py_item, 3))))
139 const Py_ssize_t seq_len = PySequence_Fast_GET_SIZE(seq_fast);
140 PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast);
143 items = MEM_cnew_array<IDPropertyUIDataEnumItem>(seq_len, __func__);
144 r_items_num = seq_len;
146 for (i = 0; i < seq_len; i++) {
148 PyObject *py_item = seq_fast_items[i];
152 else if (py_item == Py_None) {
157 PyErr_SetString(PyExc_TypeError,
158 "expected a tuple containing "
159 "(identifier, name, description) and optionally an "
160 "icon name and unique number");
174 PyObject *default_value)
176 if (PySequence_Check(default_value)) {
178 PyErr_SetString(PyExc_TypeError,
"Only array properties can have array default values");
182 Py_ssize_t
len = PySequence_Size(default_value);
185 new_default_array,
sizeof(
int), default_value,
len, &PyLong_Type,
"ui_data_update") ==
196 const int value = PyC_Long_AsI32(default_value);
197 if ((value == -1) && PyErr_Occurred()) {
198 PyErr_SetString(PyExc_ValueError,
"Error converting \"default\" argument to integer");
217 const char *rna_subtype =
nullptr;
218 const char *description =
nullptr;
219 int min,
max, soft_min, soft_max, step;
220 PyObject *default_value =
nullptr;
221 PyObject *items =
nullptr;
222 const char *kwlist[] = {
234 if (!PyArg_ParseTupleAndKeywords(args,
236 "|$iiiiiOOzz:update",
263 ui_data.
max = std::max(ui_data.
min, ui_data.
max);
268 ui_data.
min = std::min(ui_data.
min, ui_data.
max);
284 if (!
ELEM(default_value,
nullptr, Py_None)) {
292 if (!
ELEM(items,
nullptr, Py_None)) {
293 PyObject *items_fast;
294 if (!(items_fast = PySequence_Fast(items,
"expected a sequence of tuples for the enum items")))
299 int idprop_items_num = 0;
303 Py_DECREF(items_fast);
307 PyErr_SetString(PyExc_ValueError, msg);
310 Py_DECREF(items_fast);
313 Py_DECREF(items_fast);
324 *ui_data_orig = ui_data;
334 PyObject *default_value)
336 if (PySequence_Check(default_value)) {
338 PyErr_SetString(PyExc_TypeError,
"Only array properties can have array default values");
342 Py_ssize_t
len = PySequence_Size(default_value);
349 "ui_data_update") == -1)
360 if ((value == -1) && PyErr_Occurred()) {
361 PyErr_SetString(PyExc_ValueError,
"Error converting \"default\" argument to integer");
380 const char *rna_subtype =
nullptr;
381 const char *description =
nullptr;
382 PyObject *default_value =
nullptr;
383 const char *kwlist[] = {
"default",
"subtype",
"description",
nullptr};
384 if (!PyArg_ParseTupleAndKeywords(args,
404 if (!
ELEM(default_value,
nullptr, Py_None)) {
414 *ui_data_orig = ui_data;
424 PyObject *default_value)
426 if (PySequence_Check(default_value)) {
428 PyErr_SetString(PyExc_TypeError,
"Only array properties can have array default values");
432 Py_ssize_t
len = PySequence_Size(default_value);
439 "ui_data_update") == -1)
449 const double value = PyFloat_AsDouble(default_value);
450 if ((value == -1.0) && PyErr_Occurred()) {
451 PyErr_SetString(PyExc_ValueError,
"Error converting \"default\" argument to double");
470 const char *rna_subtype =
nullptr;
471 const char *description =
nullptr;
473 double min,
max, soft_min, soft_max, step;
474 PyObject *default_value =
nullptr;
475 const char *kwlist[] = {
"min",
485 if (!PyArg_ParseTupleAndKeywords(args,
487 "|$dddddiOzz:update",
514 ui_data.
max = std::max(ui_data.
min, ui_data.
max);
519 ui_data.
min = std::min(ui_data.
min, ui_data.
max);
538 if (!
ELEM(default_value,
nullptr, Py_None)) {
548 *ui_data_orig = ui_data;
557 const char *rna_subtype =
nullptr;
558 const char *description =
nullptr;
559 const char *default_value =
nullptr;
560 const char *kwlist[] = {
"default",
"subtype",
"description",
nullptr};
561 if (!PyArg_ParseTupleAndKeywords(args,
581 if (default_value !=
nullptr) {
587 *ui_data_orig = ui_data;
596 const char *rna_subtype =
nullptr;
597 const char *description =
nullptr;
598 const char *id_type =
nullptr;
599 const char *kwlist[] = {
"subtype",
"description",
"id_type",
nullptr};
600 if (!PyArg_ParseTupleAndKeywords(
601 args, kwargs,
"|$zzz:update", (
char **)kwlist, &rna_subtype, &description, &id_type))
615 if (id_type !=
nullptr) {
623 ui_data.
id_type = short(id_type_tmp);
628 *ui_data_orig = ui_data;
634 BPy_IDPropertyUIManager_update_doc,
635 ".. method:: update( "
646 "description=None)\n"
648 " Update the RNA information of the IDProperty used for interaction and\n"
649 " display in the user interface. The required types for many of the keyword\n"
650 " arguments depend on the type of the property.\n ");
690 PyErr_Format(PyExc_TypeError,
"IDProperty \"%s\" does not support RNA data", property->name);
709 PyDict_SetItemString(dict,
"min", item = PyLong_FromLong(ui_data->
min));
711 PyDict_SetItemString(dict,
"max", item = PyLong_FromLong(ui_data->
max));
713 PyDict_SetItemString(dict,
"soft_min", item = PyLong_FromLong(ui_data->
soft_min));
715 PyDict_SetItemString(dict,
"soft_max", item = PyLong_FromLong(ui_data->
soft_max));
717 PyDict_SetItemString(dict,
"step", item = PyLong_FromLong(ui_data->
step));
722 PyList_SET_ITEM(list, i, PyLong_FromLong(ui_data->
default_array[i]));
724 PyDict_SetItemString(dict,
"default", list);
728 PyDict_SetItemString(dict,
"default", item = PyLong_FromLong(ui_data->
default_value));
739 PyObject *item_tuple = PyTuple_New(5);
740 PyTuple_SET_ITEM(item_tuple, 0, PyUnicode_FromString(item.
identifier));
741 PyTuple_SET_ITEM(item_tuple, 1, PyUnicode_FromString(item.
name));
744 PyTuple_SET_ITEM(item_tuple, 3, PyLong_FromLong(item.
icon));
745 PyTuple_SET_ITEM(item_tuple, 4, PyLong_FromLong(item.
value));
747 PyList_SET_ITEM(items_list, i, item_tuple);
749 PyDict_SetItemString(dict,
"items", items_list);
750 Py_DECREF(items_list);
762 PyList_SET_ITEM(list, i, PyBool_FromLong(ui_data->
default_array[i]));
764 PyDict_SetItemString(dict,
"default", list);
768 PyDict_SetItemString(dict,
"default", item = PyBool_FromLong(ui_data->
default_value));
778 PyDict_SetItemString(dict,
"min", item = PyFloat_FromDouble(ui_data->
min));
780 PyDict_SetItemString(dict,
"max", item = PyFloat_FromDouble(ui_data->
max));
782 PyDict_SetItemString(dict,
"soft_min", item = PyFloat_FromDouble(ui_data->
soft_min));
784 PyDict_SetItemString(dict,
"soft_max", item = PyFloat_FromDouble(ui_data->
soft_max));
786 PyDict_SetItemString(dict,
"step", item = PyFloat_FromDouble(
double(ui_data->
step)));
788 PyDict_SetItemString(dict,
"precision", item = PyLong_FromDouble(
double(ui_data->
precision)));
793 PyList_SET_ITEM(list, i, PyFloat_FromDouble(ui_data->
default_array[i]));
795 PyDict_SetItemString(dict,
"default", list);
799 PyDict_SetItemString(dict,
"default", item = PyFloat_FromDouble(ui_data->
default_value));
811 PyDict_SetItemString(dict,
"default", item = PyUnicode_FromString(default_value));
819 short id_type_value = ui_data->
id_type;
820 if (id_type_value == 0) {
825 id_type_value =
id ?
GS(id->name) :
ID_OB;
828 const char *id_type =
nullptr;
834 PyObject *item = PyUnicode_FromString(id_type);
835 PyDict_SetItemString(dict,
"id_type", item);
841 BPy_IDPropertyUIManager_as_dict_doc,
842 ".. method:: as_dict()\n"
844 " Return a dictionary of the property's RNA UI data. The fields in the\n"
845 " returned dictionary and their types will depend on the property's type.\n");
853 PyObject *dict = PyDict_New();
857 const char *subtype_id =
nullptr;
859 PyObject *item = PyUnicode_FromString(subtype_id);
860 PyDict_SetItemString(dict,
"subtype", item);
866 PyObject *item = PyUnicode_FromString(ui_data->
description);
867 PyDict_SetItemString(dict,
"description", item);
904 BPy_IDPropertyUIManager_clear_doc,
905 ".. method:: clear()\n"
907 " Remove the RNA UI data from this IDProperty.\n");
913 if (property ==
nullptr) {
914 PyErr_SetString(PyExc_RuntimeError,
"IDPropertyUIManager missing property");
919 if (property->ui_data !=
nullptr) {
934 BPy_IDPropertyUIManager_update_from_doc,
935 ".. method:: update_from(ui_manager_source)\n"
937 " Copy UI data from an IDProperty in the source group to a property in this group.\n "
938 " If the source property has no UI data, the target UI data will be reset if it exists.\n"
940 " :raises TypeError: If the types of the two properties don't match.\n");
951 if (property->ui_data !=
nullptr) {
968#if (defined(__GNUC__) && !defined(__clang__))
969# pragma GCC diagnostic push
970# pragma GCC diagnostic ignored "-Wcast-function-type"
976 METH_VARARGS | METH_KEYWORDS,
977 BPy_IDPropertyUIManager_update_doc},
981 BPy_IDPropertyUIManager_as_dict_doc},
985 BPy_IDPropertyUIManager_clear_doc},
989 BPy_IDPropertyUIManager_update_from_doc},
990 {
nullptr,
nullptr, 0,
nullptr},
993#if (defined(__GNUC__) && !defined(__clang__))
994# pragma GCC diagnostic pop
999 return PyUnicode_FromFormat(
1000 "<bpy id prop ui manager: name=\"%s\", address=%p>",
self->property->name,
self->property);
1005 return _Py_HashPointer(
self->property);
1009 PyVarObject_HEAD_INIT(
nullptr, 0)
1011 "IDPropertyUIManager",
void IDP_ui_data_free(IDProperty *prop)
bool IDP_EnumItemsValidate(const IDPropertyUIDataEnumItem *items, int items_num, void(*error_fn)(const char *))
eIDPropertyUIDataType IDP_ui_data_type(const IDProperty *prop)
bool IDP_ui_data_supported(const IDProperty *prop)
IDPropertyUIData * IDP_ui_data_copy(const IDProperty *prop)
@ IDP_UI_DATA_TYPE_BOOLEAN
@ IDP_UI_DATA_TYPE_UNSUPPORTED
@ IDP_UI_DATA_TYPE_STRING
void IDP_ui_data_free_unique_contents(IDPropertyUIData *ui_data, eIDPropertyUIDataType type, const IDPropertyUIData *other)
IDPropertyUIData * IDP_ui_data_ensure(IDProperty *prop)
#define BLI_assert_unreachable()
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
char * BLI_strdup_null(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_MALLOC
ID and Library types, which are fundamental for SDNA.
Read Guarded memory(de)allocation.
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void IDPropertyUIData_Init_Types()
static bool idprop_ui_data_update_bool(IDProperty *idprop, PyObject *args, PyObject *kwargs)
static PyObject * BPy_IDPropertyUIManager_update(BPy_IDPropertyUIManager *self, PyObject *args, PyObject *kwargs)
static bool idprop_ui_data_update_float(IDProperty *idprop, PyObject *args, PyObject *kwargs)
static bool idprop_ui_data_update_int(IDProperty *idprop, PyObject *args, PyObject *kwargs)
static PyObject * BPy_IDPropertyUIManager_clear(BPy_IDPropertyUIManager *self)
static bool py_long_as_int(PyObject *py_long, int *r_int)
static PyObject * BPy_IDPropertyUIManager_update_from(BPy_IDPropertyUIManager *self, PyObject *args)
static bool idprop_ui_data_update_id(IDProperty *idprop, PyObject *args, PyObject *kwargs)
static void idprop_ui_data_to_dict_string(IDProperty *property, PyObject *dict)
static PyObject * BPy_IDIDPropertyUIManager_as_dict(BPy_IDPropertyUIManager *self)
static PyMethodDef BPy_IDPropertyUIManager_methods[]
static bool idprop_ui_data_update_bool_default(IDProperty *idprop, IDPropertyUIDataBool *ui_data, PyObject *default_value)
static IDPropertyUIDataEnumItem * idprop_enum_items_from_py(PyObject *seq_fast, int &r_items_num)
static bool idprop_ui_data_update_base(IDPropertyUIData *ui_data, const char *rna_subtype, const char *description)
static void idprop_ui_data_to_dict_float(IDProperty *property, PyObject *dict)
static bool args_contain_key(PyObject *kwargs, const char *name)
static PyObject * BPy_IDPropertyUIManager_repr(BPy_IDPropertyUIManager *self)
static bool idprop_ui_data_update_float_default(IDProperty *idprop, IDPropertyUIDataFloat *ui_data, PyObject *default_value)
static void idprop_ui_data_to_dict_int(IDProperty *property, PyObject *dict)
static Py_hash_t BPy_IDPropertyUIManager_hash(BPy_IDPropertyUIManager *self)
static bool idprop_ui_data_update_string(IDProperty *idprop, PyObject *args, PyObject *kwargs)
static bool try_parse_enum_item(PyObject *py_item, const int index, IDPropertyUIDataEnumItem &item)
static void idprop_ui_data_to_dict_id(IDProperty *property, PyObject *dict)
PyDoc_STRVAR(BPy_IDPropertyUIManager_update_doc, ".. method:: update( " "subtype=None, " "min=None, " "max=None, " "soft_min=None, " "soft_max=None, " "precision=None, " "step=None, " "default=None, " "id_type=None, " "items=None, " "description=None)\n" "\n" " Update the RNA information of the IDProperty used for interaction and\n" " display in the user interface. The required types for many of the keyword\n" " arguments depend on the type of the property.\n ")
PyTypeObject BPy_IDPropertyUIManager_Type
static bool idprop_ui_data_update_int_default(IDProperty *idprop, IDPropertyUIDataInt *ui_data, PyObject *default_value)
static void idprop_ui_data_to_dict_bool(IDProperty *property, PyObject *dict)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
int pyrna_enum_value_from_id(const EnumPropertyItem *item, const char *identifier, int *r_value, const char *error_prefix)
int PyC_Long_AsBool(PyObject *value)
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)
const EnumPropertyItem rna_enum_id_type_items[]
bool RNA_enum_value_from_identifier(const EnumPropertyItem *item, const char *identifier, int *r_value)
bool RNA_enum_identifier(const EnumPropertyItem *item, const int value, const char **r_identifier)
const EnumPropertyItem rna_enum_property_subtype_items[]
const EnumPropertyItem rna_enum_icon_items[]
PyObject_VAR_HEAD IDProperty * property
IDPropertyUIDataEnumItem * enum_items
IDPropertyUIData * ui_data