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