43ec09de010e5926a947ecb510423c69980515eb
[blender.git] / source / blender / makesrna / intern / rna_internal_types.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2008).
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_internal_types.h
24  *  \ingroup RNA
25  */
26
27
28 #ifndef __RNA_INTERNAL_TYPES_H__
29 #define __RNA_INTERNAL_TYPES_H__
30
31 #include "DNA_listBase.h"
32
33 #include "RNA_types.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, int *softmin, int *softmax);
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, float *softmin, float *softmax);
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,
94                                               struct PropertyRNA *prop, int *free);
95 typedef PointerRNA (*PropPointerGetFunc)(struct PointerRNA *ptr);
96 typedef StructRNA *(*PropPointerTypeFunc)(struct PointerRNA *ptr);
97 typedef void (*PropPointerSetFunc)(struct PointerRNA *ptr, const PointerRNA value);
98 typedef int (*PropPointerPollFunc)(struct PointerRNA *ptr, const PointerRNA value);
99 typedef void (*PropCollectionBeginFunc)(struct CollectionPropertyIterator *iter, struct PointerRNA *ptr);
100 typedef void (*PropCollectionNextFunc)(struct CollectionPropertyIterator *iter);
101 typedef void (*PropCollectionEndFunc)(struct CollectionPropertyIterator *iter);
102 typedef PointerRNA (*PropCollectionGetFunc)(struct CollectionPropertyIterator *iter);
103 typedef int (*PropCollectionLengthFunc)(struct PointerRNA *ptr);
104 typedef int (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key, struct PointerRNA *r_ptr);
105 typedef int (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr);
106 typedef int (*PropCollectionAssignIntFunc)(struct PointerRNA *ptr, int key, const struct PointerRNA *assign_ptr);
107
108 /* extended versions with PropertyRNA argument */
109 typedef int (*PropBooleanGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
110 typedef void (*PropBooleanSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int value);
111 typedef void (*PropBooleanArrayGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int *values);
112 typedef void (*PropBooleanArraySetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, const int *values);
113 typedef int (*PropIntGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
114 typedef void (*PropIntSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int value);
115 typedef void (*PropIntArrayGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int *values);
116 typedef void (*PropIntArraySetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, const int *values);
117 typedef void (*PropIntRangeFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int *min, int *max, int *softmin, int *softmax);
118 typedef float (*PropFloatGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
119 typedef void (*PropFloatSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, float value);
120 typedef void (*PropFloatArrayGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, float *values);
121 typedef void (*PropFloatArraySetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, const float *values);
122 typedef void (*PropFloatRangeFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, float *min, float *max, float *softmin, float *softmax);
123 typedef void (*PropStringGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, char *value);
124 typedef int (*PropStringLengthFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
125 typedef void (*PropStringSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, const char *value);
126 typedef int (*PropEnumGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
127 typedef void (*PropEnumSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int value);
128
129 /* Container - generic abstracted container of RNA properties */
130 typedef struct ContainerRNA {
131         void *next, *prev;
132
133         struct GHash *prophash;
134         ListBase properties;
135 } ContainerRNA;
136
137 struct FunctionRNA {
138         /* structs are containers of properties */
139         ContainerRNA cont;
140
141         /* unique identifier, keep after 'cont' */
142         const char *identifier;
143         /* various options */
144         int flag;
145
146         /* single line description, displayed in the tooltip for example */
147         const char *description;
148
149         /* callback to execute the function */
150         CallFunc call;
151
152         /* parameter for the return value
153          * note: this is only the C return value, rna functions can have multiple return values */
154         PropertyRNA *c_ret;
155 };
156
157 struct PropertyRNA {
158         struct PropertyRNA *next, *prev;
159
160         /* magic bytes to distinguish with IDProperty */
161         int magic;
162
163         /* unique identifier */
164         const char *identifier;
165         /* various options */
166         int flag;
167
168         /* user readable name */
169         const char *name;
170         /* single line description, displayed in the tooltip for example */
171         const char *description;
172         /* icon ID */
173         int icon;
174         /* context for translation */
175         const char *translation_context;
176
177         /* property type as it appears to the outside */
178         PropertyType type;
179         /* subtype, 'interpretation' of the property */
180         PropertySubType subtype;
181         /* if non-NULL, overrides arraylength. Must not return 0? */
182         PropArrayLengthGetFunc getlength;
183         /* dimension of array */
184         unsigned int arraydimension;
185         /* array lengths lengths for all dimensions (when arraydimension > 0) */
186         unsigned int arraylength[RNA_MAX_ARRAY_DIMENSION];
187         unsigned int totarraylength;
188         
189         /* callback for updates on change */
190         UpdateFunc update;
191         int noteflag;
192
193         /* callback for testing if editable */
194         EditableFunc editable;
195         /* callback for testing if array-item editable (if applicable) */
196         ItemEditableFunc itemeditable;
197
198         /* raw access */
199         int rawoffset;
200         RawPropertyType rawtype;
201
202         /* This is used for accessing props/functions of this property
203          * any property can have this but should only be used for collections and arrays
204          * since python will convert int/bool/pointer's */
205         struct StructRNA *srna; /* attributes attached directly to this collection */
206
207         /* python handle to hold all callbacks
208          * (in a pointer array at the moment, may later be a tuple) */
209         void *py_data;
210 };
211
212 /* Property Types */
213
214 typedef struct BoolPropertyRNA {
215         PropertyRNA property;
216
217         PropBooleanGetFunc get;
218         PropBooleanSetFunc set;
219         PropBooleanArrayGetFunc getarray;
220         PropBooleanArraySetFunc setarray;
221
222         PropBooleanGetFuncEx get_ex;
223         PropBooleanSetFuncEx set_ex;
224         PropBooleanArrayGetFuncEx getarray_ex;
225         PropBooleanArraySetFuncEx setarray_ex;
226
227         int defaultvalue;
228         const int *defaultarray;
229 } BoolPropertyRNA;
230
231 typedef struct IntPropertyRNA {
232         PropertyRNA property;
233
234         PropIntGetFunc get;
235         PropIntSetFunc set;
236         PropIntArrayGetFunc getarray;
237         PropIntArraySetFunc setarray;
238         PropIntRangeFunc range;
239
240         PropIntGetFuncEx get_ex;
241         PropIntSetFuncEx set_ex;
242         PropIntArrayGetFuncEx getarray_ex;
243         PropIntArraySetFuncEx setarray_ex;
244         PropIntRangeFuncEx range_ex;
245
246         int softmin, softmax;
247         int hardmin, hardmax;
248         int step;
249
250         int defaultvalue;
251         const int *defaultarray;
252 } IntPropertyRNA;
253
254 typedef struct FloatPropertyRNA {
255         PropertyRNA property;
256
257         PropFloatGetFunc get;
258         PropFloatSetFunc set;
259         PropFloatArrayGetFunc getarray;
260         PropFloatArraySetFunc setarray;
261         PropFloatRangeFunc range;
262
263         PropFloatGetFuncEx get_ex;
264         PropFloatSetFuncEx set_ex;
265         PropFloatArrayGetFuncEx getarray_ex;
266         PropFloatArraySetFuncEx setarray_ex;
267         PropFloatRangeFuncEx range_ex;
268
269         float softmin, softmax;
270         float hardmin, hardmax;
271         float step;
272         int precision;
273
274         float defaultvalue;
275         const float *defaultarray;
276 } FloatPropertyRNA;
277
278 typedef struct StringPropertyRNA {
279         PropertyRNA property;
280
281         PropStringGetFunc get;
282         PropStringLengthFunc length;
283         PropStringSetFunc set;
284
285         PropStringGetFuncEx get_ex;
286         PropStringLengthFuncEx length_ex;
287         PropStringSetFuncEx set_ex;
288
289         int maxlength;  /* includes string terminator! */
290
291         const char *defaultvalue;
292 } StringPropertyRNA;
293
294 typedef struct EnumPropertyRNA {
295         PropertyRNA property;
296
297         PropEnumGetFunc get;
298         PropEnumSetFunc set;
299         PropEnumItemFunc itemf;
300
301         PropEnumGetFuncEx get_ex;
302         PropEnumSetFuncEx set_ex;
303         void *py_data; /* store py callback here */
304
305         EnumPropertyItem *item;
306         int totitem;
307
308         int defaultvalue;
309 } EnumPropertyRNA;
310
311 typedef struct PointerPropertyRNA {
312         PropertyRNA property;
313
314         PropPointerGetFunc get;
315         PropPointerSetFunc set;
316         PropPointerTypeFunc typef;
317         PropPointerPollFunc poll; /* unlike operators, 'set' can still run if poll fails, used for filtering display */
318
319         struct StructRNA *type;
320 } PointerPropertyRNA;
321
322 typedef struct CollectionPropertyRNA {
323         PropertyRNA property;
324
325         PropCollectionBeginFunc begin;
326         PropCollectionNextFunc next;
327         PropCollectionEndFunc end;                                              /* optional */
328         PropCollectionGetFunc get;
329         PropCollectionLengthFunc length;                                /* optional */
330         PropCollectionLookupIntFunc lookupint;                  /* optional */
331         PropCollectionLookupStringFunc lookupstring;    /* optional */
332         PropCollectionAssignIntFunc assignint;                  /* optional */
333
334         struct StructRNA *item_type;                    /* the type of this item */
335 } CollectionPropertyRNA;
336
337
338 /* changes to this struct require updating rna_generate_struct in makesrna.c */
339 struct StructRNA {
340         /* structs are containers of properties */
341         ContainerRNA cont;
342
343         /* unique identifier, keep after 'cont' */
344         const char *identifier;
345
346         /* python type, this is a subtype of pyrna_struct_Type but used so each struct can have its own type
347          * which is useful for subclassing RNA */
348         void *py_type;
349         void *blender_type;
350         
351         /* various options */
352         int flag;
353
354         /* user readable name */
355         const char *name;
356         /* single line description, displayed in the tooltip for example */
357         const char *description;
358         /* context for translation */
359         const char *translation_context;
360         /* icon ID */
361         int icon;
362         
363         /* property that defines the name */
364         PropertyRNA *nameproperty;
365
366         /* property to iterate over properties */
367         PropertyRNA *iteratorproperty;
368
369         /* struct this is derivedfrom */
370         struct StructRNA *base;
371
372         /* only use for nested structs, where both the parent and child access
373          * the same C Struct but nesting is used for grouping properties.
374          * The parent property is used so we know NULL checks are not needed,
375          * and that this struct will never exist without its parent */
376         struct StructRNA *nested;
377
378         /* function to give the more specific type */
379         StructRefineFunc refine;
380
381         /* function to find path to this struct in an ID */
382         StructPathFunc path;
383
384         /* function to register/unregister subclasses */
385         StructRegisterFunc reg;
386         StructUnregisterFunc unreg;
387         StructInstanceFunc instance;
388
389         /* callback to get id properties */
390         IDPropertiesFunc idproperties;
391
392         /* functions of this struct */
393         ListBase functions;
394 };
395
396 /* Blender RNA
397  *
398  * Root RNA data structure that lists all struct types. */
399
400 struct BlenderRNA {
401         ListBase structs;
402 };
403
404 #define CONTAINER_RNA_ID(cont) (*(const char **)(((ContainerRNA *)(cont))+1))
405
406 #endif /* __RNA_INTERNAL_TYPES_H__ */