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