Undo revision 23130 which was a merge with 2.5, a messy one because I did something...
[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_access.h"
29 #include "RNA_define.h"
30 #include "RNA_types.h"
31
32 #include "DNA_ID.h"
33
34 #include "rna_internal.h"
35
36 #ifdef RNA_RUNTIME
37
38 #include "BKE_idprop.h"
39 #include "BKE_library.h"
40
41 /* name functions that ignore the first two ID characters */
42 void rna_ID_name_get(PointerRNA *ptr, char *value)
43 {
44         ID *id= (ID*)ptr->data;
45         BLI_strncpy(value, id->name+2, sizeof(id->name)-2);
46 }
47
48 int rna_ID_name_length(PointerRNA *ptr)
49 {
50         ID *id= (ID*)ptr->data;
51         return strlen(id->name+2);
52 }
53
54 void rna_ID_name_set(PointerRNA *ptr, const char *value)
55 {
56         ID *id= (ID*)ptr->data;
57         BLI_strncpy(id->name+2, value, sizeof(id->name)-2);
58         test_idbutton(id->name+2);
59 }
60
61 short RNA_type_to_ID_code(StructRNA *type)
62 {
63         if(RNA_struct_is_a(type, &RNA_Action)) return ID_AC;
64         if(RNA_struct_is_a(type, &RNA_Armature)) return ID_AR;
65         if(RNA_struct_is_a(type, &RNA_Brush)) return ID_BR;
66         if(RNA_struct_is_a(type, &RNA_Camera)) return ID_CA;
67         if(RNA_struct_is_a(type, &RNA_Curve)) return ID_CU;
68         if(RNA_struct_is_a(type, &RNA_Group)) return ID_GR;
69         if(RNA_struct_is_a(type, &RNA_Image)) return ID_IM;
70         if(RNA_struct_is_a(type, &RNA_Key)) return ID_KE;
71         if(RNA_struct_is_a(type, &RNA_Lamp)) return ID_LA;
72         if(RNA_struct_is_a(type, &RNA_Library)) return ID_LI;
73         if(RNA_struct_is_a(type, &RNA_Lattice)) return ID_LT;
74         if(RNA_struct_is_a(type, &RNA_Material)) return ID_MA;
75         if(RNA_struct_is_a(type, &RNA_MetaBall)) return ID_MB;
76         if(RNA_struct_is_a(type, &RNA_NodeTree)) return ID_NT;
77         if(RNA_struct_is_a(type, &RNA_Mesh)) return ID_ME;
78         if(RNA_struct_is_a(type, &RNA_Object)) return ID_OB;
79         if(RNA_struct_is_a(type, &RNA_ParticleSettings)) return ID_PA;
80         if(RNA_struct_is_a(type, &RNA_Scene)) return ID_SCE;
81         if(RNA_struct_is_a(type, &RNA_Screen)) return ID_SCR;
82         if(RNA_struct_is_a(type, &RNA_Sound)) return ID_SO;
83         if(RNA_struct_is_a(type, &RNA_Text)) return ID_TXT;
84         if(RNA_struct_is_a(type, &RNA_Texture)) return ID_TE;
85         if(RNA_struct_is_a(type, &RNA_VectorFont)) return ID_VF;
86         if(RNA_struct_is_a(type, &RNA_World)) return ID_WO;
87         if(RNA_struct_is_a(type, &RNA_WindowManager)) return ID_WM;
88
89         return 0;
90 }
91
92 StructRNA *ID_code_to_RNA_type(short idcode)
93 {
94         switch(idcode) {
95                 case ID_AC: return &RNA_Action;
96                 case ID_AR: return &RNA_Armature;
97                 case ID_BR: return &RNA_Brush;
98                 case ID_CA: return &RNA_Camera;
99                 case ID_CU: return &RNA_Curve;
100                 case ID_GR: return &RNA_Group;
101                 case ID_IM: return &RNA_Image;
102                 case ID_KE: return &RNA_Key;
103                 case ID_LA: return &RNA_Lamp;
104                 case ID_LI: return &RNA_Library;
105                 case ID_LT: return &RNA_Lattice;
106                 case ID_MA: return &RNA_Material;
107                 case ID_MB: return &RNA_MetaBall;
108                 case ID_NT: return &RNA_NodeTree;
109                 case ID_ME: return &RNA_Mesh;
110                 case ID_OB: return &RNA_Object;
111                 case ID_PA: return &RNA_ParticleSettings;
112                 case ID_SCE: return &RNA_Scene;
113                 case ID_SCR: return &RNA_Screen;
114                 case ID_SO: return &RNA_Sound;
115                 case ID_TXT: return &RNA_Text;
116                 case ID_TE: return &RNA_Texture;
117                 case ID_VF: return &RNA_VectorFont;
118                 case ID_WO: return &RNA_World;
119                 case ID_WM: return &RNA_WindowManager;
120                 default: return &RNA_ID;
121         }
122 }
123
124 StructRNA *rna_ID_refine(PointerRNA *ptr)
125 {
126         ID *id= (ID*)ptr->data;
127
128         return ID_code_to_RNA_type(GS(id->name));
129 }
130
131 IDProperty *rna_ID_idproperties(PointerRNA *ptr, int create)
132 {
133         return IDP_GetProperties(ptr->data, create);
134 }
135
136 void rna_ID_fake_user_set(PointerRNA *ptr, int value)
137 {
138         ID *id= (ID*)ptr->data;
139
140         if(value && !(id->flag & LIB_FAKEUSER)) {
141                 id->flag |= LIB_FAKEUSER;
142                 id->us++;
143         }
144         else if(!value && (id->flag & LIB_FAKEUSER)) {
145                 id->flag &= ~LIB_FAKEUSER;
146                 id->us--;
147         }
148 }
149
150 IDProperty *rna_IDPropertyGroup_idproperties(PointerRNA *ptr, int create)
151 {
152         return ptr->data;
153 }
154
155 void rna_IDPropertyGroup_unregister(const bContext *C, StructRNA *type)
156 {
157         RNA_struct_free(&BLENDER_RNA, type);
158 }
159
160 StructRNA *rna_IDPropertyGroup_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
161 {
162         PointerRNA dummyptr;
163
164         /* create dummy pointer */
165         RNA_pointer_create(NULL, &RNA_IDPropertyGroup, NULL, &dummyptr);
166
167         /* validate the python class */
168         if(validate(&dummyptr, data, NULL) != 0)
169                 return NULL;
170
171         return RNA_def_struct(&BLENDER_RNA, identifier, "IDPropertyGroup");  // XXX
172 }
173
174 StructRNA* rna_IDPropertyGroup_refine(PointerRNA *ptr)
175 {
176         return ptr->type;
177 }
178
179 #else
180
181 static void rna_def_ID_properties(BlenderRNA *brna)
182 {
183         StructRNA *srna;
184         PropertyRNA *prop;
185
186         /* this is struct is used for holding the virtual
187          * PropertyRNA's for ID properties */
188         srna= RNA_def_struct(brna, "IDProperty", NULL);
189         RNA_def_struct_ui_text(srna, "ID Property", "Property that stores arbitrary, user defined properties.");
190         
191         /* IDP_STRING */
192         prop= RNA_def_property(srna, "string", PROP_STRING, PROP_NONE);
193         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
194
195         /* IDP_INT */
196         prop= RNA_def_property(srna, "int", PROP_INT, PROP_NONE);
197         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
198
199         prop= RNA_def_property(srna, "int_array", PROP_INT, PROP_NONE);
200         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
201         RNA_def_property_array(prop, 1);
202
203         /* IDP_FLOAT */
204         prop= RNA_def_property(srna, "float", PROP_FLOAT, PROP_NONE);
205         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
206
207         prop= RNA_def_property(srna, "float_array", PROP_FLOAT, PROP_NONE);
208         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
209         RNA_def_property_array(prop, 1);
210
211         /* IDP_DOUBLE */
212         prop= RNA_def_property(srna, "double", PROP_FLOAT, PROP_NONE);
213         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
214
215         prop= RNA_def_property(srna, "double_array", PROP_FLOAT, PROP_NONE);
216         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
217         RNA_def_property_array(prop, 1);
218
219         /* IDP_GROUP */
220         prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
221         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
222         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
223         RNA_def_property_struct_type(prop, "IDPropertyGroup");
224
225         prop= RNA_def_property(srna, "collection", PROP_COLLECTION, PROP_NONE);
226         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
227         RNA_def_property_struct_type(prop, "IDPropertyGroup");
228
229         /* IDP_ID -- not implemented yet in id properties */
230
231         /* ID property groups > level 0, since level 0 group is merged
232          * with native RNA properties. the builtin_properties will take
233          * care of the properties here */
234         srna= RNA_def_struct(brna, "IDPropertyGroup", NULL);
235         RNA_def_struct_ui_text(srna, "ID Property Group", "Group of ID properties.");
236         RNA_def_struct_idproperties_func(srna, "rna_IDPropertyGroup_idproperties");
237         RNA_def_struct_register_funcs(srna, "rna_IDPropertyGroup_register", "rna_IDPropertyGroup_unregister");
238         RNA_def_struct_refine_func(srna, "rna_IDPropertyGroup_refine");
239 }
240
241 static void rna_def_ID(BlenderRNA *brna)
242 {
243         StructRNA *srna;
244         PropertyRNA *prop;
245
246         srna= RNA_def_struct(brna, "ID", NULL);
247         RNA_def_struct_ui_text(srna, "ID", "Base type for datablocks, defining a unique name, linking from other libraries and garbage collection.");
248         RNA_def_struct_flag(srna, STRUCT_ID|STRUCT_ID_REFCOUNT);
249         RNA_def_struct_refine_func(srna, "rna_ID_refine");
250         RNA_def_struct_idproperties_func(srna, "rna_ID_idproperties");
251
252         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
253         RNA_def_property_ui_text(prop, "Name", "Unique datablock ID name.");
254         RNA_def_property_string_funcs(prop, "rna_ID_name_get", "rna_ID_name_length", "rna_ID_name_set");
255         RNA_def_property_string_maxlength(prop, sizeof(((ID*)NULL)->name)-2);
256         RNA_def_struct_name_property(srna, prop);
257
258         prop= RNA_def_property(srna, "users", PROP_INT, PROP_UNSIGNED);
259         RNA_def_property_int_sdna(prop, NULL, "us");
260         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
261         RNA_def_property_ui_text(prop, "Users", "Number of times this datablock is referenced.");
262
263         prop= RNA_def_property(srna, "fake_user", PROP_BOOLEAN, PROP_NONE);
264         RNA_def_property_boolean_sdna(prop, NULL, "flag", LIB_FAKEUSER);
265         RNA_def_property_ui_text(prop, "Fake User", "Saves this datablock even if it has no users");
266         RNA_def_property_boolean_funcs(prop, NULL, "rna_ID_fake_user_set");
267
268         prop= RNA_def_property(srna, "library", PROP_POINTER, PROP_NONE);
269         RNA_def_property_pointer_sdna(prop, NULL, "lib");
270         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
271         RNA_def_property_ui_text(prop, "Library", "Library file the datablock is linked from.");
272 }
273
274 static void rna_def_library(BlenderRNA *brna)
275 {
276         StructRNA *srna;
277         PropertyRNA *prop;
278
279         srna= RNA_def_struct(brna, "Library", "ID");
280         RNA_def_struct_ui_text(srna, "Library", "External .blend file from which data is linked.");
281         RNA_def_struct_ui_icon(srna, ICON_LIBRARY_DATA_DIRECT);
282
283         prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
284         RNA_def_property_string_sdna(prop, NULL, "name");
285         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
286         RNA_def_property_ui_text(prop, "Filename", "Path to the library .blend file.");
287 }
288 void RNA_def_ID(BlenderRNA *brna)
289 {
290         StructRNA *srna;
291
292         /* built-in unknown type */
293         srna= RNA_def_struct(brna, "UnknownType", NULL);
294         RNA_def_struct_ui_text(srna, "Unknown Type", "Stub RNA type used for pointers to unknown or internal data.");
295
296         /* built-in any type */
297         srna= RNA_def_struct(brna, "AnyType", NULL);
298         RNA_def_struct_ui_text(srna, "Any Type", "RNA type used for pointers to any possible data.");
299
300         rna_def_ID(brna);
301         rna_def_ID_properties(brna);
302         rna_def_library(brna);
303 }
304
305 #endif
306