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