4 * ***** BEGIN GPL LICENSE BLOCK *****
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 * Contributor(s): Blender Foundation (2008).
22 * ***** END GPL LICENSE BLOCK *****
28 #include "MEM_guardedalloc.h"
31 #include "DNA_windowmanager_types.h"
33 #include "BLI_blenlib.h"
34 #include "BLI_dynstr.h"
36 #include "BKE_idprop.h"
37 #include "BKE_utildefines.h"
41 #include "RNA_access.h"
42 #include "RNA_define.h"
43 #include "RNA_types.h"
45 #include "rna_internal.h"
51 RNA_free(&BLENDER_RNA);
56 void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr)
59 r_ptr->type= &RNA_Main;
63 void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
66 StructRNA *idtype= NULL;
69 memset(&tmp, 0, sizeof(tmp));
71 idtype= rna_ID_refine(&tmp);
79 void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
82 StructRNA *idtype= NULL;
85 memset(&tmp, 0, sizeof(tmp));
87 idtype= rna_ID_refine(&tmp);
95 static void rna_pointer_inherit_id(StructRNA *type, PointerRNA *parent, PointerRNA *ptr)
97 if(type && type->flag & STRUCT_ID) {
98 ptr->id.data= ptr->data;
101 ptr->id.data= parent->id.data;
105 void RNA_blender_rna_pointer_create(PointerRNA *r_ptr)
107 r_ptr->id.data= NULL;
108 r_ptr->type= &RNA_BlenderRNA;
109 r_ptr->data= &BLENDER_RNA;
112 PointerRNA rna_pointer_inherit_refine(PointerRNA *ptr, StructRNA *type, void *data)
119 rna_pointer_inherit_id(type, ptr, &result);
122 result.type= type->refine(&result);
125 memset(&result, 0, sizeof(result));
132 IDProperty *rna_idproperties_get(PointerRNA *ptr, int create)
134 if(ptr->type->flag & STRUCT_ID)
135 return IDP_GetProperties(ptr->data, create);
136 else if(ptr->type == &RNA_IDPropertyGroup || ptr->type->base == &RNA_IDPropertyGroup)
138 else if(ptr->type->base == &RNA_OperatorProperties) {
139 if(create && !ptr->data) {
140 IDPropertyTemplate val;
141 val.i = 0; /* silence MSVC warning about uninitialized var when debugging */
142 ptr->data= IDP_New(IDP_GROUP, val, "RNA_OperatorProperties group");
151 static IDProperty *rna_idproperty_find(PointerRNA *ptr, const char *name)
153 IDProperty *group= rna_idproperties_get(ptr, 0);
157 for(idprop=group->data.group.first; idprop; idprop=idprop->next)
158 if(strcmp(idprop->name, name) == 0)
165 static int rna_idproperty_verify_valid(PropertyRNA *prop, IDProperty *idprop)
167 /* this verifies if the idproperty actually matches the property
168 * description and otherwise removes it. this is to ensure that
169 * rna property access is type safe, e.g. if you defined the rna
170 * to have a certain array length you can count on that staying so */
172 switch(idprop->type) {
174 if(prop->type != PROP_COLLECTION)
178 if(prop->arraylength != idprop->len)
181 if(idprop->subtype == IDP_FLOAT && prop->type != PROP_FLOAT)
183 if(idprop->subtype == IDP_INT && !ELEM3(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM))
188 if(!ELEM3(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM))
193 if(prop->type != PROP_FLOAT)
197 if(prop->type != PROP_STRING)
201 if(prop->type != PROP_POINTER)
211 IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr)
213 /* This is quite a hack, but avoids some complexity in the API. we
214 * pass IDProperty structs as PropertyRNA pointers to the outside.
215 * We store some bytes in PropertyRNA structs that allows us to
216 * distinguish it from IDProperty structs. If it is an ID property,
217 * we look up an IDP PropertyRNA based on the type, and set the data
218 * pointer to the IDProperty. */
220 if((*prop)->magic == RNA_MAGIC) {
221 if((*prop)->flag & PROP_IDPROPERTY) {
222 IDProperty *idprop= rna_idproperty_find(ptr, (*prop)->identifier);
224 if(idprop && !rna_idproperty_verify_valid(*prop, idprop)) {
225 IDProperty *group= rna_idproperties_get(ptr, 0);
227 IDP_RemFromGroup(group, idprop);
228 IDP_FreeProperty(idprop);
240 static PropertyRNA *typemap[IDP_NUMTYPES] =
241 {(PropertyRNA*)&rna_IDProperty_string,
242 (PropertyRNA*)&rna_IDProperty_int,
243 (PropertyRNA*)&rna_IDProperty_float,
245 (PropertyRNA*)&rna_IDProperty_group, NULL,
246 (PropertyRNA*)&rna_IDProperty_double};
248 static PropertyRNA *arraytypemap[IDP_NUMTYPES] =
249 {NULL, (PropertyRNA*)&rna_IDProperty_int_array,
250 (PropertyRNA*)&rna_IDProperty_float_array,
252 (PropertyRNA*)&rna_IDProperty_collection, NULL,
253 (PropertyRNA*)&rna_IDProperty_double_array};
255 IDProperty *idprop= (IDProperty*)(*prop);
257 if(idprop->type == IDP_ARRAY)
258 *prop= arraytypemap[(int)(idprop->subtype)];
260 *prop= typemap[(int)(idprop->type)];
268 const char *RNA_struct_identifier(PointerRNA *ptr)
270 return ptr->type->identifier;
273 const char *RNA_struct_ui_name(PointerRNA *ptr)
275 return ptr->type->name;
278 const char *RNA_struct_ui_description(PointerRNA *ptr)
280 return ptr->type->description;
283 PropertyRNA *RNA_struct_name_property(PointerRNA *ptr)
285 return ptr->type->nameproperty;
288 PropertyRNA *RNA_struct_iterator_property(PointerRNA *ptr)
290 return ptr->type->iteratorproperty;
293 int RNA_struct_is_ID(PointerRNA *ptr)
295 return (ptr->type->flag & STRUCT_ID) != 0;
298 int RNA_struct_is_a(PointerRNA *ptr, StructRNA *srna)
302 /* ptr->type is always maximally refined */
303 for(type=ptr->type; type; type=type->base)
310 PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
312 CollectionPropertyIterator iter;
313 PropertyRNA *iterprop, *prop;
316 iterprop= RNA_struct_iterator_property(ptr);
317 RNA_property_collection_begin(ptr, iterprop, &iter);
320 for(; iter.valid; RNA_property_collection_next(&iter), i++) {
321 if(strcmp(identifier, RNA_property_identifier(&iter.ptr, iter.ptr.data)) == 0) {
327 RNA_property_collection_end(&iter);
332 const struct ListBase *RNA_struct_defined_properties(StructRNA *srna)
334 return &srna->properties;
337 /* Property Information */
339 const char *RNA_property_identifier(PointerRNA *ptr, PropertyRNA *prop)
343 if((idprop=rna_idproperty_check(&prop, ptr)))
346 return prop->identifier;
349 PropertyType RNA_property_type(PointerRNA *ptr, PropertyRNA *prop)
351 rna_idproperty_check(&prop, ptr);
356 PropertySubType RNA_property_subtype(PointerRNA *ptr, PropertyRNA *prop)
358 rna_idproperty_check(&prop, ptr);
360 return prop->subtype;
363 int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
367 if((idprop=rna_idproperty_check(&prop, ptr)) && idprop->type==IDP_ARRAY)
370 return prop->arraylength;
373 void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
375 IntPropertyRNA *iprop;
377 rna_idproperty_check(&prop, ptr);
378 iprop= (IntPropertyRNA*)prop;
381 iprop->range(ptr, hardmin, hardmax);
384 *hardmin= iprop->hardmin;
385 *hardmax= iprop->hardmax;
389 void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin, int *softmax, int *step)
391 IntPropertyRNA *iprop;
392 int hardmin, hardmax;
394 rna_idproperty_check(&prop, ptr);
395 iprop= (IntPropertyRNA*)prop;
398 iprop->range(ptr, &hardmin, &hardmax);
399 *softmin= MAX2(iprop->softmin, hardmin);
400 *softmax= MIN2(iprop->softmax, hardmax);
403 *softmin= iprop->softmin;
404 *softmax= iprop->softmax;
410 void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax)
412 FloatPropertyRNA *fprop;
414 rna_idproperty_check(&prop, ptr);
415 fprop= (FloatPropertyRNA*)prop;
418 fprop->range(ptr, hardmin, hardmax);
421 *hardmin= fprop->hardmin;
422 *hardmax= fprop->hardmax;
426 void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *softmin, float *softmax, float *step, float *precision)
428 FloatPropertyRNA *fprop;
429 float hardmin, hardmax;
431 rna_idproperty_check(&prop, ptr);
432 fprop= (FloatPropertyRNA*)prop;
435 fprop->range(ptr, &hardmin, &hardmax);
436 *softmin= MAX2(fprop->softmin, hardmin);
437 *softmax= MIN2(fprop->softmax, hardmax);
440 *softmin= fprop->softmin;
441 *softmax= fprop->softmax;
445 *precision= (float)fprop->precision;
448 int RNA_property_string_maxlength(PointerRNA *ptr, PropertyRNA *prop)
450 StringPropertyRNA *sprop;
452 rna_idproperty_check(&prop, ptr);
453 sprop= (StringPropertyRNA*)prop;
455 return sprop->maxlength;
458 StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
460 PointerPropertyRNA *pprop;
462 rna_idproperty_check(&prop, ptr);
463 pprop= (PointerPropertyRNA*)prop;
468 return &RNA_UnknownType;
471 void RNA_property_enum_items(PointerRNA *ptr, PropertyRNA *prop, const EnumPropertyItem **item, int *totitem)
473 EnumPropertyRNA *eprop;
475 rna_idproperty_check(&prop, ptr);
476 eprop= (EnumPropertyRNA*)prop;
479 *totitem= eprop->totitem;
482 int RNA_property_enum_value(PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value)
484 const EnumPropertyItem *item;
487 RNA_property_enum_items(ptr, prop, &item, &totitem);
489 for (i=0; i<totitem; i++) {
490 if (strcmp(item[i].identifier, identifier)==0) {
491 *value = item[i].value;
499 int RNA_property_enum_identifier(PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier)
501 const EnumPropertyItem *item;
504 RNA_property_enum_items(ptr, prop, &item, &totitem);
506 for (i=0; i<totitem; i++) {
507 if (item[i].value==value) {
508 *identifier = item[i].identifier;
516 const char *RNA_property_ui_name(PointerRNA *ptr, PropertyRNA *prop)
518 PropertyRNA *oldprop= prop;
521 if((idprop=rna_idproperty_check(&prop, ptr)) && oldprop!=prop)
527 const char *RNA_property_ui_description(PointerRNA *ptr, PropertyRNA *prop)
529 PropertyRNA *oldprop= prop;
531 if(rna_idproperty_check(&prop, ptr) && oldprop!=prop)
534 return prop->description;
537 int RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop)
541 rna_idproperty_check(&prop, ptr);
544 flag= prop->editable(ptr);
548 return (flag & PROP_EDITABLE);
551 int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop)
555 rna_idproperty_check(&prop, ptr);
557 if(!(prop->flag & PROP_ANIMATEABLE))
561 flag= prop->editable(ptr);
565 return (flag & PROP_EDITABLE);
568 int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
570 /* would need to ask animation system */
575 void RNA_property_update(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop)
577 rna_idproperty_check(&prop, ptr);
580 prop->update(C, ptr);
582 WM_event_add_notifier(C, prop->noteflag, ptr->id.data);
587 int RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
589 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
592 if((idprop=rna_idproperty_check(&prop, ptr)))
593 return IDP_Int(idprop);
595 return bprop->get(ptr);
597 return bprop->defaultvalue;
600 void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
602 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
605 if((idprop=rna_idproperty_check(&prop, ptr)))
606 IDP_Int(idprop)= value;
608 bprop->set(ptr, value);
609 else if(prop->flag & PROP_EDITABLE) {
610 IDPropertyTemplate val;
615 group= rna_idproperties_get(ptr, 1);
617 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
621 void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
623 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
626 if((idprop=rna_idproperty_check(&prop, ptr))) {
627 if(prop->arraylength == 0)
628 values[0]= RNA_property_boolean_get(ptr, prop);
630 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
632 else if(prop->arraylength == 0)
633 values[0]= RNA_property_boolean_get(ptr, prop);
634 else if(bprop->getarray)
635 bprop->getarray(ptr, values);
636 else if(bprop->defaultarray)
637 memcpy(values, bprop->defaultarray, sizeof(int)*prop->arraylength);
639 memset(values, 0, sizeof(int)*prop->arraylength);
642 int RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
644 int tmp[RNA_MAX_ARRAY];
646 RNA_property_boolean_get_array(ptr, prop, tmp);
650 void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
652 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
655 if((idprop=rna_idproperty_check(&prop, ptr))) {
656 if(prop->arraylength == 0)
657 IDP_Int(idprop)= values[0];
659 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
661 else if(prop->arraylength == 0)
662 RNA_property_boolean_set(ptr, prop, values[0]);
663 else if(bprop->setarray)
664 bprop->setarray(ptr, values);
665 else if(prop->flag & PROP_EDITABLE) {
666 IDPropertyTemplate val;
669 val.array.len= prop->arraylength;
670 val.array.type= IDP_INT;
672 group= rna_idproperties_get(ptr, 1);
674 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
675 IDP_AddToGroup(group, idprop);
676 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
681 void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
683 int tmp[RNA_MAX_ARRAY];
685 RNA_property_boolean_get_array(ptr, prop, tmp);
687 RNA_property_boolean_set_array(ptr, prop, tmp);
690 int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
692 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
695 if((idprop=rna_idproperty_check(&prop, ptr)))
696 return IDP_Int(idprop);
698 return iprop->get(ptr);
700 return iprop->defaultvalue;
703 void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
705 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
708 if((idprop=rna_idproperty_check(&prop, ptr)))
709 IDP_Int(idprop)= value;
711 iprop->set(ptr, value);
712 else if(prop->flag & PROP_EDITABLE) {
713 IDPropertyTemplate val;
718 group= rna_idproperties_get(ptr, 1);
720 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
724 void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
726 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
729 if((idprop=rna_idproperty_check(&prop, ptr))) {
730 if(prop->arraylength == 0)
731 values[0]= RNA_property_int_get(ptr, prop);
733 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
735 else if(prop->arraylength == 0)
736 values[0]= RNA_property_int_get(ptr, prop);
737 else if(iprop->getarray)
738 iprop->getarray(ptr, values);
739 else if(iprop->defaultarray)
740 memcpy(values, iprop->defaultarray, sizeof(int)*prop->arraylength);
742 memset(values, 0, sizeof(int)*prop->arraylength);
745 int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
747 int tmp[RNA_MAX_ARRAY];
749 RNA_property_int_get_array(ptr, prop, tmp);
753 void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
755 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
758 if((idprop=rna_idproperty_check(&prop, ptr))) {
759 if(prop->arraylength == 0)
760 IDP_Int(idprop)= values[0];
762 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);\
764 else if(prop->arraylength == 0)
765 RNA_property_int_set(ptr, prop, values[0]);
766 else if(iprop->setarray)
767 iprop->setarray(ptr, values);
768 else if(prop->flag & PROP_EDITABLE) {
769 IDPropertyTemplate val;
772 val.array.len= prop->arraylength;
773 val.array.type= IDP_INT;
775 group= rna_idproperties_get(ptr, 1);
777 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
778 IDP_AddToGroup(group, idprop);
779 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
784 void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
786 int tmp[RNA_MAX_ARRAY];
788 RNA_property_int_get_array(ptr, prop, tmp);
790 RNA_property_int_set_array(ptr, prop, tmp);
793 float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
795 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
798 if((idprop=rna_idproperty_check(&prop, ptr))) {
799 if(idprop->type == IDP_FLOAT)
800 return IDP_Float(idprop);
802 return (float)IDP_Double(idprop);
805 return fprop->get(ptr);
807 return fprop->defaultvalue;
810 void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
812 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
815 if((idprop=rna_idproperty_check(&prop, ptr))) {
816 if(idprop->type == IDP_FLOAT)
817 IDP_Float(idprop)= value;
819 IDP_Double(idprop)= value;
821 else if(fprop->set) {
822 fprop->set(ptr, value);
824 else if(prop->flag & PROP_EDITABLE) {
825 IDPropertyTemplate val;
830 group= rna_idproperties_get(ptr, 1);
832 IDP_AddToGroup(group, IDP_New(IDP_FLOAT, val, (char*)prop->identifier));
836 void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
838 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
842 if((idprop=rna_idproperty_check(&prop, ptr))) {
843 if(prop->arraylength == 0)
844 values[0]= RNA_property_float_get(ptr, prop);
845 else if(idprop->subtype == IDP_FLOAT) {
846 memcpy(values, IDP_Array(idprop), sizeof(float)*idprop->len);
849 for(i=0; i<idprop->len; i++)
850 values[i]= (float)(((double*)IDP_Array(idprop))[i]);
853 else if(prop->arraylength == 0)
854 values[0]= RNA_property_float_get(ptr, prop);
855 else if(fprop->getarray)
856 fprop->getarray(ptr, values);
857 else if(fprop->defaultarray)
858 memcpy(values, fprop->defaultarray, sizeof(float)*prop->arraylength);
860 memset(values, 0, sizeof(float)*prop->arraylength);
863 float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
865 float tmp[RNA_MAX_ARRAY];
867 RNA_property_float_get_array(ptr, prop, tmp);
871 void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
873 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
877 if((idprop=rna_idproperty_check(&prop, ptr))) {
878 if(prop->arraylength == 0)
879 IDP_Double(idprop)= values[0];
880 else if(idprop->subtype == IDP_FLOAT) {
881 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
884 for(i=0; i<idprop->len; i++)
885 ((double*)IDP_Array(idprop))[i]= values[i];
888 else if(prop->arraylength == 0)
889 RNA_property_float_set(ptr, prop, values[0]);
890 else if(fprop->setarray) {
891 fprop->setarray(ptr, values);
893 else if(prop->flag & PROP_EDITABLE) {
894 IDPropertyTemplate val;
897 val.array.len= prop->arraylength;
898 val.array.type= IDP_FLOAT;
900 group= rna_idproperties_get(ptr, 1);
902 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
903 IDP_AddToGroup(group, idprop);
904 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
909 void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
911 float tmp[RNA_MAX_ARRAY];
913 RNA_property_float_get_array(ptr, prop, tmp);
915 RNA_property_float_set_array(ptr, prop, tmp);
918 void RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop, char *value)
920 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
923 if((idprop=rna_idproperty_check(&prop, ptr)))
924 strcpy(value, IDP_String(idprop));
926 sprop->get(ptr, value);
928 strcpy(value, sprop->defaultvalue);
931 char *RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen)
936 length= RNA_property_string_length(ptr, prop);
938 if(length+1 < fixedlen)
941 buf= MEM_callocN(sizeof(char)*(length+1), "RNA_string_get_alloc");
943 RNA_property_string_get(ptr, prop, buf);
948 int RNA_property_string_length(PointerRNA *ptr, PropertyRNA *prop)
950 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
953 if((idprop=rna_idproperty_check(&prop, ptr)))
954 return strlen(IDP_String(idprop));
955 else if(sprop->length)
956 return sprop->length(ptr);
958 return strlen(sprop->defaultvalue);
961 void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value)
963 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
966 if((idprop=rna_idproperty_check(&prop, ptr)))
967 IDP_AssignString(idprop, (char*)value);
969 sprop->set(ptr, value);
970 else if(prop->flag & PROP_EDITABLE) {
971 IDPropertyTemplate val;
974 val.str= (char*)value;
976 group= rna_idproperties_get(ptr, 1);
978 IDP_AddToGroup(group, IDP_New(IDP_STRING, val, (char*)prop->identifier));
982 int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
984 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
987 if((idprop=rna_idproperty_check(&prop, ptr)))
988 return IDP_Int(idprop);
990 return eprop->get(ptr);
992 return eprop->defaultvalue;
996 void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
998 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
1001 if((idprop=rna_idproperty_check(&prop, ptr)))
1002 IDP_Int(idprop)= value;
1003 else if(eprop->set) {
1004 eprop->set(ptr, value);
1006 else if(prop->flag & PROP_EDITABLE) {
1007 IDPropertyTemplate val;
1012 group= rna_idproperties_get(ptr, 1);
1014 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
1018 PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
1020 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1023 if((idprop=rna_idproperty_check(&prop, ptr))) {
1024 pprop= (PointerPropertyRNA*)prop;
1026 /* for groups, data is idprop itself */
1027 return rna_pointer_inherit_refine(ptr, pprop->type, idprop);
1029 else if(pprop->get) {
1030 return pprop->get(ptr);
1034 memset(&result, 0, sizeof(result));
1039 void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value)
1041 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1044 pprop->set(ptr, ptr_value);
1047 void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
1051 if((idprop=rna_idproperty_check(&prop, ptr))) {
1052 /* already exists */
1054 else if(prop->flag & PROP_IDPROPERTY) {
1055 IDPropertyTemplate val;
1060 group= rna_idproperties_get(ptr, 1);
1062 IDP_AddToGroup(group, IDP_New(IDP_GROUP, val, (char*)prop->identifier));
1065 printf("RNA_property_pointer_add %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1068 static void rna_property_collection_get_idp(CollectionPropertyIterator *iter)
1070 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1072 iter->ptr.data= rna_iterator_array_get(iter);
1073 iter->ptr.type= cprop->type;
1074 rna_pointer_inherit_id(cprop->type, &iter->parent, &iter->ptr);
1077 void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter)
1081 memset(iter, 0, sizeof(*iter));
1083 if((idprop=rna_idproperty_check(&prop, ptr)) || (prop->flag & PROP_IDPROPERTY)) {
1088 rna_iterator_array_begin(iter, IDP_IDPArray(idprop), sizeof(IDProperty), idprop->len, NULL);
1090 rna_iterator_array_begin(iter, NULL, sizeof(IDProperty), 0, NULL);
1093 rna_property_collection_get_idp(iter);
1098 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1099 cprop->begin(iter, ptr);
1103 void RNA_property_collection_next(CollectionPropertyIterator *iter)
1105 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1108 rna_iterator_array_next(iter);
1111 rna_property_collection_get_idp(iter);
1117 void RNA_property_collection_end(CollectionPropertyIterator *iter)
1119 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1122 rna_iterator_array_end(iter);
1127 int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
1129 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1132 if((idprop=rna_idproperty_check(&prop, ptr))) {
1135 else if(cprop->length) {
1136 return cprop->length(ptr);
1139 CollectionPropertyIterator iter;
1142 RNA_property_collection_begin(ptr, prop, &iter);
1143 for(; iter.valid; RNA_property_collection_next(&iter))
1145 RNA_property_collection_end(&iter);
1151 void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr)
1155 if((idprop=rna_idproperty_check(&prop, ptr))) {
1156 IDPropertyTemplate val;
1160 item= IDP_New(IDP_GROUP, val, "");
1161 IDP_AppendArray(idprop, item);
1162 IDP_FreeProperty(item);
1165 else if(prop->flag & PROP_IDPROPERTY) {
1166 IDProperty *group, *item;
1167 IDPropertyTemplate val;
1170 group= rna_idproperties_get(ptr, 1);
1172 idprop= IDP_NewIDPArray(prop->identifier);
1173 IDP_AddToGroup(group, idprop);
1175 item= IDP_New(IDP_GROUP, val, "");
1176 IDP_AppendArray(idprop, item);
1177 IDP_FreeProperty(item);
1182 printf("RNA_property_collection_add %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1186 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1188 r_ptr->data= IDP_GetIndexArray(idprop, idprop->len-1);
1189 r_ptr->type= cprop->type;
1190 rna_pointer_inherit_id(NULL, ptr, r_ptr);
1193 memset(r_ptr, 0, sizeof(*r_ptr));
1197 void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop)
1201 if((idprop=rna_idproperty_check(&prop, ptr)))
1202 IDP_ResizeIDPArray(idprop, 0);
1205 int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
1207 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1209 if(cprop->lookupint) {
1210 /* we have a callback defined, use it */
1211 *r_ptr= cprop->lookupint(ptr, key);
1212 return (r_ptr->data != NULL);
1215 /* no callback defined, just iterate and find the nth item */
1216 CollectionPropertyIterator iter;
1219 RNA_property_collection_begin(ptr, prop, &iter);
1220 for(i=0; iter.valid; RNA_property_collection_next(&iter), i++) {
1226 RNA_property_collection_end(&iter);
1229 memset(r_ptr, 0, sizeof(*r_ptr));
1235 int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr)
1237 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1239 if(cprop->lookupstring) {
1240 /* we have a callback defined, use it */
1241 *r_ptr= cprop->lookupstring(ptr, key);
1242 return (r_ptr->data != NULL);
1245 /* no callback defined, compare with name properties if they exist */
1246 CollectionPropertyIterator iter;
1247 PropertyRNA *nameprop;
1248 char name[256], *nameptr;
1251 RNA_property_collection_begin(ptr, prop, &iter);
1252 for(; iter.valid; RNA_property_collection_next(&iter)) {
1253 if(iter.ptr.data && iter.ptr.type->nameproperty) {
1254 nameprop= iter.ptr.type->nameproperty;
1256 nameptr= RNA_property_string_get_alloc(&iter.ptr, nameprop, name, sizeof(name));
1258 if(strcmp(nameptr, key) == 0) {
1263 if ((char *)&name != nameptr)
1270 RNA_property_collection_end(&iter);
1273 memset(r_ptr, 0, sizeof(*r_ptr));
1279 /* Standard iterator functions */
1281 void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb, IteratorSkipFunc skip)
1283 ListBaseIterator *internal;
1285 internal= MEM_callocN(sizeof(ListBaseIterator), "ListBaseIterator");
1286 internal->link= lb->first;
1287 internal->skip= skip;
1289 iter->internal= internal;
1290 iter->valid= (internal->link != NULL);
1292 if(skip && iter->valid && skip(iter, internal->link))
1293 rna_iterator_listbase_next(iter);
1296 void rna_iterator_listbase_next(CollectionPropertyIterator *iter)
1298 ListBaseIterator *internal= iter->internal;
1300 if(internal->skip) {
1302 internal->link= internal->link->next;
1303 iter->valid= (internal->link != NULL);
1304 } while(iter->valid && internal->skip(iter, internal->link));
1307 internal->link= internal->link->next;
1308 iter->valid= (internal->link != NULL);
1312 void *rna_iterator_listbase_get(CollectionPropertyIterator *iter)
1314 ListBaseIterator *internal= iter->internal;
1316 return internal->link;
1319 void rna_iterator_listbase_end(CollectionPropertyIterator *iter)
1321 MEM_freeN(iter->internal);
1324 void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, IteratorSkipFunc skip)
1326 ArrayIterator *internal;
1331 internal= MEM_callocN(sizeof(ArrayIterator), "ArrayIterator");
1333 internal->endptr= ((char*)ptr)+length*itemsize;
1334 internal->itemsize= itemsize;
1335 internal->skip= skip;
1337 iter->internal= internal;
1338 iter->valid= (internal->ptr != internal->endptr);
1340 if(skip && iter->valid && skip(iter, internal->ptr))
1341 rna_iterator_array_next(iter);
1344 void rna_iterator_array_next(CollectionPropertyIterator *iter)
1346 ArrayIterator *internal= iter->internal;
1348 if(internal->skip) {
1350 internal->ptr += internal->itemsize;
1351 iter->valid= (internal->ptr != internal->endptr);
1352 } while(iter->valid && internal->skip(iter, internal->ptr));
1355 internal->ptr += internal->itemsize;
1356 iter->valid= (internal->ptr != internal->endptr);
1360 void *rna_iterator_array_get(CollectionPropertyIterator *iter)
1362 ArrayIterator *internal= iter->internal;
1364 return internal->ptr;
1367 void *rna_iterator_array_dereference_get(CollectionPropertyIterator *iter)
1369 ArrayIterator *internal= iter->internal;
1372 return *(void**)(internal->ptr);
1375 void rna_iterator_array_end(CollectionPropertyIterator *iter)
1377 MEM_freeN(iter->internal);
1380 /* RNA Path - Experiment */
1382 static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int bracket)
1386 int i, j, len, escape;
1391 /* get data between [], check escaping ] with \] */
1392 if(**path == '[') (*path)++;
1398 while(*p && (*p != ']' || escape)) {
1399 escape= (*p == '\\');
1404 if(*p != ']') return NULL;
1407 /* get data until . or [ */
1410 while(*p && *p != '.' && *p != '[') {
1420 /* try to use fixed buffer if possible */
1421 if(len+1 < fixedlen)
1424 buf= MEM_callocN(sizeof(char)*(len+1), "rna_path_token");
1426 /* copy string, taking into account escaped ] */
1427 for(p=*path, i=0, j=0; i<len; i++, p++) {
1428 if(*p == '\\' && *(p+1) == ']');
1434 /* set path to start of next token */
1442 int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
1444 CollectionPropertyIterator iter;
1445 PropertyRNA *prop, *iterprop;
1446 PointerRNA curptr, nextptr;
1447 char fixedbuf[256], *token;
1454 /* look up property name in current struct */
1455 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 0);
1460 iterprop= RNA_struct_iterator_property(&curptr);
1461 RNA_property_collection_begin(&curptr, iterprop, &iter);
1464 for(; iter.valid; RNA_property_collection_next(&iter)) {
1465 if(strcmp(token, RNA_property_identifier(&iter.ptr, iter.ptr.data)) == 0) {
1466 prop= iter.ptr.data;
1471 RNA_property_collection_end(&iter);
1473 if(token != fixedbuf)
1479 /* now look up the value of this property if it is a pointer or
1480 * collection, otherwise return the property rna so that the
1481 * caller can read the value of the property itself */
1482 if(RNA_property_type(&curptr, prop) == PROP_POINTER) {
1483 nextptr= RNA_property_pointer_get(&curptr, prop);
1490 else if(RNA_property_type(&curptr, prop) == PROP_COLLECTION && *path) {
1491 /* resolve the lookup with [] brackets */
1492 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
1499 /* check for "" to see if it is a string */
1500 if(len >= 2 && token[0] == '"' && token[len-1] == '"') {
1503 RNA_property_collection_lookup_string(&curptr, prop, token+1, &nextptr);
1506 /* otherwise do int lookup */
1507 intkey= atoi(token);
1508 RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
1511 if(token != fixedbuf)
1527 char *RNA_path_append(const char *path, PointerRNA *ptr, PropertyRNA *prop, int intkey, const char *strkey)
1531 char appendstr[128], *result;
1533 dynstr= BLI_dynstr_new();
1535 /* add .identifier */
1537 BLI_dynstr_append(dynstr, (char*)path);
1539 BLI_dynstr_append(dynstr, ".");
1542 BLI_dynstr_append(dynstr, (char*)RNA_property_identifier(ptr, prop));
1544 if(RNA_property_type(ptr, prop) == PROP_COLLECTION) {
1545 /* add ["strkey"] or [intkey] */
1546 BLI_dynstr_append(dynstr, "[");
1549 BLI_dynstr_append(dynstr, "\"");
1550 for(s=strkey; *s; s++) {
1560 BLI_dynstr_append(dynstr, appendstr);
1562 BLI_dynstr_append(dynstr, "\"");
1565 sprintf(appendstr, "%d", intkey);
1566 BLI_dynstr_append(dynstr, appendstr);
1569 BLI_dynstr_append(dynstr, "]");
1572 result= BLI_dynstr_get_cstring(dynstr);
1573 BLI_dynstr_free(dynstr);
1578 char *RNA_path_back(const char *path)
1581 const char *previous, *current;
1582 char *result, *token;
1591 /* parse token by token until the end, then we back up to the previous
1592 * position and strip of the next token to get the path one step back */
1594 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 0);
1598 if(token != fixedbuf)
1601 /* in case of collection we also need to strip off [] */
1602 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 1);
1603 if(token && token != fixedbuf)
1615 /* copy and strip off last token */
1617 result= BLI_strdup(path);
1619 if(i > 0 && result[i-1] == '.') i--;
1625 /* Quick name based property access */
1627 int RNA_boolean_get(PointerRNA *ptr, const char *name)
1629 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1632 return RNA_property_boolean_get(ptr, prop);
1635 printf("RNA_boolean_get: %s.%s not found.\n", ptr->type->identifier, name);
1640 void RNA_boolean_set(PointerRNA *ptr, const char *name, int value)
1642 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1645 RNA_property_boolean_set(ptr, prop, value);
1647 printf("RNA_boolean_set: %s.%s not found.\n", ptr->type->identifier, name);
1650 void RNA_boolean_get_array(PointerRNA *ptr, const char *name, int *values)
1652 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1655 RNA_property_boolean_get_array(ptr, prop, values);
1657 printf("RNA_boolean_get_array: %s.%s not found.\n", ptr->type->identifier, name);
1660 void RNA_boolean_set_array(PointerRNA *ptr, const char *name, const int *values)
1662 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1665 RNA_property_boolean_set_array(ptr, prop, values);
1667 printf("RNA_boolean_set_array: %s.%s not found.\n", ptr->type->identifier, name);
1670 int RNA_int_get(PointerRNA *ptr, const char *name)
1672 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1675 return RNA_property_int_get(ptr, prop);
1678 printf("RNA_int_get: %s.%s not found.\n", ptr->type->identifier, name);
1683 void RNA_int_set(PointerRNA *ptr, const char *name, int value)
1685 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1688 RNA_property_int_set(ptr, prop, value);
1690 printf("RNA_int_set: %s.%s not found.\n", ptr->type->identifier, name);
1693 void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
1695 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1698 RNA_property_int_get_array(ptr, prop, values);
1700 printf("RNA_int_get_array: %s.%s not found.\n", ptr->type->identifier, name);
1703 void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
1705 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1708 RNA_property_int_set_array(ptr, prop, values);
1710 printf("RNA_int_set_array: %s.%s not found.\n", ptr->type->identifier, name);
1713 float RNA_float_get(PointerRNA *ptr, const char *name)
1715 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1718 return RNA_property_float_get(ptr, prop);
1721 printf("RNA_float_get: %s.%s not found.\n", ptr->type->identifier, name);
1726 void RNA_float_set(PointerRNA *ptr, const char *name, float value)
1728 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1731 RNA_property_float_set(ptr, prop, value);
1733 printf("RNA_float_set: %s.%s not found.\n", ptr->type->identifier, name);
1736 void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
1738 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1741 RNA_property_float_get_array(ptr, prop, values);
1743 printf("RNA_float_get_array: %s.%s not found.\n", ptr->type->identifier, name);
1746 void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
1748 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1751 RNA_property_float_set_array(ptr, prop, values);
1753 printf("RNA_float_set_array: %s.%s not found.\n", ptr->type->identifier, name);
1756 int RNA_enum_get(PointerRNA *ptr, const char *name)
1758 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1761 return RNA_property_enum_get(ptr, prop);
1764 printf("RNA_enum_get: %s.%s not found.\n", ptr->type->identifier, name);
1769 void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
1771 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1774 RNA_property_enum_set(ptr, prop, value);
1776 printf("RNA_enum_set: %s.%s not found.\n", ptr->type->identifier, name);
1779 int RNA_enum_is_equal(PointerRNA *ptr, const char *name, const char *enumname)
1781 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1782 const EnumPropertyItem *item;
1786 RNA_property_enum_items(ptr, prop, &item, &totitem);
1788 for(a=0; a<totitem; a++)
1789 if(strcmp(item[a].identifier, enumname) == 0)
1790 return (item[a].value == RNA_property_enum_get(ptr, prop));
1792 printf("RNA_enum_is_equal: %s.%s item %s not found.\n", ptr->type->identifier, name, enumname);
1796 printf("RNA_enum_is_equal: %s.%s not found.\n", ptr->type->identifier, name);
1801 void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
1803 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1806 RNA_property_string_get(ptr, prop, value);
1808 printf("RNA_string_get: %s.%s not found.\n", ptr->type->identifier, name);
1811 char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen)
1813 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1816 return RNA_property_string_get_alloc(ptr, prop, fixedbuf, fixedlen);
1819 printf("RNA_string_get_alloc: %s.%s not found.\n", ptr->type->identifier, name);
1824 int RNA_string_length(PointerRNA *ptr, const char *name)
1826 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1829 return RNA_property_string_length(ptr, prop);
1832 printf("RNA_string_length: %s.%s not found.\n", ptr->type->identifier, name);
1837 void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
1839 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1842 RNA_property_string_set(ptr, prop, value);
1844 printf("RNA_string_set: %s.%s not found.\n", ptr->type->identifier, name);
1847 PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
1849 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1852 return RNA_property_pointer_get(ptr, prop);
1857 printf("RNA_pointer_get: %s.%s not found.\n", ptr->type->identifier, name);
1859 memset(&result, 0, sizeof(result));
1864 void RNA_pointer_add(PointerRNA *ptr, const char *name)
1866 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1869 RNA_property_pointer_add(ptr, prop);
1871 printf("RNA_pointer_set: %s.%s not found.\n", ptr->type->identifier, name);
1874 void RNA_collection_begin(PointerRNA *ptr, const char *name, CollectionPropertyIterator *iter)
1876 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1879 RNA_property_collection_begin(ptr, prop, iter);
1881 printf("RNA_collection_begin: %s.%s not found.\n", ptr->type->identifier, name);
1884 void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value)
1886 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1889 RNA_property_collection_add(ptr, prop, r_value);
1891 printf("RNA_collection_add: %s.%s not found.\n", ptr->type->identifier, name);
1894 void RNA_collection_clear(PointerRNA *ptr, const char *name)
1896 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1899 RNA_property_collection_clear(ptr, prop);
1901 printf("RNA_collection_clear: %s.%s not found.\n", ptr->type->identifier, name);
1904 int RNA_collection_length(PointerRNA *ptr, const char *name)
1906 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1909 return RNA_property_collection_length(ptr, prop);
1912 printf("RNA_collection_length: %s.%s not found.\n", ptr->type->identifier, name);
1917 int RNA_property_is_set(PointerRNA *ptr, const char *name)
1919 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1922 return (rna_idproperty_find(ptr, name) != NULL);
1925 printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name);
1930 /* string representation of a property, python
1931 * compatible but can be used for display too*/
1932 char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
1934 int type = RNA_property_type(ptr, prop);
1935 int len = RNA_property_array_length(ptr, prop);
1938 DynStr *dynstr= BLI_dynstr_new();
1942 /* see if we can coorce into a python type - PropertyType */
1946 BLI_dynstr_append(dynstr, RNA_property_boolean_get(ptr, prop) ? "True" : "False");
1949 BLI_dynstr_append(dynstr, "(");
1950 for(i=0; i<len; i++) {
1951 BLI_dynstr_appendf(dynstr, i?", %s":"%s", RNA_property_boolean_get_index(ptr, prop, i) ? "True" : "False");
1953 BLI_dynstr_append(dynstr, ")");
1958 BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get(ptr, prop));
1961 BLI_dynstr_append(dynstr, "(");
1962 for(i=0; i<len; i++) {
1963 BLI_dynstr_appendf(dynstr, i?", %d":"%d", RNA_property_int_get_index(ptr, prop, i));
1965 BLI_dynstr_append(dynstr, ")");
1970 BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get(ptr, prop));
1973 BLI_dynstr_append(dynstr, "(");
1974 for(i=0; i<len; i++) {
1975 BLI_dynstr_appendf(dynstr, i?", %g":"%g", RNA_property_float_get_index(ptr, prop, i));
1977 BLI_dynstr_append(dynstr, ")");
1982 /* string arrays dont exist */
1984 buf = RNA_property_string_get_alloc(ptr, prop, NULL, -1);
1985 BLI_dynstr_appendf(dynstr, "\"%s\"", buf);
1991 /* string arrays dont exist */
1992 const char *identifier;
1993 int val = RNA_property_enum_get(ptr, prop);
1995 if (RNA_property_enum_identifier(ptr, prop, val, &identifier)) {
1996 BLI_dynstr_appendf(dynstr, "'%s'", identifier);
1999 BLI_dynstr_appendf(dynstr, "'<UNKNOWN ENUM>'", identifier);
2005 BLI_dynstr_append(dynstr, "'<POINTER>'"); /* TODO */
2008 case PROP_COLLECTION:
2009 BLI_dynstr_append(dynstr, "'<COLLECTION>'"); /* TODO */
2012 BLI_dynstr_append(dynstr, "'<UNKNOWN TYPE>'"); /* TODO */
2016 cstring = BLI_dynstr_get_cstring(dynstr);
2017 BLI_dynstr_free(dynstr);