eb1beb90567d3f19a344e73fc992e1dac0133a5d
[blender-staging.git] / source / blender / makesrna / intern / rna_internal_types.h
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Contributor(s): Blender Foundation (2008).
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file blender/makesrna/intern/rna_internal_types.h
26  *  \ingroup RNA
27  */
28
29
30 #ifndef RNA_INTERNAL_TYPES_H
31 #define RNA_INTERNAL_TYPES_H
32
33 #include "DNA_listBase.h"
34
35 struct BlenderRNA;
36 struct ContainerRNA;
37 struct StructRNA;
38 struct PropertyRNA;
39 struct PointerRNA;
40 struct FunctionRNA;
41 struct ReportList;
42 struct CollectionPropertyIterator;
43 struct bContext;
44 struct IDProperty;
45 struct GHash;
46 struct Main;
47 struct Scene;
48
49 #ifdef UNIT_TEST
50 #define RNA_MAX_ARRAY_LENGTH 64
51 #else
52 #define RNA_MAX_ARRAY_LENGTH 32
53 #endif
54
55 #define RNA_MAX_ARRAY_DIMENSION 3
56
57
58 /* store local properties here */
59 #define RNA_IDP_UI "_RNA_UI"
60
61 /* Function Callbacks */
62
63 typedef void (*UpdateFunc)(struct Main *main, struct Scene *scene, struct PointerRNA *ptr);
64 typedef void (*ContextUpdateFunc)(struct bContext *C, struct PointerRNA *ptr);
65 typedef int (*EditableFunc)(struct PointerRNA *ptr);
66 typedef int (*ItemEditableFunc)(struct PointerRNA *ptr, int index);
67 typedef struct IDProperty* (*IDPropertiesFunc)(struct PointerRNA *ptr, int create);
68 typedef struct StructRNA *(*StructRefineFunc)(struct PointerRNA *ptr);
69 typedef char *(*StructPathFunc)(struct PointerRNA *ptr);
70
71 typedef int (*PropArrayLengthGetFunc)(struct PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION]);
72 typedef int (*PropBooleanGetFunc)(struct PointerRNA *ptr);
73 typedef void (*PropBooleanSetFunc)(struct PointerRNA *ptr, int value);
74 typedef void (*PropBooleanArrayGetFunc)(struct PointerRNA *ptr, int *values);
75 typedef void (*PropBooleanArraySetFunc)(struct PointerRNA *ptr, const int *values);
76 typedef int (*PropIntGetFunc)(struct PointerRNA *ptr);
77 typedef void (*PropIntSetFunc)(struct PointerRNA *ptr, int value);
78 typedef void (*PropIntArrayGetFunc)(struct PointerRNA *ptr, int *values);
79 typedef void (*PropIntArraySetFunc)(struct PointerRNA *ptr, const int *values);
80 typedef void (*PropIntRangeFunc)(struct PointerRNA *ptr, int *min, int *max);
81 typedef float (*PropFloatGetFunc)(struct PointerRNA *ptr);
82 typedef void (*PropFloatSetFunc)(struct PointerRNA *ptr, float value);
83 typedef void (*PropFloatArrayGetFunc)(struct PointerRNA *ptr, float *values);
84 typedef void (*PropFloatArraySetFunc)(struct PointerRNA *ptr, const float *values);
85 typedef void (*PropFloatRangeFunc)(struct PointerRNA *ptr, float *min, float *max);
86 typedef void (*PropStringGetFunc)(struct PointerRNA *ptr, char *value);
87 typedef int (*PropStringLengthFunc)(struct PointerRNA *ptr);
88 typedef void (*PropStringSetFunc)(struct PointerRNA *ptr, const char *value);
89 typedef int (*PropEnumGetFunc)(struct PointerRNA *ptr);
90 typedef void (*PropEnumSetFunc)(struct PointerRNA *ptr, int value);
91 typedef EnumPropertyItem *(*PropEnumItemFunc)(struct bContext *C, struct PointerRNA *ptr, int *free);
92 typedef PointerRNA (*PropPointerGetFunc)(struct PointerRNA *ptr);
93 typedef StructRNA* (*PropPointerTypeFunc)(struct PointerRNA *ptr);
94 typedef void (*PropPointerSetFunc)(struct PointerRNA *ptr, const PointerRNA value);
95 typedef int (*PropPointerPollFunc)(struct PointerRNA *ptr, const PointerRNA value);
96 typedef void (*PropCollectionBeginFunc)(struct CollectionPropertyIterator *iter, struct PointerRNA *ptr);
97 typedef void (*PropCollectionNextFunc)(struct CollectionPropertyIterator *iter);
98 typedef void (*PropCollectionEndFunc)(struct CollectionPropertyIterator *iter);
99 typedef PointerRNA (*PropCollectionGetFunc)(struct CollectionPropertyIterator *iter);
100 typedef int (*PropCollectionLengthFunc)(struct PointerRNA *ptr);
101 typedef int (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key, struct PointerRNA *r_ptr);
102 typedef int (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr);
103
104 /* Container - generic abstracted container of RNA properties */
105 typedef struct ContainerRNA {
106         void *next, *prev;
107
108         struct GHash *prophash;
109         ListBase properties;
110 } ContainerRNA;
111
112 struct FunctionRNA {
113         /* structs are containers of properties */
114         ContainerRNA cont;
115
116         /* unique identifier, keep after 'cont' */
117         const char *identifier;
118         /* various options */
119         int flag;
120
121         /* single line description, displayed in the tooltip for example */
122         const char *description;
123
124         /* callback to execute the function */
125         CallFunc call;
126
127         /* parameter for the return value
128          * note: this is only the C return value, rna functions can have multiple return values */
129         PropertyRNA *c_ret;
130 };
131
132 struct PropertyRNA {
133         struct PropertyRNA *next, *prev;
134
135         /* magic bytes to distinguish with IDProperty */
136         int magic;
137
138         /* unique identifier */
139         const char *identifier;
140         /* various options */
141         int flag;
142
143         /* user readable name */
144         const char *name;
145         /* single line description, displayed in the tooltip for example */
146         const char *description;
147         /* icon ID */
148         int icon;
149
150         /* property type as it appears to the outside */
151         PropertyType type;
152         /* subtype, 'interpretation' of the property */
153         PropertySubType subtype;
154         /* if non-NULL, overrides arraylength. Must not return 0? */
155         PropArrayLengthGetFunc getlength;
156         /* dimension of array */
157         unsigned int arraydimension;
158         /* array lengths lengths for all dimensions (when arraydimension > 0) */
159         unsigned int arraylength[RNA_MAX_ARRAY_DIMENSION];
160         unsigned int totarraylength;
161         
162         /* callback for updates on change */
163         UpdateFunc update;
164         int noteflag;
165
166         /* callback for testing if editable */
167         EditableFunc editable;
168         /* callback for testing if array-item editable (if applicable) */
169         ItemEditableFunc itemeditable;
170
171         /* raw access */
172         int rawoffset;
173         RawPropertyType rawtype;
174
175         /* This is used for accessing props/functions of this property
176          * any property can have this but should only be used for collections and arrays
177          * since python will convert int/bool/pointer's */
178         struct StructRNA *srna; /* attributes attached directly to this collection */
179 };
180
181 /* Property Types */
182
183 typedef struct BooleanPropertyRNA {
184         PropertyRNA property;
185
186         PropBooleanGetFunc get;
187         PropBooleanSetFunc set;
188
189         PropBooleanArrayGetFunc getarray;
190         PropBooleanArraySetFunc setarray;
191
192         int defaultvalue;
193         const int *defaultarray;
194 } BooleanPropertyRNA;
195
196 typedef struct IntPropertyRNA {
197         PropertyRNA property;
198
199         PropIntGetFunc get;
200         PropIntSetFunc set;
201
202         PropIntArrayGetFunc getarray;
203         PropIntArraySetFunc setarray;
204
205         PropIntRangeFunc range;
206
207         int softmin, softmax;
208         int hardmin, hardmax;
209         int step;
210
211         int defaultvalue;
212         const int *defaultarray;
213 } IntPropertyRNA;
214
215 typedef struct FloatPropertyRNA {
216         PropertyRNA property;
217
218         PropFloatGetFunc get;
219         PropFloatSetFunc set;
220
221         PropFloatArrayGetFunc getarray;
222         PropFloatArraySetFunc setarray;
223
224         PropFloatRangeFunc range;
225
226         float softmin, softmax;
227         float hardmin, hardmax;
228         float step;
229         int precision;
230
231         float defaultvalue;
232         const float *defaultarray;
233 } FloatPropertyRNA;
234
235 typedef struct StringPropertyRNA {
236         PropertyRNA property;
237
238         PropStringGetFunc get;
239         PropStringLengthFunc length;
240         PropStringSetFunc set;
241
242         int maxlength;  /* includes string terminator! */
243
244         const char *defaultvalue;
245 } StringPropertyRNA;
246
247 typedef struct EnumPropertyRNA {
248         PropertyRNA property;
249
250         PropEnumGetFunc get;
251         PropEnumSetFunc set;
252         PropEnumItemFunc itemf;
253
254         EnumPropertyItem *item;
255         int totitem;
256
257         int defaultvalue;
258 } EnumPropertyRNA;
259
260 typedef struct PointerPropertyRNA {
261         PropertyRNA property;
262
263         PropPointerGetFunc get;
264         PropPointerSetFunc set;
265         PropPointerTypeFunc typef;
266         PropPointerPollFunc poll; /* unlike operators, 'set' can still run if poll fails, used for filtering display */
267
268         struct StructRNA *type;
269 } PointerPropertyRNA;
270
271 typedef struct CollectionPropertyRNA {
272         PropertyRNA property;
273
274         PropCollectionBeginFunc begin;
275         PropCollectionNextFunc next;
276         PropCollectionEndFunc end;                                              /* optional */
277         PropCollectionGetFunc get;
278         PropCollectionLengthFunc length;                                /* optional */
279         PropCollectionLookupIntFunc lookupint;                  /* optional */
280         PropCollectionLookupStringFunc lookupstring;    /* optional */
281
282         struct StructRNA *item_type;                    /* the type of this item */
283 } CollectionPropertyRNA;
284
285
286 /* changes to this struct require updating rna_generate_struct in makesrna.c */
287 struct StructRNA {
288         /* structs are containers of properties */
289         ContainerRNA cont;
290
291         /* unique identifier, keep after 'cont' */
292         const char *identifier;
293
294         /* python type, this is a subtype of pyrna_struct_Type but used so each struct can have its own type
295          * which is useful for subclassing RNA */
296         void *py_type;
297         void *blender_type;
298         
299         /* various options */
300         int flag;
301
302         /* user readable name */
303         const char *name;
304         /* single line description, displayed in the tooltip for example */
305         const char *description;
306         /* icon ID */
307         int icon;
308         
309         /* property that defines the name */
310         PropertyRNA *nameproperty;
311
312         /* property to iterate over properties */
313         PropertyRNA *iteratorproperty;
314
315         /* struct this is derivedfrom */
316         struct StructRNA *base;
317
318         /* only use for nested structs, where both the parent and child access
319          * the same C Struct but nesting is used for grouping properties.
320          * The parent property is used so we know NULL checks are not needed,
321          * and that this struct will never exist without its parent */
322         struct StructRNA *nested;
323
324         /* function to give the more specific type */
325         StructRefineFunc refine; 
326
327         /* function to find path to this struct in an ID */
328         StructPathFunc path; 
329
330         /* function to register/unregister subclasses */
331         StructRegisterFunc reg; 
332         StructUnregisterFunc unreg; 
333
334         /* callback to get id properties */
335         IDPropertiesFunc idproperties;
336
337         /* functions of this struct */
338         ListBase functions; 
339 };
340
341 /* Blender RNA
342  *
343  * Root RNA data structure that lists all struct types. */
344
345 struct BlenderRNA {
346         ListBase structs;
347 };
348
349 #define CONTAINER_RNA_ID(cont) (*(const char **)(((ContainerRNA *)(cont))+1))
350
351 #endif /* RNA_INTERNAL_TYPES_H */