Initial step for IDTypeInfo refactor 'cleanup' project.
[blender.git] / source / blender / blenkernel / BKE_idtype.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  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 #ifndef __BKE_IDTYPE_H__
21 #define __BKE_IDTYPE_H__
22
23 /** \file
24  * \ingroup bke
25  *
26  * ID type structure, helping to factorize common operations and data for all data-block types.
27  */
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 struct ID;
34 struct Main;
35
36 /** IDTypeInfo.flags. */
37 enum {
38   /** Indicates that the given IDType does not support copying. */
39   IDTYPE_FLAGS_NO_COPY = 1 << 0,
40   /** Indicates that the given IDType does not support linking/appending from a library file. */
41   IDTYPE_FLAGS_NO_LIBLINKING = 1 << 1,
42   /** Indicates that the given IDType does not support making a library-linked ID local. */
43   IDTYPE_FLAGS_NO_MAKELOCAL = 1 << 2,
44 };
45
46 /* ********** Prototypes for IDTypeInfo callbacks. ********** */
47
48 typedef void (*IDTypeInitDataFunction)(struct ID *id);
49
50 /** \param flag: Copying options (see BKE_lib_id.h's LIB_ID_COPY_... flags for more). */
51 typedef void (*IDTypeCopyDataFunction)(struct Main *bmain,
52                                        struct ID *id_dst,
53                                        const struct ID *id_src,
54                                        const int flag);
55
56 typedef void (*IDTypeFreeDataFunction)(struct ID *id);
57
58 /** \param flag: See BKE_lib_id.h's LIB_ID_MAKELOCAL_... flags. */
59 typedef void (*IDTypeMakeLocalFunction)(struct Main *bmain, struct ID *id, const int flags);
60
61 typedef struct IDTypeInfo {
62   /* ********** General IDType data. ********** */
63
64   /**
65    * Unique identifier of this type, either as a short or an array of two chars, see DNA_ID.h's
66    * ID_XX enums.
67    */
68   short id_code;
69   /**
70    * Bitflag matching id_code, used for filtering (e.g. in file browser), see DNA_ID.h's
71    * FILTER_ID_XX enums.
72    */
73   int id_filter;
74
75   /**
76    * Define the position of this data-block type in the virtual list of all data in a Main that is
77    * returned by `set_listbasepointers()`.
78    * Very important, this has to be unique and below INDEX_ID_MAX, see DNA_ID.h.
79    */
80   short main_listbase_index;
81
82   /** Memory size of a data-block of that type. */
83   size_t struct_size;
84
85   /** The user visible name for this data-block, also used as default name for a new data-block. */
86   const char *name;
87   /** Plural version of the user-visble name. */
88   const char *name_plural;
89   /** Translation context to use for UI messages related to that type of data-block. */
90   const char *translation_context;
91
92   /** Generic info flags about that data-block type. */
93   int flags;
94
95   /* ********** ID management callbacks ********** */
96
97   /* TODO: Note about callbacks: Ideally we could also handle here `BKE_lib_query`'s behavior, as
98    * well as read/write of files. However, this is a bit more involved than basic ID management
99    * callbacks, so we'll check on this later. */
100
101   /**
102    * Initialize a new, empty calloc'ed data-block. May be NULL if there is nothing to do.
103    */
104   IDTypeInitDataFunction init_data;
105
106   /**
107    * Copy the given data-block's data from source to destination. May be NULL if mere memcopy of
108    * the ID struct itself is enough.
109    */
110   IDTypeCopyDataFunction copy_data;
111
112   /**
113    * Free the data of the data-block (NOT the ID itself). May be NULL if there is nothing to do.
114    */
115   IDTypeFreeDataFunction free_data;
116
117   /**
118    * Make a linked data-block local. May be NULL if default behavior from
119    * `BKE_lib_id_make_local_generic()` is enough.
120    */
121   IDTypeMakeLocalFunction make_local;
122 } IDTypeInfo;
123
124 /* ********** Declaration of each IDTypeInfo. ********** */
125
126 /* Those are defined in the respective BKE files. */
127 extern IDTypeInfo IDType_ID_OB;
128
129 /* ********** Helpers/Utils API. ********** */
130
131 /* Module initialization. */
132 void BKE_idtype_init(void);
133
134 /* General helpers. */
135 const struct IDTypeInfo *BKE_idtype_get_info_from_idcode(const short id_code);
136 const struct IDTypeInfo *BKE_idtype_get_info_from_id(const struct ID *id);
137
138 #ifdef __cplusplus
139 }
140 #endif
141
142 #endif /* __BKE_IDTYPE_H__ */