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