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