Preferences: remove author field
[blender.git] / source / blender / makesdna / DNA_workspace_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  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 /** \file DNA_workspace_types.h
22  *  \ingroup DNA
23  *
24  * Use API in BKE_workspace.h!
25  * Struct members marked with DNA_PRIVATE_WORKSPACE will throw a
26  * warning saying it's deprecated when used outside of workspace.c.
27  */
28
29 #ifndef __DNA_WORKSPACE_TYPES_H__
30 #define __DNA_WORKSPACE_TYPES_H__
31
32 #include "DNA_scene_types.h"
33
34 /* Same logic as DNA_DEPRECATED_ALLOW, but throws 'deprecated'
35  * warnings if DNA_PRIVATE_WORKSPACE_ALLOW is not defined */
36 #ifdef DNA_PRIVATE_WORKSPACE_ALLOW
37    /* allow use of private items */
38 #  define DNA_PRIVATE_WORKSPACE
39 #else
40 #  ifndef DNA_PRIVATE_WORKSPACE
41 #    define DNA_PRIVATE_WORKSPACE DNA_PRIVATE_ATTR
42 #  endif
43 #endif
44
45 #ifdef DNA_PRIVATE_READ_WRITE_ALLOW
46 #  define DNA_PRIVATE_WORKSPACE_READ_WRITE
47 #else
48 #  ifndef DNA_PRIVATE_WORKSPACE_READ_WRITE
49 #    define DNA_PRIVATE_WORKSPACE_READ_WRITE DNA_PRIVATE_WORKSPACE
50 #  endif
51 #endif
52
53 /* Currently testing, allow to disable. */
54 #define USE_WORKSPACE_TOOL
55
56 #
57 #
58 typedef struct bToolRef_Runtime {
59         int cursor;
60
61         /** One of these 3 must be defined. */
62         char keymap[64];
63         char gizmo_group[64];
64         char data_block[64];
65
66         /** Use to infer primary operator to use when setting accelerator keys. */
67         char op[64];
68
69         /** Index when a tool is a member of a group. */
70         int index;
71 } bToolRef_Runtime;
72
73
74 /* Stored per mode. */
75 typedef struct bToolRef {
76         struct bToolRef *next, *prev;
77         char idname[64];
78
79         /** Use to avoid initializing the same tool multiple times. */
80         short tag;
81
82         /** #bToolKey (spacetype, mode), used in 'WM_api.h' */
83         short space_type;
84         /**
85          * Value depends ont the 'space_type', object mode for 3D view, image editor has own mode too.
86          * RNA needs to handle using item function.
87          */
88         int mode;
89
90         /**
91          * Use for tool options, each group's name must match a tool name:
92          *
93          *    {"Tool Name": {"SOME_OT_operator": {...}, ..}, ..}
94          *
95          * This is done since different tools may call the same operators with their own options.
96          */
97         IDProperty *properties;
98
99         /** Variables needed to operate the tool. */
100         bToolRef_Runtime *runtime;
101 } bToolRef;
102
103
104 /**
105  * \brief Wrapper for bScreen.
106  *
107  * bScreens are IDs and thus stored in a main list-base. We also want to store a list-base of them within the
108  * workspace (so each workspace can have its own set of screen-layouts) which would mess with the next/prev pointers.
109  * So we use this struct to wrap a bScreen pointer with another pair of next/prev pointers.
110  */
111 typedef struct WorkSpaceLayout {
112         struct WorkSpaceLayout *next, *prev;
113
114         struct bScreen *screen;
115         /* The name of this layout, we override the RNA name of the screen with this (but not ID name itself) */
116         /** MAX_NAME. */
117         char name[64] DNA_PRIVATE_WORKSPACE;
118 } WorkSpaceLayout;
119
120 /** Optional tags, which features to use, aligned with #bAddon names by convention. */
121 typedef struct wmOwnerID {
122         struct wmOwnerID *next, *prev;
123         /** MAX_NAME. */
124         char name[64] DNA_PRIVATE_WORKSPACE;
125 } wmOwnerID;
126
127 typedef struct WorkSpace {
128         ID id;
129
130         /** WorkSpaceLayout. */
131         ListBase layouts DNA_PRIVATE_WORKSPACE;
132         /* Store for each hook (so for each window) which layout has
133          * been activated the last time this workspace was visible. */
134         /** WorkSpaceDataRelation. */
135         ListBase hook_layout_relations DNA_PRIVATE_WORKSPACE_READ_WRITE;
136
137         /* Feature tagging (use for addons) */
138         /** #wmOwnerID. */
139         ListBase owner_ids DNA_PRIVATE_WORKSPACE_READ_WRITE;
140
141         /* should be: '#ifdef USE_WORKSPACE_TOOL'. */
142
143         /** List of #bToolRef */
144         ListBase tools;
145
146         /**
147          * BAD DESIGN WARNING:
148          * This is a workaround for the topbar not knowing which tools spac */
149         char tools_space_type;
150         /** Type is different for each space-type. */
151         char tools_mode;
152         char _pad[2];
153
154         int object_mode;
155
156         /** Enum eWorkSpaceFlags. */
157         int flags DNA_PRIVATE_WORKSPACE;
158
159         /* Number for workspace tab reordering in the UI. */
160         int order;
161
162         /* Info text from modal operators (runtime). */
163         char *status_text;
164 } WorkSpace;
165
166 /* internal struct, but exported for read/write */
167 #if defined(DNA_PRIVATE_READ_WRITE_ALLOW) || defined(DNA_PRIVATE_WORKSPACE_ALLOW)
168
169 /**
170  * Generic (and simple/primitive) struct for storing a history of assignments/relations
171  * of workspace data to non-workspace data in a listbase inside the workspace.
172  *
173  * Using this we can restore the old state of a workspace if the user switches back to it.
174  *
175  * Usage
176  * =====
177  * When activating a workspace, it should activate the screen-layout that was active in that
178  * workspace before *in this window*.
179  * More concretely:
180  * * There are two windows, win1 and win2.
181  * * Both show workspace ws1, but both also had workspace ws2 activated at some point before.
182  * * Last time ws2 was active in win1, screen-layout sl1 was activated.
183  * * Last time ws2 was active in win2, screen-layout sl2 was activated.
184  * * When changing from ws1 to ws2 in win1, screen-layout sl1 should be activated again.
185  * * When changing from ws1 to ws2 in win2, screen-layout sl2 should be activated again.
186  * So that means we have to store the active screen-layout in a per workspace, per window
187  * relation. This struct is used to store an active screen-layout for each window within the
188  * workspace.
189  * To find the screen-layout to activate for this window-workspace combination, simply lookup
190  * the WorkSpaceDataRelation with the workspace-hook of the window set as parent.
191  */
192 typedef struct WorkSpaceDataRelation {
193         struct WorkSpaceDataRelation *next, *prev;
194
195         /* the data used to identify the relation (e.g. to find screen-layout (= value) from/for a hook) */
196         void *parent;
197         /* The value for this parent-data/workspace relation */
198         void *value;
199 } WorkSpaceDataRelation;
200
201 #endif /* DNA_PRIVATE_WORKSPACE_READ_WRITE */
202
203 /**
204  * Little wrapper to store data that is going to be per window, but coming from the workspace.
205  * It allows us to keep workspace and window data completely separate.
206  */
207 typedef struct WorkSpaceInstanceHook {
208         WorkSpace *active DNA_PRIVATE_WORKSPACE;
209         struct WorkSpaceLayout *act_layout DNA_PRIVATE_WORKSPACE;
210
211         /* Needed because we can't change workspaces/layouts in running handler loop, it would break context. */
212         WorkSpace *temp_workspace_store;
213         struct WorkSpaceLayout *temp_layout_store;
214 } WorkSpaceInstanceHook;
215
216 typedef enum eWorkSpaceFlags {
217         WORKSPACE_USE_FILTER_BY_ORIGIN = (1 << 1),
218 } eWorkSpaceFlags;
219
220 #endif /* __DNA_WORKSPACE_TYPES_H__ */