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