Merge from 2.5 r20991 through r21037
[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_Ipo)) return case ID_IP;
71         if(RNA_struct_is_a(type, &RNA_Key)) return ID_KE;
72         if(RNA_struct_is_a(type, &RNA_Lamp)) return ID_LA;
73         if(RNA_struct_is_a(type, &RNA_Library)) return ID_LI;
74         if(RNA_struct_is_a(type, &RNA_Lattice)) return ID_LT;
75         if(RNA_struct_is_a(type, &RNA_Material)) return ID_MA;
76         if(RNA_struct_is_a(type, &RNA_MetaBall)) return ID_MB;
77         if(RNA_struct_is_a(type, &RNA_NodeTree)) return ID_NT;
78         if(RNA_struct_is_a(type, &RNA_Mesh)) return ID_ME;
79         if(RNA_struct_is_a(type, &RNA_Object)) return ID_OB;
80         if(RNA_struct_is_a(type, &RNA_ParticleSettings)) return ID_PA;
81         if(RNA_struct_is_a(type, &RNA_Scene)) return ID_SCE;
82         if(RNA_struct_is_a(type, &RNA_Screen)) return ID_SCR;
83         if(RNA_struct_is_a(type, &RNA_Sound)) return ID_SO;
84         if(RNA_struct_is_a(type, &RNA_Text)) return ID_TXT;
85         if(RNA_struct_is_a(type, &RNA_Texture)) return ID_TE;
86         if(RNA_struct_is_a(type, &RNA_VectorFont)) return ID_VF;
87         if(RNA_struct_is_a(type, &RNA_World)) return ID_WO;
88         if(RNA_struct_is_a(type, &RNA_WindowManager)) return ID_WM;
89
90         return 0;
91 }
92
93 StructRNA *ID_code_to_RNA_type(short idcode)
94 {
95         switch(idcode) {
96                 case ID_AC: return &RNA_Action;
97                 case ID_AR: return &RNA_Armature;
98                 case ID_BR: return &RNA_Brush;
99                 case ID_CA: return &RNA_Camera;
100                 case ID_CU: return &RNA_Curve;
101                 case ID_GR: return &RNA_Group;
102                 case ID_IM: return &RNA_Image;
103                 //case ID_IP: return &RNA_Ipo;
104                 case ID_KE: return &RNA_Key;
105                 case ID_LA: return &RNA_Lamp;
106                 case ID_LI: return &RNA_Library;
107                 case ID_LT: return &RNA_Lattice;
108                 case ID_MA: return &RNA_Material;
109                 case ID_MB: return &RNA_MetaBall;
110                 case ID_NT: return &RNA_NodeTree;
111                 case ID_ME: return &RNA_Mesh;
112                 case ID_OB: return &RNA_Object;
113                 case ID_PA: return &RNA_ParticleSettings;
114                 case ID_SCE: return &RNA_Scene;
115                 case ID_SCR: return &RNA_Screen;
116                 case ID_SO: return &RNA_Sound;
117                 case ID_TXT: return &RNA_Text;
118                 case ID_TE: return &RNA_Texture;
119                 case ID_VF: return &RNA_VectorFont;
120                 case ID_WO: return &RNA_World;
121                 case ID_WM: return &RNA_WindowManager;
122                 default: return &RNA_ID;
123         }
124 }
125
126 StructRNA *rna_ID_refine(PointerRNA *ptr)
127 {
128         ID *id= (ID*)ptr->data;
129
130         return ID_code_to_RNA_type(GS(id->name));
131 }
132
133 IDProperty *rna_ID_idproperties(PointerRNA *ptr, int create)
134 {
135         return IDP_GetProperties(ptr->data, create);
136 }
137
138 void rna_ID_fake_user_set(PointerRNA *ptr, int value)
139 {
140         ID *id= (ID*)ptr->data;
141
142         if(value && !(id->flag & LIB_FAKEUSER)) {
143                 id->flag |= LIB_FAKEUSER;
144                 id->us++;
145         }
146         else if(!value && (id->flag & LIB_FAKEUSER)) {
147                 id->flag &= ~LIB_FAKEUSER;
148                 id->us--;
149         }
150 }
151
152 IDProperty *rna_IDPropertyGroup_idproperties(PointerRNA *ptr, int create)
153 {
154         return ptr->data;
155 }
156
157 #else
158
159 static void rna_def_ID_properties(BlenderRNA *brna)
160 {
161         StructRNA *srna;
162         PropertyRNA *prop;
163
164         /* this is struct is used for holding the virtual
165          * PropertyRNA's for ID properties */
166         srna= RNA_def_struct(brna, "IDProperty", NULL);
167         RNA_def_struct_ui_text(srna, "ID Property", "Property that stores arbitrary, user defined properties.");
168         
169         /* IDP_STRING */
170         prop= RNA_def_property(srna, "string", PROP_STRING, PROP_NONE);
171         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
172
173         /* IDP_INT */
174         prop= RNA_def_property(srna, "int", PROP_INT, PROP_NONE);
175         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
176
177         prop= RNA_def_property(srna, "int_array", PROP_INT, PROP_NONE);
178         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
179         RNA_def_property_array(prop, 1);
180
181         /* IDP_FLOAT */
182         prop= RNA_def_property(srna, "float", PROP_FLOAT, PROP_NONE);
183         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
184
185         prop= RNA_def_property(srna, "float_array", PROP_FLOAT, PROP_NONE);
186         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
187         RNA_def_property_array(prop, 1);
188
189         /* IDP_DOUBLE */
190         prop= RNA_def_property(srna, "double", PROP_FLOAT, PROP_NONE);
191         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
192
193         prop= RNA_def_property(srna, "double_array", PROP_FLOAT, PROP_NONE);
194         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
195         RNA_def_property_array(prop, 1);
196
197         /* IDP_GROUP */
198         prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
199         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
200         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
201         RNA_def_property_struct_type(prop, "IDPropertyGroup");
202
203         prop= RNA_def_property(srna, "collection", PROP_COLLECTION, PROP_NONE);
204         RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
205         RNA_def_property_struct_type(prop, "IDPropertyGroup");
206
207         /* IDP_ID -- not implemented yet in id properties */
208
209         /* ID property groups > level 0, since level 0 group is merged
210          * with native RNA properties. the builtin_properties will take
211          * care of the properties here */
212         srna= RNA_def_struct(brna, "IDPropertyGroup", NULL);
213         RNA_def_struct_ui_text(srna, "ID Property Group", "Group of ID properties.");
214         RNA_def_struct_idproperties_func(srna, "rna_IDPropertyGroup_idproperties");
215 }
216
217 static void rna_def_ID(BlenderRNA *brna)
218 {
219         StructRNA *srna;
220         PropertyRNA *prop;
221
222         srna= RNA_def_struct(brna, "ID", NULL);
223         RNA_def_struct_ui_text(srna, "ID", "Base type for datablocks, defining a unique name, linking from other libraries and garbage collection.");
224         RNA_def_struct_flag(srna, STRUCT_ID|STRUCT_ID_REFCOUNT);
225         RNA_def_struct_refine_func(srna, "rna_ID_refine");
226         RNA_def_struct_idproperties_func(srna, "rna_ID_idproperties");
227
228         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
229         RNA_def_property_ui_text(prop, "Name", "Unique datablock ID name.");
230         RNA_def_property_string_funcs(prop, "rna_ID_name_get", "rna_ID_name_length", "rna_ID_name_set");
231         RNA_def_property_string_maxlength(prop, sizeof(((ID*)NULL)->name)-2);
232         RNA_def_struct_name_property(srna, prop);
233
234         prop= RNA_def_property(srna, "users", PROP_INT, PROP_UNSIGNED);
235         RNA_def_property_int_sdna(prop, NULL, "us");
236         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
237         RNA_def_property_ui_text(prop, "Users", "Number of times this datablock is referenced.");
238
239         prop= RNA_def_property(srna, "fake_user", PROP_BOOLEAN, PROP_NONE);
240         RNA_def_property_boolean_sdna(prop, NULL, "flag", LIB_FAKEUSER);
241         RNA_def_property_ui_text(prop, "Fake User", "Saves this datablock even if it has no users");
242         RNA_def_property_boolean_funcs(prop, NULL, "rna_ID_fake_user_set");
243
244         prop= RNA_def_property(srna, "library", PROP_POINTER, PROP_NONE);
245         RNA_def_property_pointer_sdna(prop, NULL, "lib");
246         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
247         RNA_def_property_ui_text(prop, "Library", "Library file the datablock is linked from.");
248 }
249
250 static void rna_def_library(BlenderRNA *brna)
251 {
252         StructRNA *srna;
253         PropertyRNA *prop;
254
255         srna= RNA_def_struct(brna, "Library", "ID");
256         RNA_def_struct_ui_text(srna, "Library", "External .blend file from which data is linked.");
257         RNA_def_struct_ui_icon(srna, ICON_LIBRARY_DATA_DIRECT);
258
259         prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
260         RNA_def_property_string_sdna(prop, NULL, "name");
261         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
262         RNA_def_property_ui_text(prop, "Filename", "Path to the library .blend file.");
263 }
264 void RNA_def_ID(BlenderRNA *brna)
265 {
266         StructRNA *srna;
267
268         /* built-in unknown type */
269         srna= RNA_def_struct(brna, "UnknownType", NULL);
270         RNA_def_struct_ui_text(srna, "Unknown Type", "Stub RNA type used for pointers to unknown or internal data.");
271
272         /* built-in any type */
273         srna= RNA_def_struct(brna, "AnyType", NULL);
274         RNA_def_struct_ui_text(srna, "Any Type", "RNA type used for pointers to any possible data.");
275
276         rna_def_ID(brna);
277         rna_def_ID_properties(brna);
278         rna_def_library(brna);
279 }
280
281 #endif
282