Merge branch 'blender2.7'
[blender.git] / source / blender / makesrna / intern / rna_internal_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file \ingroup RNA
18  */
19
20
21 #ifndef __RNA_INTERNAL_TYPES_H__
22 #define __RNA_INTERNAL_TYPES_H__
23
24 #include "DNA_listBase.h"
25
26 #include "RNA_types.h"
27
28 struct BlenderRNA;
29 struct CollectionPropertyIterator;
30 struct ContainerRNA;
31 struct FunctionRNA;
32 struct GHash;
33 struct IDOverrideStatic;
34 struct IDOverrideStaticProperty;
35 struct IDOverrideStaticPropertyOperation;
36 struct IDProperty;
37 struct Main;
38 struct PointerRNA;
39 struct PropertyRNA;
40 struct Scene;
41 struct StructRNA;
42 struct bContext;
43
44 /* store local properties here */
45 #define RNA_IDP_UI "_RNA_UI"
46
47 /* Function Callbacks */
48
49 typedef void (*UpdateFunc)(struct Main *main, struct Scene *scene, struct PointerRNA *ptr);
50 typedef void (*ContextPropUpdateFunc)(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop);
51 typedef void (*ContextUpdateFunc)(struct bContext *C, struct PointerRNA *ptr);
52 typedef int (*EditableFunc)(struct PointerRNA *ptr, const char **r_info);
53 typedef int (*ItemEditableFunc)(struct PointerRNA *ptr, int index);
54 typedef struct IDProperty *(*IDPropertiesFunc)(struct PointerRNA *ptr, bool create);
55 typedef struct StructRNA *(*StructRefineFunc)(struct PointerRNA *ptr);
56 typedef char *(*StructPathFunc)(struct PointerRNA *ptr);
57
58 typedef int (*PropArrayLengthGetFunc)(struct PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION]);
59 typedef bool (*PropBooleanGetFunc)(struct PointerRNA *ptr);
60 typedef void (*PropBooleanSetFunc)(struct PointerRNA *ptr, bool value);
61 typedef void (*PropBooleanArrayGetFunc)(struct PointerRNA *ptr, bool *values);
62 typedef void (*PropBooleanArraySetFunc)(struct PointerRNA *ptr, const bool *values);
63 typedef int (*PropIntGetFunc)(struct PointerRNA *ptr);
64 typedef void (*PropIntSetFunc)(struct PointerRNA *ptr, int value);
65 typedef void (*PropIntArrayGetFunc)(struct PointerRNA *ptr, int *values);
66 typedef void (*PropIntArraySetFunc)(struct PointerRNA *ptr, const int *values);
67 typedef void (*PropIntRangeFunc)(struct PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax);
68 typedef float (*PropFloatGetFunc)(struct PointerRNA *ptr);
69 typedef void (*PropFloatSetFunc)(struct PointerRNA *ptr, float value);
70 typedef void (*PropFloatArrayGetFunc)(struct PointerRNA *ptr, float *values);
71 typedef void (*PropFloatArraySetFunc)(struct PointerRNA *ptr, const float *values);
72 typedef void (*PropFloatRangeFunc)(struct PointerRNA *ptr, float *min, float *max, float *softmin, float *softmax);
73 typedef void (*PropStringGetFunc)(struct PointerRNA *ptr, char *value);
74 typedef int (*PropStringLengthFunc)(struct PointerRNA *ptr);
75 typedef void (*PropStringSetFunc)(struct PointerRNA *ptr, const char *value);
76 typedef int (*PropEnumGetFunc)(struct PointerRNA *ptr);
77 typedef void (*PropEnumSetFunc)(struct PointerRNA *ptr, int value);
78 typedef const EnumPropertyItem *(*PropEnumItemFunc)(
79         struct bContext *C, struct PointerRNA *ptr,
80         struct PropertyRNA *prop, bool *r_free);
81 typedef PointerRNA (*PropPointerGetFunc)(struct PointerRNA *ptr);
82 typedef StructRNA *(*PropPointerTypeFunc)(struct PointerRNA *ptr);
83 typedef void (*PropPointerSetFunc)(struct PointerRNA *ptr, const PointerRNA value);
84 typedef bool (*PropPointerPollFunc)(struct PointerRNA *ptr, const PointerRNA value);
85 typedef bool (*PropPointerPollFuncPy)(struct PointerRNA *ptr, const PointerRNA value, const PropertyRNA *prop);
86 typedef void (*PropCollectionBeginFunc)(struct CollectionPropertyIterator *iter, struct PointerRNA *ptr);
87 typedef void (*PropCollectionNextFunc)(struct CollectionPropertyIterator *iter);
88 typedef void (*PropCollectionEndFunc)(struct CollectionPropertyIterator *iter);
89 typedef PointerRNA (*PropCollectionGetFunc)(struct CollectionPropertyIterator *iter);
90 typedef int (*PropCollectionLengthFunc)(struct PointerRNA *ptr);
91 typedef int (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key, struct PointerRNA *r_ptr);
92 typedef int (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr);
93 typedef int (*PropCollectionAssignIntFunc)(struct PointerRNA *ptr, int key, const struct PointerRNA *assign_ptr);
94
95 /* extended versions with PropertyRNA argument */
96 typedef bool (*PropBooleanGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
97 typedef void (*PropBooleanSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, bool value);
98 typedef void (*PropBooleanArrayGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, bool *values);
99 typedef void (*PropBooleanArraySetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, const bool *values);
100 typedef int (*PropIntGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
101 typedef void (*PropIntSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int value);
102 typedef void (*PropIntArrayGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int *values);
103 typedef void (*PropIntArraySetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, const int *values);
104 typedef void (*PropIntRangeFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int *min, int *max, int *softmin, int *softmax);
105 typedef float (*PropFloatGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
106 typedef void (*PropFloatSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, float value);
107 typedef void (*PropFloatArrayGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, float *values);
108 typedef void (*PropFloatArraySetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, const float *values);
109 typedef void (*PropFloatRangeFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, float *min, float *max, float *softmin, float *softmax);
110 typedef void (*PropStringGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, char *value);
111 typedef int (*PropStringLengthFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
112 typedef void (*PropStringSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, const char *value);
113 typedef int (*PropEnumGetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop);
114 typedef void (*PropEnumSetFuncEx)(struct PointerRNA *ptr, struct PropertyRNA *prop, int value);
115
116 /* Handling override operations, and also comparison. */
117
118 /**
119  * If \a override is NULL, merely do comparison between prop_a from ptr_a and prop_b from ptr_b,
120  * following comparison mode given.
121  * If \a override and \a rna_path are not NULL, it will add a new override operation for overridable properties
122  * that differ and have not yet been overridden (and set accordingly \a r_override_changed if given).
123  *
124  * \note Given PropertyRNA are final (in case of IDProps...).
125  * \note In non-array cases, \a len values are 0.
126  * \note \a override, \a rna_path and \a r_override_changed may be NULL pointers.
127  */
128 typedef int (*RNAPropOverrideDiff)(
129         struct Main *bmain,
130         struct PointerRNA *ptr_a, struct PointerRNA *ptr_b,
131         struct PropertyRNA *prop_a, struct PropertyRNA *prop_b,
132         const int len_a, const int len_b,
133         const int mode,
134         struct IDOverrideStatic *override, const char *rna_path,
135         const int flags, bool *r_override_changed);
136
137 /**
138  * Only used for differential override (add, sub, etc.).
139  * Store into storage the value needed to transform reference's value into local's value.
140  *
141  * \note Given PropertyRNA are final (in case of IDProps...).
142  * \note In non-array cases, \a len values are 0.
143  * \note Might change given override operation (e.g. change 'add' one into 'sub'), in case computed storage value
144  *       is out of range (or even change it to basic 'set' operation if nothing else works).
145  */
146 typedef bool (*RNAPropOverrideStore)(
147         struct Main *bmain,
148         struct PointerRNA *ptr_local, struct PointerRNA *ptr_reference, struct PointerRNA *ptr_storage,
149         struct PropertyRNA *prop_local, struct PropertyRNA *prop_reference, struct PropertyRNA *prop_storage,
150         const int len_local, const int len_reference, const int len_storage,
151         struct IDOverrideStaticPropertyOperation *opop);
152
153 /**
154  * Apply given override operation from src to dst (using value from storage as second operand
155  * for differential operations).
156  *
157  * \note Given PropertyRNA are final (in case of IDProps...).
158  * \note In non-array cases, \a len values are 0.
159  */
160 typedef bool (*RNAPropOverrideApply)(
161         struct Main *bmain,
162         struct PointerRNA *ptr_dst, struct PointerRNA *ptr_src, struct PointerRNA *ptr_storage,
163         struct PropertyRNA *prop_dst, struct PropertyRNA *prop_src, struct PropertyRNA *prop_storage,
164         const int len_dst, const int len_src, const int len_storage,
165         struct PointerRNA *ptr_item_dst, struct PointerRNA *ptr_item_src, struct PointerRNA *ptr_item_storage,
166         struct IDOverrideStaticPropertyOperation *opop);
167
168 /* Container - generic abstracted container of RNA properties */
169 typedef struct ContainerRNA {
170         void *next, *prev;
171
172         struct GHash *prophash;
173         ListBase properties;
174 } ContainerRNA;
175
176 struct FunctionRNA {
177         /* structs are containers of properties */
178         ContainerRNA cont;
179
180         /* unique identifier, keep after 'cont' */
181         const char *identifier;
182         /* various options */
183         int flag;
184
185         /* single line description, displayed in the tooltip for example */
186         const char *description;
187
188         /* callback to execute the function */
189         CallFunc call;
190
191         /* parameter for the return value
192          * note: this is only the C return value, rna functions can have multiple return values */
193         PropertyRNA *c_ret;
194 };
195
196 struct PropertyRNA {
197         struct PropertyRNA *next, *prev;
198
199         /* magic bytes to distinguish with IDProperty */
200         int magic;
201
202         /* unique identifier */
203         const char *identifier;
204         /* various options */
205         int flag;
206         /* various override options */
207         int flag_override;
208         /* Function parameters flags. */
209         short flag_parameter;
210         /* Internal ("private") flags. */
211         short flag_internal;
212         /* The subset of StructRNA.prop_tag_defines values that applies to this property. */
213         short tags;
214
215         /* user readable name */
216         const char *name;
217         /* single line description, displayed in the tooltip for example */
218         const char *description;
219         /* icon ID */
220         int icon;
221         /* context for translation */
222         const char *translation_context;
223
224         /* property type as it appears to the outside */
225         PropertyType type;
226         /* subtype, 'interpretation' of the property */
227         PropertySubType subtype;
228         /* if non-NULL, overrides arraylength. Must not return 0? */
229         PropArrayLengthGetFunc getlength;
230         /* dimension of array */
231         unsigned int arraydimension;
232         /* array lengths lengths for all dimensions (when arraydimension > 0) */
233         unsigned int arraylength[RNA_MAX_ARRAY_DIMENSION];
234         unsigned int totarraylength;
235
236         /* callback for updates on change */
237         UpdateFunc update;
238         int noteflag;
239
240         /* Callback for testing if editable. Its r_info parameter can be used to
241          * return info on editable state that might be shown to user. E.g. tooltips
242          * of disabled buttons can show reason why button is disabled using this. */
243         EditableFunc editable;
244         /* callback for testing if array-item editable (if applicable) */
245         ItemEditableFunc itemeditable;
246
247         /* Override handling callbacks (diff is also used for comparison). */
248         RNAPropOverrideDiff override_diff;
249         RNAPropOverrideStore override_store;
250         RNAPropOverrideApply override_apply;
251
252         /* raw access */
253         int rawoffset;
254         RawPropertyType rawtype;
255
256         /* This is used for accessing props/functions of this property
257          * any property can have this but should only be used for collections and arrays
258          * since python will convert int/bool/pointer's */
259         struct StructRNA *srna; /* attributes attached directly to this collection */
260
261         /* python handle to hold all callbacks
262          * (in a pointer array at the moment, may later be a tuple) */
263         void *py_data;
264 };
265
266 /* internal flags WARNING! 16bits only! */
267 typedef enum PropertyFlagIntern {
268         PROP_INTERN_BUILTIN                 = (1 << 0),
269         PROP_INTERN_RUNTIME                 = (1 << 1),
270         PROP_INTERN_RAW_ACCESS              = (1 << 2),
271         PROP_INTERN_RAW_ARRAY               = (1 << 3),
272         PROP_INTERN_FREE_POINTERS           = (1 << 4),
273 } PropertyFlagIntern;
274
275 /* Property Types */
276
277 typedef struct BoolPropertyRNA {
278         PropertyRNA property;
279
280         PropBooleanGetFunc get;
281         PropBooleanSetFunc set;
282         PropBooleanArrayGetFunc getarray;
283         PropBooleanArraySetFunc setarray;
284
285         PropBooleanGetFuncEx get_ex;
286         PropBooleanSetFuncEx set_ex;
287         PropBooleanArrayGetFuncEx getarray_ex;
288         PropBooleanArraySetFuncEx setarray_ex;
289
290         bool defaultvalue;
291         const bool *defaultarray;
292 } BoolPropertyRNA;
293
294 typedef struct IntPropertyRNA {
295         PropertyRNA property;
296
297         PropIntGetFunc get;
298         PropIntSetFunc set;
299         PropIntArrayGetFunc getarray;
300         PropIntArraySetFunc setarray;
301         PropIntRangeFunc range;
302
303         PropIntGetFuncEx get_ex;
304         PropIntSetFuncEx set_ex;
305         PropIntArrayGetFuncEx getarray_ex;
306         PropIntArraySetFuncEx setarray_ex;
307         PropIntRangeFuncEx range_ex;
308
309         int softmin, softmax;
310         int hardmin, hardmax;
311         int step;
312
313         int defaultvalue;
314         const int *defaultarray;
315 } IntPropertyRNA;
316
317 typedef struct FloatPropertyRNA {
318         PropertyRNA property;
319
320         PropFloatGetFunc get;
321         PropFloatSetFunc set;
322         PropFloatArrayGetFunc getarray;
323         PropFloatArraySetFunc setarray;
324         PropFloatRangeFunc range;
325
326         PropFloatGetFuncEx get_ex;
327         PropFloatSetFuncEx set_ex;
328         PropFloatArrayGetFuncEx getarray_ex;
329         PropFloatArraySetFuncEx setarray_ex;
330         PropFloatRangeFuncEx range_ex;
331
332         float softmin, softmax;
333         float hardmin, hardmax;
334         float step;
335         int precision;
336
337         float defaultvalue;
338         const float *defaultarray;
339 } FloatPropertyRNA;
340
341 typedef struct StringPropertyRNA {
342         PropertyRNA property;
343
344         PropStringGetFunc get;
345         PropStringLengthFunc length;
346         PropStringSetFunc set;
347
348         PropStringGetFuncEx get_ex;
349         PropStringLengthFuncEx length_ex;
350         PropStringSetFuncEx set_ex;
351
352         int maxlength;  /* includes string terminator! */
353
354         const char *defaultvalue;
355 } StringPropertyRNA;
356
357 typedef struct EnumPropertyRNA {
358         PropertyRNA property;
359
360         PropEnumGetFunc get;
361         PropEnumSetFunc set;
362         PropEnumItemFunc itemf;
363
364         PropEnumGetFuncEx get_ex;
365         PropEnumSetFuncEx set_ex;
366         void *py_data; /* store py callback here */
367
368         const EnumPropertyItem *item;
369         int totitem;
370
371         int defaultvalue;
372 } EnumPropertyRNA;
373
374 typedef struct PointerPropertyRNA {
375         PropertyRNA property;
376
377         PropPointerGetFunc get;
378         PropPointerSetFunc set;
379         PropPointerTypeFunc typef;
380         PropPointerPollFunc poll; /* unlike operators, 'set' can still run if poll fails, used for filtering display */
381
382         struct StructRNA *type;
383 } PointerPropertyRNA;
384
385 typedef struct CollectionPropertyRNA {
386         PropertyRNA property;
387
388         PropCollectionBeginFunc begin;
389         PropCollectionNextFunc next;
390         PropCollectionEndFunc end;                                              /* optional */
391         PropCollectionGetFunc get;
392         PropCollectionLengthFunc length;                                /* optional */
393         PropCollectionLookupIntFunc lookupint;                  /* optional */
394         PropCollectionLookupStringFunc lookupstring;    /* optional */
395         PropCollectionAssignIntFunc assignint;                  /* optional */
396
397         struct StructRNA *item_type;                    /* the type of this item */
398 } CollectionPropertyRNA;
399
400
401 /* changes to this struct require updating rna_generate_struct in makesrna.c */
402 struct StructRNA {
403         /* structs are containers of properties */
404         ContainerRNA cont;
405
406         /* unique identifier, keep after 'cont' */
407         const char *identifier;
408
409         /* python type, this is a subtype of pyrna_struct_Type but used so each struct can have its own type
410          * which is useful for subclassing RNA */
411         void *py_type;
412         void *blender_type;
413
414         /* various options */
415         int flag;
416         /* Each StructRNA type can define own tags which properties can set
417          * (PropertyRNA.tags) for changed behavior based on struct-type. */
418         const EnumPropertyItem *prop_tag_defines;
419
420         /* user readable name */
421         const char *name;
422         /* single line description, displayed in the tooltip for example */
423         const char *description;
424         /* context for translation */
425         const char *translation_context;
426         /* icon ID */
427         int icon;
428
429         /* property that defines the name */
430         PropertyRNA *nameproperty;
431
432         /* property to iterate over properties */
433         PropertyRNA *iteratorproperty;
434
435         /* struct this is derivedfrom */
436         struct StructRNA *base;
437
438         /* only use for nested structs, where both the parent and child access
439          * the same C Struct but nesting is used for grouping properties.
440          * The parent property is used so we know NULL checks are not needed,
441          * and that this struct will never exist without its parent */
442         struct StructRNA *nested;
443
444         /* function to give the more specific type */
445         StructRefineFunc refine;
446
447         /* function to find path to this struct in an ID */
448         StructPathFunc path;
449
450         /* function to register/unregister subclasses */
451         StructRegisterFunc reg;
452         StructUnregisterFunc unreg;
453         StructInstanceFunc instance;
454
455         /* callback to get id properties */
456         IDPropertiesFunc idproperties;
457
458         /* functions of this struct */
459         ListBase functions;
460 };
461
462 /* Blender RNA
463  *
464  * Root RNA data structure that lists all struct types. */
465
466 struct BlenderRNA {
467         ListBase structs;
468         /* A map of structs: {StructRNA.identifier -> StructRNA}
469          * These are ensured to have unique names (with STRUCT_PUBLIC_NAMESPACE enabled). */
470         struct GHash *structs_map;
471         /* Needed because types with an empty identifier aren't included in 'structs_map'. */
472         unsigned int  structs_len;
473 };
474
475 #define CONTAINER_RNA_ID(cont) (*(const char **)(((ContainerRNA *)(cont))+1))
476
477 #endif /* __RNA_INTERNAL_TYPES_H__ */