RNA
[blender.git] / source / blender / makesrna / intern / rna_ID.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
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.
10  *
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.
15  *
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.
19  *
20  * Contributor(s): Blender Foundation (2008).
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #include <stdlib.h>
26 #include <stdio.h>
27
28 #include "RNA_define.h"
29 #include "RNA_types.h"
30
31 #include "DNA_ID.h"
32
33 #ifdef RNA_RUNTIME
34
35 #include "BKE_idprop.h"
36
37 /* name functions that ignore the first two ID characters */
38 static void rna_ID_name_get(PointerRNA *ptr, char *value)
39 {
40         ID *id= (ID*)ptr->data;
41         BLI_strncpy(value, id->name+2, sizeof(id->name)-2);
42 }
43
44 static int rna_ID_name_length(PointerRNA *ptr)
45 {
46         ID *id= (ID*)ptr->data;
47         return strlen(id->name+2);
48 }
49
50 static void rna_ID_name_set(PointerRNA *ptr, const char *value)
51 {
52         ID *id= (ID*)ptr->data;
53         BLI_strncpy(id->name+2, value, sizeof(id->name)-2);
54 }
55
56 /* ID properties */
57
58 static void rna_IDProperty_string_get(PointerRNA *ptr, char *value)
59 {
60         IDProperty *prop= (IDProperty*)ptr->data;
61         strcpy(value, IDP_String(prop));
62 }
63
64 static int rna_IDProperty_string_length(PointerRNA *ptr)
65 {
66         IDProperty *prop= (IDProperty*)ptr->data;
67         return strlen(IDP_String(prop));
68 }
69
70 static void rna_IDProperty_string_set(PointerRNA *ptr, const char *value)
71 {
72         IDProperty *prop= (IDProperty*)ptr->data;
73         IDP_AssignString(prop, (char*)value);
74 }
75
76 static int rna_IDProperty_int_get(PointerRNA *ptr)
77 {
78         IDProperty *prop= (IDProperty*)ptr->data;
79         return IDP_Int(prop);
80 }
81
82 static void rna_IDProperty_int_set(PointerRNA *ptr, int value)
83 {
84         IDProperty *prop= (IDProperty*)ptr->data;
85         IDP_Int(prop)= value;
86 }
87
88 static int rna_IDProperty_intarray_get(PointerRNA *ptr, int index)
89 {
90         IDProperty *prop= (IDProperty*)ptr->data;
91         return ((int*)IDP_Array(prop))[index];
92 }
93
94 static void rna_IDProperty_intarray_set(PointerRNA *ptr, int index, int value)
95 {
96         IDProperty *prop= (IDProperty*)ptr->data;
97         ((int*)IDP_Array(prop))[index]= value;
98 }
99
100 static float rna_IDProperty_float_get(PointerRNA *ptr)
101 {
102         IDProperty *prop= (IDProperty*)ptr->data;
103         return IDP_Float(prop);
104 }
105
106 static void rna_IDProperty_float_set(PointerRNA *ptr, float value)
107 {
108         IDProperty *prop= (IDProperty*)ptr->data;
109         IDP_Float(prop)= value;
110 }
111
112 static float rna_IDProperty_floatarray_get(PointerRNA *ptr, int index)
113 {
114         IDProperty *prop= (IDProperty*)ptr->data;
115         return ((float*)IDP_Array(prop))[index];
116 }
117
118 static void rna_IDProperty_floatarray_set(PointerRNA *ptr, int index, float value)
119 {
120         IDProperty *prop= (IDProperty*)ptr->data;
121         ((float*)IDP_Array(prop))[index]= value;
122 }
123
124 static float rna_IDProperty_double_get(PointerRNA *ptr)
125 {
126         IDProperty *prop= (IDProperty*)ptr->data;
127         return (float)IDP_Double(prop);
128 }
129
130 static void rna_IDProperty_double_set(PointerRNA *ptr, float value)
131 {
132         IDProperty *prop= (IDProperty*)ptr->data;
133         IDP_Double(prop)= value;
134 }
135
136 static float rna_IDProperty_doublearray_get(PointerRNA *ptr, int index)
137 {
138         IDProperty *prop= (IDProperty*)ptr->data;
139         return (float)(((double*)IDP_Array(prop))[index]);
140 }
141
142 static void rna_IDProperty_doublearray_set(PointerRNA *ptr, int index, float value)
143 {
144         IDProperty *prop= (IDProperty*)ptr->data;
145         ((double*)IDP_Array(prop))[index]= value;
146 }
147
148 static void* rna_IDProperty_group_get(PointerRNA *ptr)
149 {
150         IDProperty *prop= (IDProperty*)ptr->data;
151         return prop;
152 }
153
154 #else
155
156 static void RNA_def_ID_property(BlenderRNA *brna)
157 {
158         StructRNA *srna;
159         PropertyRNA *prop;
160
161         /* this is struct is used for holding the virtual
162          * PropertyRNA's for ID properties */
163         srna= RNA_def_struct(brna, "IDProperty", "ID Property");
164
165         /* IDP_STRING */
166         prop= RNA_def_property(srna, "string", PROP_STRING, PROP_NONE);
167         RNA_def_property_flag(prop, PROP_EXPORT);
168         RNA_def_property_string_funcs(prop, "rna_IDProperty_string_get", "rna_IDProperty_string_length", "rna_IDProperty_string_set");
169
170         /* IDP_INT */
171         prop= RNA_def_property(srna, "int", PROP_INT, PROP_NONE);
172         RNA_def_property_flag(prop, PROP_EXPORT);
173         RNA_def_property_int_funcs(prop, "rna_IDProperty_int_get", "rna_IDProperty_int_set");
174
175         prop= RNA_def_property(srna, "intarray", PROP_INT, PROP_NONE);
176         RNA_def_property_flag(prop, PROP_EXPORT);
177         RNA_def_property_array(prop, 1);
178         RNA_def_property_int_funcs(prop, "rna_IDProperty_intarray_get", "rna_IDProperty_intarray_set");
179
180         /* IDP_FLOAT */
181         prop= RNA_def_property(srna, "float", PROP_FLOAT, PROP_NONE);
182         RNA_def_property_flag(prop, PROP_EXPORT);
183         RNA_def_property_float_funcs(prop, "rna_IDProperty_float_get", "rna_IDProperty_float_set");
184
185         prop= RNA_def_property(srna, "floatarray", PROP_FLOAT, PROP_NONE);
186         RNA_def_property_flag(prop, PROP_EXPORT);
187         RNA_def_property_array(prop, 1);
188         RNA_def_property_float_funcs(prop, "rna_IDProperty_floatarray_get", "rna_IDProperty_floatarray_set");
189
190         /* IDP_DOUBLE */
191         prop= RNA_def_property(srna, "double", PROP_FLOAT, PROP_NONE);
192         RNA_def_property_flag(prop, PROP_EXPORT);
193         RNA_def_property_float_funcs(prop, "rna_IDProperty_double_get", "rna_IDProperty_double_set");
194
195         prop= RNA_def_property(srna, "doublearray", PROP_FLOAT, PROP_NONE);
196         RNA_def_property_flag(prop, PROP_EXPORT);
197         RNA_def_property_array(prop, 1);
198         RNA_def_property_float_funcs(prop, "rna_IDProperty_doublearray_get", "rna_IDProperty_doublearray_set");
199
200         /* IDP_GROUP */
201         prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
202         RNA_def_property_flag(prop, PROP_EXPORT|PROP_NOT_EDITABLE);
203         RNA_def_property_struct_type(prop, "IDPropertyGroup");
204         RNA_def_property_pointer_funcs(prop, "rna_IDProperty_group_get", 0, 0);
205
206         /* IDP_ID -- not implemented yet in id properties */
207
208         /* ID property groups > level 0, since level 0 group is merged
209          * with native RNA properties. the builtin_properties will take
210          * care of the properties here */
211         srna= RNA_def_struct(brna, "IDPropertyGroup", "ID Property Group");
212 }
213
214 void RNA_def_ID(StructRNA *srna)
215 {
216         PropertyRNA *prop;
217
218         RNA_def_struct_flag(srna, STRUCT_ID);
219
220         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
221         RNA_def_property_string_sdna(prop, "ID", "name");
222         RNA_def_property_ui_text(prop, "Name", "Object ID name.");
223         RNA_def_property_string_funcs(prop, "rna_ID_name_get", "rna_ID_name_length", "rna_ID_name_set");
224         RNA_def_struct_name_property(srna, prop);
225 }
226
227 void RNA_def_ID_types(BlenderRNA *brna)
228 {
229         RNA_def_ID_property(brna);
230 }
231
232 #endif
233