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