Merge branch 'master' into blender2.8
[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 ID;
39 struct ListBase;
40 struct Menu;
41 struct Panel;
42 struct Scene;
43 struct ScrArea;
44 struct ScrVert;
45 struct SpaceType;
46 struct TransformOrientation;
47 struct View3D;
48 struct bContext;
49 struct bContextDataResult;
50 struct bScreen;
51 struct uiLayout;
52 struct uiList;
53 struct wmKeyConfig;
54 struct wmManipulatorMap;
55 struct wmNotifier;
56 struct wmWindow;
57 struct wmWindowManager;
58 struct WorkSpace;
59 struct GPUFXSettings;
60 struct wmMsgBus;
61 struct ScrAreaMap;
62
63 #include "BLI_compiler_attrs.h"
64
65 #include "RNA_types.h"
66
67 /* spacetype has everything stored to get an editor working, it gets initialized via
68  * ED_spacetypes_init() in editors/space_api/spacetypes.c   */
69 /* an editor in Blender is a combined ScrArea + SpaceType + SpaceData */
70
71 #define BKE_ST_MAXNAME  64
72
73 typedef struct SpaceType {
74         struct SpaceType *next, *prev;
75
76         char name[BKE_ST_MAXNAME];                  /* for menus */
77         int spaceid;                                /* unique space identifier */
78         int iconid;                                 /* icon lookup for menus */
79
80         /* Initial allocation, after this WM will call init() too. Some editors need
81          * area and scene data (e.g. frame range) to set their initial scrolling. */
82         struct SpaceLink *(*new)(const struct ScrArea *sa, const struct Scene *scene);
83         /* not free spacelink itself */
84         void (*free)(struct SpaceLink *sl);
85
86         /* init is to cope with file load, screen (size) changes, check handlers */
87         void (*init)(struct wmWindowManager *wm, struct ScrArea *sa);
88         /* exit is called when the area is hidden or removed */
89         void (*exit)(struct wmWindowManager *wm, struct ScrArea *sa);
90         /* Listeners can react to bContext changes */
91         void (*listener)(struct bScreen *sc, struct ScrArea *sa,
92                          struct wmNotifier *wmn, struct Scene *scene,
93                          struct WorkSpace *workspace);
94
95         /* refresh context, called after filereads, ED_area_tag_refresh() */
96         void (*refresh)(const struct bContext *C, struct ScrArea *sa);
97
98         /* after a spacedata copy, an init should result in exact same situation */
99         struct SpaceLink *(*duplicate)(struct SpaceLink *sl);
100
101         /* register operator types on startup */
102         void (*operatortypes)(void);
103         /* add default items to WM keymap */
104         void (*keymap)(struct wmKeyConfig *keyconf);
105         /* on startup, define dropboxes for spacetype+regions */
106         void (*dropboxes)(void);
107
108         /* initialize manipulator-map-types and manipulator-group-types with the region */
109         void (*manipulators)(void);
110
111         /* return context data */
112         int (*context)(const struct bContext *C, const char *member, struct bContextDataResult *result);
113
114         /* Used when we want to replace an ID by another (or NULL). */
115         void (*id_remap)(struct ScrArea *sa, struct SpaceLink *sl, struct ID *old_id, struct ID *new_id);
116
117         int  (*space_subtype_get)(struct ScrArea *sa);
118         void (*space_subtype_set)(struct ScrArea *sa, int value);
119         void (*space_subtype_item_extend)(struct bContext *C, EnumPropertyItem **item, int *totitem);
120
121         /* region type definitions */
122         ListBase regiontypes;
123
124         /* tool shelf definitions */
125         ListBase toolshelf;
126
127         /* read and write... */
128
129         /* default keymaps to add */
130         int keymapflag;
131
132 } SpaceType;
133
134 /* region types are also defined using spacetypes_init, via a callback */
135
136 typedef struct ARegionType {
137         struct ARegionType *next, *prev;
138
139         int regionid;           /* unique identifier within this space, defines RGN_TYPE_xxxx */
140
141         /* add handlers, stuff you only do once or on area/region type/size changes */
142         void (*init)(struct wmWindowManager *wm, struct ARegion *ar);
143         /* exit is called when the region is hidden or removed */
144         void (*exit)(struct wmWindowManager *wm, struct ARegion *ar);
145         /* draw entirely, view changes should be handled here */
146         void (*draw)(const struct bContext *C, struct ARegion *ar);
147         /* optional, compute button layout before drawing for dynamic size */
148         void (*layout)(const struct bContext *C, struct ARegion *ar);
149         /* snap the size of the region (can be NULL for no snapping). */
150         int (*snap_size)(const struct ARegion *ar, int size, int axis);
151         /* contextual changes should be handled here */
152         void (*listener)(struct bScreen *sc, struct ScrArea *sa, struct ARegion *ar,
153                          struct wmNotifier *wmn, const struct Scene *scene);
154         /* Optional callback to generate subscriptions. */
155         void (*message_subscribe)(
156                 const struct bContext *C,
157                 struct WorkSpace *workspace, struct Scene *scene,
158                 struct bScreen *sc, struct ScrArea *sa, struct ARegion *ar,
159                 struct wmMsgBus *mbus);
160
161         void (*free)(struct ARegion *);
162
163         /* split region, copy data optionally */
164         void *(*duplicate)(void *poin);
165
166
167         /* register operator types on startup */
168         void (*operatortypes)(void);
169         /* add own items to keymap */
170         void (*keymap)(struct wmKeyConfig *keyconf);
171         /* allows default cursor per region */
172         void (*cursor)(struct wmWindow *win, struct ScrArea *sa, struct ARegion *ar);
173
174         /* return context data */
175         int (*context)(const struct bContext *C, const char *member, struct bContextDataResult *result);
176
177         /* custom drawing callbacks */
178         ListBase drawcalls;
179
180         /* panels type definitions */
181         ListBase paneltypes;
182
183         /* header type definitions */
184         ListBase headertypes;
185
186         /* hardcoded constraints, smaller than these values region is not visible */
187         int minsizex, minsizey;
188         /* when new region opens (region prefsizex/y are zero then */
189         int prefsizex, prefsizey;
190         /* default keymaps to add */
191         int keymapflag;
192         /* return without drawing. lock is set by region definition, and copied to do_lock by render. can become flag */
193         short do_lock, lock;
194         /* call cursor function on each move event */
195         short event_cursor;
196 } ARegionType;
197
198 /* panel types */
199
200 typedef struct PanelType {
201         struct PanelType *next, *prev;
202
203         char idname[BKE_ST_MAXNAME];              /* unique name */
204         char label[BKE_ST_MAXNAME];               /* for panel header */
205         char translation_context[BKE_ST_MAXNAME];
206         char context[BKE_ST_MAXNAME];             /* for buttons window */
207         char category[BKE_ST_MAXNAME];            /* for category tabs */
208         char owner_id[BKE_ST_MAXNAME];            /* for work-spaces to selectively show. */
209         char parent_id[BKE_ST_MAXNAME];           /* parent idname for subpanels */
210         int space_type;
211         int region_type;
212
213         int flag;
214
215         /* verify if the panel should draw or not */
216         int (*poll)(const struct bContext *C, struct PanelType *pt);
217         /* draw header (optional) */
218         void (*draw_header)(const struct bContext *C, struct Panel *pa);
219         /* draw entirely, view changes should be handled here */
220         void (*draw)(const struct bContext *C, struct Panel *pa);
221
222         /* sub panels */
223         struct PanelType *parent;
224         ListBase children;
225
226         /* RNA integration */
227         ExtensionRNA ext;
228 } PanelType;
229
230 /* uilist types */
231
232 /* Draw an item in the uiList */
233 typedef void (*uiListDrawItemFunc)(
234         struct uiList *ui_list, struct bContext *C, struct uiLayout *layout, struct PointerRNA *dataptr,
235         struct PointerRNA *itemptr, int icon, struct PointerRNA *active_dataptr, const char *active_propname,
236         int index, int flt_flag);
237
238 /* Draw the filtering part of an uiList */
239 typedef void (*uiListDrawFilterFunc)(
240         struct uiList *ui_list, struct bContext *C, struct uiLayout *layout);
241
242 /* Filter items of an uiList */
243 typedef void (*uiListFilterItemsFunc)(
244         struct uiList *ui_list, struct bContext *C, struct PointerRNA *, const char *propname);
245
246 typedef struct uiListType {
247         struct uiListType *next, *prev;
248
249         char idname[BKE_ST_MAXNAME];            /* unique name */
250
251         uiListDrawItemFunc draw_item;
252         uiListDrawFilterFunc draw_filter;
253         uiListFilterItemsFunc filter_items;
254
255         /* RNA integration */
256         ExtensionRNA ext;
257 } uiListType;
258
259 /* header types */
260
261 typedef struct HeaderType {
262         struct HeaderType *next, *prev;
263
264         char idname[BKE_ST_MAXNAME];        /* unique name */
265         int space_type;
266         int region_type;
267
268         /* draw entirely, view changes should be handled here */
269         void (*draw)(const struct bContext *C, struct Header *header);
270
271         /* RNA integration */
272         ExtensionRNA ext;
273 } HeaderType;
274
275 typedef struct Header {
276         struct HeaderType *type;    /* runtime */
277         struct uiLayout *layout;    /* runtime for drawing */
278 } Header;
279
280
281 /* menu types */
282
283 typedef struct MenuType {
284         struct MenuType *next, *prev;
285
286         char idname[BKE_ST_MAXNAME];        /* unique name */
287         char label[BKE_ST_MAXNAME];         /* for button text */
288         char translation_context[BKE_ST_MAXNAME];
289         char owner_id[BKE_ST_MAXNAME];  /* optional, see: #wmOwnerID */
290         const char *description;
291
292         /* verify if the menu should draw or not */
293         int (*poll)(const struct bContext *C, struct MenuType *mt);
294         /* draw entirely, view changes should be handled here */
295         void (*draw)(const struct bContext *C, struct Menu *menu);
296
297         /* RNA integration */
298         ExtensionRNA ext;
299 } MenuType;
300
301 typedef struct Menu {
302         struct MenuType *type;      /* runtime */
303         struct uiLayout *layout;    /* runtime for drawing */
304 } Menu;
305
306 /* spacetypes */
307 struct SpaceType *BKE_spacetype_from_id(int spaceid);
308 struct ARegionType *BKE_regiontype_from_id_or_first(struct SpaceType *st, int regionid);
309 struct ARegionType *BKE_regiontype_from_id(struct SpaceType *st, int regionid);
310 const struct ListBase *BKE_spacetypes_list(void);
311 void BKE_spacetype_register(struct SpaceType *st);
312 bool BKE_spacetype_exists(int spaceid);
313 void BKE_spacetypes_free(void); /* only for quitting blender */
314
315 /* spacedata */
316 void BKE_spacedata_freelist(ListBase *lb);
317 void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
318 void BKE_spacedata_draw_locks(int set);
319
320 void BKE_spacedata_callback_id_remap_set(
321         void (*func)(struct ScrArea *sa, struct SpaceLink *sl, struct ID *old_id, struct ID *new_id));
322 void BKE_spacedata_id_unref(struct ScrArea *sa, struct SpaceLink *sl, struct ID *id);
323
324 /* area/regions */
325 struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
326 void            BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
327 void            BKE_screen_area_free(struct ScrArea *sa);
328 /* Manipulator-maps of a region need to be freed with the region. Uses callback to avoid low-level call. */
329 void BKE_region_callback_free_manipulatormap_set(void (*callback)(struct wmManipulatorMap *));
330 void BKE_region_callback_refresh_tag_manipulatormap_set(void (*callback)(struct wmManipulatorMap *));
331
332 struct ARegion *BKE_area_find_region_type(struct ScrArea *sa, int type);
333 struct ARegion *BKE_area_find_region_active_win(struct ScrArea *sa);
334 struct ARegion *BKE_area_find_region_xy(struct ScrArea *sa, const int regiontype, int x, int y);
335 struct ScrArea *BKE_screen_find_area_from_space(struct bScreen *sc, struct SpaceLink *sl) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1, 2);
336 struct ScrArea *BKE_screen_find_big_area(struct bScreen *sc, const int spacetype, const short min);
337 struct ScrArea *BKE_screen_find_area_xy(struct bScreen *sc, const int spacetype, int x, int y);
338
339 unsigned int BKE_screen_view3d_layer_active_ex(
340         const struct View3D *v3d, const struct Scene *scene, bool use_localvd) ATTR_NONNULL(2);
341 unsigned int BKE_screen_view3d_layer_active(
342         const struct View3D *v3d, const struct Scene *scene) ATTR_NONNULL(2);
343
344 unsigned int BKE_screen_view3d_layer_all(const struct bScreen *sc) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
345
346 void BKE_screen_manipulator_tag_refresh(struct bScreen *sc);
347
348 void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene);
349 void BKE_screen_view3d_scene_sync(struct bScreen *sc, struct Scene *scene);
350 bool BKE_screen_is_fullscreen_area(const struct bScreen *screen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
351 bool BKE_screen_is_used(const struct bScreen *screen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
352
353 /* zoom factor conversion */
354 float BKE_screen_view3d_zoom_to_fac(float camzoom);
355 float BKE_screen_view3d_zoom_from_fac(float zoomfac);
356
357 /* screen */
358 void BKE_screen_free(struct bScreen *sc);
359 void BKE_screen_area_map_free(struct ScrAreaMap *area_map) ATTR_NONNULL();
360 unsigned int BKE_screen_visible_layers(struct bScreen *screen, struct Scene *scene);
361
362 struct ScrEdge *BKE_screen_find_edge(struct bScreen *sc, struct ScrVert *v1, struct ScrVert *v2);
363 void BKE_screen_sort_scrvert(struct ScrVert **v1, struct ScrVert **v2);
364 void BKE_screen_remove_double_scrverts(struct bScreen *sc);
365 void BKE_screen_remove_double_scredges(struct bScreen *sc);
366 void BKE_screen_remove_unused_scredges(struct bScreen *sc);
367 void BKE_screen_remove_unused_scrverts(struct bScreen *sc);
368
369 #endif