Merge branch 'master' into blender2.8
[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
33 /* Same logic as DNA_DEPRECATED_ALLOW, but throws 'deprecated'
34  * warnings if DNA_PRIVATE_WORKSPACE_ALLOW is not defined */
35 #ifdef DNA_PRIVATE_WORKSPACE_ALLOW
36    /* allow use of private items */
37 #  define DNA_PRIVATE_WORKSPACE
38 #else
39 #  ifndef DNA_PRIVATE_WORKSPACE
40 #    define DNA_PRIVATE_WORKSPACE DNA_PRIVATE_ATTR
41 #  endif
42 #endif
43
44 #ifdef DNA_PRIVATE_READ_WRITE_ALLOW
45 #  define DNA_PRIVATE_WORKSPACE_READ_WRITE
46 #else
47 #  ifndef DNA_PRIVATE_WORKSPACE_READ_WRITE
48 #    define DNA_PRIVATE_WORKSPACE_READ_WRITE DNA_PRIVATE_WORKSPACE
49 #  endif
50 #endif
51
52
53 /**
54  * \brief Wrapper for bScreen.
55  *
56  * bScreens are IDs and thus stored in a main list-base. We also want to store a list-base of them within the
57  * workspace (so each workspace can have its own set of screen-layouts) which would mess with the next/prev pointers.
58  * So we use this struct to wrap a bScreen pointer with another pair of next/prev pointers.
59  */
60 typedef struct WorkSpaceLayout {
61         struct WorkSpaceLayout *next, *prev;
62
63         struct bScreen *screen DNA_PRIVATE_WORKSPACE;
64         /* The name of this layout, we override the RNA name of the screen with this (but not ID name itself) */
65         char name[64] DNA_PRIVATE_WORKSPACE; /* MAX_NAME */
66 } WorkSpaceLayout;
67
68 typedef struct WorkSpace {
69         ID id;
70
71         ListBase layouts DNA_PRIVATE_WORKSPACE; /* WorkSpaceLayout */
72         /* Store for each hook (so for each window) which layout has
73          * been activated the last time this workspace was visible. */
74         ListBase hook_layout_relations DNA_PRIVATE_WORKSPACE_READ_WRITE; /* WorkSpaceDataRelation */
75
76         /* Custom transform orientations */
77         ListBase transform_orientations DNA_PRIVATE_WORKSPACE;
78
79         int object_mode DNA_PRIVATE_WORKSPACE; /* enum ObjectMode */
80         int pad;
81
82         struct SceneLayer *render_layer DNA_PRIVATE_WORKSPACE;
83 } WorkSpace;
84
85 /* internal struct, but exported for read/write */
86 #if defined(DNA_PRIVATE_READ_WRITE_ALLOW) || defined(DNA_PRIVATE_WORKSPACE_ALLOW)
87
88 /**
89  * Generic (and simple/primitive) struct for storing a history of assignments/relations
90  * of workspace data to non-workspace data in a listbase inside the workspace.
91  *
92  * Using this we can restore the old state of a workspace if the user switches back to it.
93  *
94  * Usage
95  * =====
96  * When activating a workspace, it should activate the screen-layout that was active in that
97  * workspace before *in this window*.
98  * More concretely:
99  * * There are two windows, win1 and win2.
100  * * Both show workspace ws1, but both also had workspace ws2 activated at some point before.
101  * * Last time ws2 was active in win1, screen-layout sl1 was activated.
102  * * Last time ws2 was active in win2, screen-layout sl2 was activated.
103  * * When changing from ws1 to ws2 in win1, screen-layout sl1 should be activated again.
104  * * When changing from ws1 to ws2 in win2, screen-layout sl2 should be activated again.
105  * So that means we have to store the active screen-layout in a per workspace, per window
106  * relation. This struct is used to store an active screen-layout for each window within the
107  * workspace.
108  * To find the screen-layout to activate for this window-workspace combination, simply lookup
109  * the WorkSpaceDataRelation with the workspace-hook of the window set as parent.
110  */
111 typedef struct WorkSpaceDataRelation {
112         struct WorkSpaceDataRelation *next, *prev;
113
114         /* the data used to identify the relation (e.g. to find screen-layout (= value) from/for a hook) */
115         void *parent;
116         /* The value for this parent-data/workspace relation */
117         void *value;
118 } WorkSpaceDataRelation;
119
120 #endif /* DNA_PRIVATE_WORKSPACE_READ_WRITE */
121
122 /**
123  * Little wrapper to store data that is going to be per window, but comming from the workspace.
124  * It allows us to keep workspace and window data completely separate.
125  */
126 typedef struct WorkSpaceInstanceHook {
127         WorkSpace *active DNA_PRIVATE_WORKSPACE;
128         struct WorkSpaceLayout *act_layout DNA_PRIVATE_WORKSPACE;
129
130         /* Needed because we can't change workspaces/layouts in running handler loop, it would break context. */
131         WorkSpace *temp_workspace_store;
132         struct WorkSpaceLayout *temp_layout_store;
133 } WorkSpaceInstanceHook;
134
135 #endif /* __DNA_WORKSPACE_TYPES_H__ */