Revert to master - those changes are globally valid, but remain incomplete,
[blender.git] / source / blender / blenkernel / BKE_screen.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  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27 #ifndef __BKE_SCREEN_H__
28 #define __BKE_SCREEN_H__
29
30 /** \file BKE_screen.h
31  *  \ingroup bke
32  *  \since March 2001
33  *  \author nzc
34  */
35
36 struct ARegion;
37 struct Header;
38 struct ListBase;
39 struct Menu;
40 struct Panel;
41 struct Scene;
42 struct ScrArea;
43 struct SpaceType;
44 struct View3D;
45 struct bContext;
46 struct bContextDataResult;
47 struct bScreen;
48 struct uiLayout;
49 struct uiList;
50 struct wmKeyConfig;
51 struct wmNotifier;
52 struct wmWindow;
53 struct wmWindowManager;
54 struct GPUFXSettings;
55
56 #include "BLI_compiler_attrs.h"
57
58 #include "RNA_types.h"
59
60 /* spacetype has everything stored to get an editor working, it gets initialized via 
61  * ED_spacetypes_init() in editors/space_api/spacetypes.c   */
62 /* an editor in Blender is a combined ScrArea + SpaceType + SpaceData */
63
64 #define BKE_ST_MAXNAME  64
65
66 typedef struct SpaceType {
67         struct SpaceType *next, *prev;
68         
69         char name[BKE_ST_MAXNAME];                  /* for menus */
70         int spaceid;                                /* unique space identifier */
71         int iconid;                                 /* icon lookup for menus */
72         
73         /* initial allocation, after this WM will call init() too */
74         struct SpaceLink    *(*new)(const struct bContext *C);
75         /* not free spacelink itself */
76         void (*free)(struct SpaceLink *);
77         
78         /* init is to cope with file load, screen (size) changes, check handlers */
79         void (*init)(struct wmWindowManager *, struct ScrArea *);
80         /* exit is called when the area is hidden or removed */
81         void (*exit)(struct wmWindowManager *, struct ScrArea *);
82         /* Listeners can react to bContext changes */
83         void (*listener)(struct bScreen *sc, struct ScrArea *, struct wmNotifier *);
84         
85         /* refresh context, called after filereads, ED_area_tag_refresh() */
86         void (*refresh)(const struct bContext *, struct ScrArea *);
87         
88         /* after a spacedata copy, an init should result in exact same situation */
89         struct SpaceLink    *(*duplicate)(struct SpaceLink *);
90
91         /* register operator types on startup */
92         void (*operatortypes)(void);
93         /* add default items to WM keymap */
94         void (*keymap)(struct wmKeyConfig *);
95         /* on startup, define dropboxes for spacetype+regions */
96         void (*dropboxes)(void);
97
98         /* return context data */
99         int (*context)(const struct bContext *, const char *, struct bContextDataResult *);
100
101         /* region type definitions */
102         ListBase regiontypes;
103         
104         /* tool shelf definitions */
105         ListBase toolshelf;
106                 
107         /* read and write... */
108         
109         /* default keymaps to add */
110         int keymapflag;
111         
112 } SpaceType;
113
114 /* region types are also defined using spacetypes_init, via a callback */
115
116 typedef struct ARegionType {
117         struct ARegionType *next, *prev;
118         
119         int regionid;           /* unique identifier within this space, defines RGN_TYPE_xxxx */
120         
121         /* add handlers, stuff you only do once or on area/region type/size changes */
122         void (*init)(struct wmWindowManager *, struct ARegion *);
123         /* exit is called when the region is hidden or removed */
124         void (*exit)(struct wmWindowManager *, struct ARegion *);
125         /* draw entirely, view changes should be handled here */
126         void (*draw)(const struct bContext *, struct ARegion *);
127         /* contextual changes should be handled here */
128         void (*listener)(struct bScreen *sc, struct ScrArea *, struct ARegion *, struct wmNotifier *);
129         
130         void (*free)(struct ARegion *);
131
132         /* split region, copy data optionally */
133         void        *(*duplicate)(void *);
134
135         
136         /* register operator types on startup */
137         void (*operatortypes)(void);
138         /* add own items to keymap */
139         void (*keymap)(struct wmKeyConfig *);
140         /* allows default cursor per region */
141         void (*cursor)(struct wmWindow *, struct ScrArea *, struct ARegion *ar);
142
143         /* return context data */
144         int (*context)(const struct bContext *, const char *, struct bContextDataResult *);
145
146         /* custom drawing callbacks */
147         ListBase drawcalls;
148
149         /* panels type definitions */
150         ListBase paneltypes;
151
152         /* header type definitions */
153         ListBase headertypes;
154         
155         /* hardcoded constraints, smaller than these values region is not visible */
156         int minsizex, minsizey;
157         /* when new region opens (region prefsizex/y are zero then */
158         int prefsizex, prefsizey;
159         /* default keymaps to add */
160         int keymapflag;
161         /* return without drawing. lock is set by region definition, and copied to do_lock by render. can become flag */
162         short do_lock, lock;
163         /* call cursor function on each move event */
164         short event_cursor;
165 } ARegionType;
166
167 /* panel types */
168
169 typedef struct PanelType {
170         struct PanelType *next, *prev;
171         
172         char idname[BKE_ST_MAXNAME];              /* unique name */
173         char label[BKE_ST_MAXNAME];               /* for panel header */
174         char translation_context[BKE_ST_MAXNAME];
175         char context[BKE_ST_MAXNAME];             /* for buttons window */
176         char category[BKE_ST_MAXNAME];            /* for category tabs */
177         int space_type;
178         int region_type;
179
180         int flag;
181
182         /* verify if the panel should draw or not */
183         int (*poll)(const struct bContext *, struct PanelType *);
184         /* draw header (optional) */
185         void (*draw_header)(const struct bContext *, struct Panel *);
186         /* draw entirely, view changes should be handled here */
187         void (*draw)(const struct bContext *, struct Panel *);
188
189         /* RNA integration */
190         ExtensionRNA ext;
191 } PanelType;
192
193 /* uilist types */
194
195 /* Draw an item in the uiList */
196 typedef void (*uiListDrawItemFunc)(struct uiList *, struct bContext *, struct uiLayout *, struct PointerRNA *,
197                                    struct PointerRNA *, int, struct PointerRNA *, const char *, int, int);
198
199 /* Draw the filtering part of an uiList */
200 typedef void (*uiListDrawFilterFunc)(struct uiList *, struct bContext *, struct uiLayout *);
201
202 /* Filter items of an uiList */
203 typedef void (*uiListFilterItemsFunc)(struct uiList *, struct bContext *, struct PointerRNA *, const char *);
204
205 typedef struct uiListType {
206         struct uiListType *next, *prev;
207
208         char idname[BKE_ST_MAXNAME];            /* unique name */
209
210         uiListDrawItemFunc draw_item;
211         uiListDrawFilterFunc draw_filter;
212         uiListFilterItemsFunc filter_items;
213
214         /* RNA integration */
215         ExtensionRNA ext;
216 } uiListType;
217
218 /* header types */
219
220 typedef struct HeaderType {
221         struct HeaderType *next, *prev;
222
223         char idname[BKE_ST_MAXNAME];        /* unique name */
224         int space_type;
225
226         /* draw entirely, view changes should be handled here */
227         void (*draw)(const struct bContext *, struct Header *);
228
229         /* RNA integration */
230         ExtensionRNA ext;
231 } HeaderType;
232
233 typedef struct Header {
234         struct HeaderType *type;    /* runtime */
235         struct uiLayout *layout;    /* runtime for drawing */
236 } Header;
237
238
239 /* menu types */
240
241 typedef struct MenuType {
242         struct MenuType *next, *prev;
243
244         char idname[BKE_ST_MAXNAME];        /* unique name */
245         char label[BKE_ST_MAXNAME];         /* for button text */
246         char translation_context[BKE_ST_MAXNAME];
247         const char *description;
248
249         /* verify if the menu should draw or not */
250         int (*poll)(const struct bContext *, struct MenuType *);
251         /* draw entirely, view changes should be handled here */
252         void (*draw)(const struct bContext *, struct Menu *);
253
254         /* RNA integration */
255         ExtensionRNA ext;
256 } MenuType;
257
258 typedef struct Menu {
259         struct MenuType *type;      /* runtime */
260         struct uiLayout *layout;    /* runtime for drawing */
261 } Menu;
262
263 /* spacetypes */
264 struct SpaceType *BKE_spacetype_from_id(int spaceid);
265 struct ARegionType *BKE_regiontype_from_id(struct SpaceType *st, int regionid);
266 const struct ListBase *BKE_spacetypes_list(void);
267 void BKE_spacetype_register(struct SpaceType *st);
268 bool BKE_spacetype_exists(int spaceid);
269 void BKE_spacetypes_free(void); /* only for quitting blender */
270
271 /* spacedata */
272 void BKE_spacedata_freelist(ListBase *lb);
273 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
274 void BKE_spacedata_draw_locks(int set);
275
276 void BKE_spacedata_callback_id_unref_set(void (*func)(struct SpaceLink *sl, const struct ID *));
277 void BKE_spacedata_id_unref(struct SpaceLink *sl, const struct ID *id);
278
279 /* area/regions */
280 struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
281 void            BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
282 void            BKE_screen_area_free(struct ScrArea *sa);
283
284 struct ARegion *BKE_area_find_region_type(struct ScrArea *sa, int type);
285 struct ARegion *BKE_area_find_region_active_win(struct ScrArea *sa);
286 struct ARegion *BKE_area_find_region_xy(struct ScrArea *sa, const int regiontype, int x, int y);
287 struct ScrArea *BKE_screen_find_area_from_space(struct bScreen *sc, struct SpaceLink *sl) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
288 struct ScrArea *BKE_screen_find_big_area(struct bScreen *sc, const int spacetype, const short min);
289 struct ScrArea *BKE_screen_find_area_xy(struct bScreen *sc, const int spacetype, int x, int y);
290
291 unsigned int BKE_screen_view3d_layer_active_ex(
292         const struct View3D *v3d, const struct Scene *scene, bool use_localvd) ATTR_NONNULL(2);
293 unsigned int BKE_screen_view3d_layer_active(
294         const struct View3D *v3d, const struct Scene *scene) ATTR_NONNULL(2);
295
296 unsigned int BKE_screen_view3d_layer_all(const struct bScreen *sc) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
297
298 void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene);
299 void BKE_screen_view3d_scene_sync(struct bScreen *sc);
300 void BKE_screen_view3d_main_sync(ListBase *screen_lb, struct Scene *scene);
301 void BKE_screen_view3d_twmode_remove(struct View3D *v3d, const int i);
302 void BKE_screen_view3d_main_twmode_remove(ListBase *screen_lb, struct Scene *scene, const int i);
303 void BKE_screen_gpu_fx_validate(struct GPUFXSettings *fx_settings);
304
305 /* zoom factor conversion */
306 float BKE_screen_view3d_zoom_to_fac(float camzoom);
307 float BKE_screen_view3d_zoom_from_fac(float zoomfac);
308
309 /* screen */
310 void BKE_screen_free(struct bScreen *sc); 
311 unsigned int BKE_screen_visible_layers(struct bScreen *screen, struct Scene *scene);
312
313 #endif
314