Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesdna / DNA_screen_types.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  * Contributor(s): Blender Foundation
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  */
25
26 /** \file DNA_screen_types.h
27  *  \ingroup DNA
28  */
29
30 #ifndef __DNA_SCREEN_TYPES_H__
31 #define __DNA_SCREEN_TYPES_H__
32
33 #include "DNA_defs.h"
34 #include "DNA_listBase.h"
35 #include "DNA_view2d_types.h"
36 #include "DNA_vec_types.h"
37
38 #include "DNA_ID.h"
39
40 struct SpaceType;
41 struct SpaceLink;
42 struct ARegion;
43 struct ARegionType;
44 struct PanelType;
45 struct Scene;
46 struct uiLayout;
47 struct wmTimer;
48 struct wmTooltipState;
49
50
51 typedef struct bScreen {
52         ID id;
53         
54         ListBase vertbase;                                      /* screens have vertices/edges to define areas */
55         ListBase edgebase;
56         ListBase areabase;
57         ListBase regionbase;                            /* screen level regions (menus), runtime only */
58
59         struct Scene *scene DNA_DEPRECATED;
60
61         short winid;                                            /* winid from WM, starts with 1 */
62         short redraws_flag;                                     /* user-setting for which editors get redrawn during anim playback (used to be time->redraws) */
63
64         char temp;                                                      /* temp screen in a temp window, don't save (like user prefs) */
65         char state;                                                     /* temp screen for image render display or fileselect */
66         char do_draw;                                           /* notifier for drawing edges */
67         char do_refresh;                                        /* notifier for scale screen, changed screen, etc */
68         char do_draw_gesture;                           /* notifier for gesture draw. */
69         char do_draw_paintcursor;                       /* notifier for paint cursor draw. */
70         char do_draw_drag;                                      /* notifier for dragging draw. */
71         char swap;                                                      /* indicator to survive swap-exchange systems */
72         char skip_handling;                                     /* set to delay screen handling after switching back from maximized area */
73         char scrubbing;                                         /* set when scrubbing to avoid some costly updates */
74         char pad[6];
75         
76         short mainwin;                                          /* screensize subwindow, for screenedges and global menus */
77         short subwinactive;                                     /* active subwindow */
78
79         struct wmTimer *animtimer;                      /* if set, screen has timer handler added in window */
80         void *context;                                          /* context callback */
81
82         struct wmTooltipState *tool_tip;        /* runtime */
83
84         PreviewImage *preview;
85 } bScreen;
86
87 typedef struct ScrVert {
88         struct ScrVert *next, *prev, *newv;
89         vec2s vec;
90         /* first one used internally, second one for tools */
91         short flag, editflag;
92 } ScrVert;
93
94 typedef struct ScrEdge {
95         struct ScrEdge *next, *prev;
96         ScrVert *v1, *v2;
97         short border;                   /* 1 when at edge of screen */
98         short flag;
99         int pad;
100 } ScrEdge;
101
102 typedef struct Panel {          /* the part from uiBlock that needs saved in file */
103         struct Panel *next, *prev;
104
105         struct PanelType *type;                 /* runtime */
106         struct uiLayout *layout;                /* runtime for drawing */
107
108         char panelname[64], tabname[64];        /* defined as UI_MAX_NAME_STR */
109         char drawname[64];                                      /* panelname is identifier for restoring location */
110         int ofsx, ofsy, sizex, sizey;
111         short labelofs, pad;
112         short flag, runtime_flag;
113         short control;
114         short snap;
115         int sortorder;                  /* panels are aligned according to increasing sortorder */
116         struct Panel *paneltab;         /* this panel is tabbed in *paneltab */
117         void *activedata;                       /* runtime for panel manipulation */
118 } Panel;
119
120
121 /* Notes on Panel Catogories:
122  *
123  * ar->panels_category (PanelCategoryDyn) is a runtime only list of categories collected during draw.
124  *
125  * ar->panels_category_active (PanelCategoryStack) is basically a list of strings (category id's).
126  *
127  * Clicking on a tab moves it to the front of ar->panels_category_active,
128  * If the context changes so this tab is no longer displayed,
129  * then the first-most tab in ar->panels_category_active is used.
130  *
131  * This way you can change modes and always have the tab you last clicked on.
132  */
133
134 /* region level tabs */
135 #
136 #
137 typedef struct PanelCategoryDyn {
138         struct PanelCategoryDyn *next, *prev;
139         char idname[64];
140         rcti rect;
141 } PanelCategoryDyn;
142
143 /* region stack of active tabs */
144 typedef struct PanelCategoryStack {
145         struct PanelCategoryStack *next, *prev;
146         char idname[64];
147 } PanelCategoryStack;
148
149
150 /* uiList dynamic data... */
151 /* These two Lines with # tell makesdna this struct can be excluded. */
152 #
153 #
154 typedef struct uiListDyn {
155         int height;                   /* Number of rows needed to draw all elements. */
156         int visual_height;            /* Actual visual height of the list (in rows). */
157         int visual_height_min;        /* Minimal visual height of the list (in rows). */
158
159         int items_len;                /* Number of items in collection. */
160         int items_shown;              /* Number of items actually visible after filtering. */
161
162         /* Those are temp data used during drag-resize with GRIP button (they are in pixels, the meaningful data is the
163          * difference between resize_prev and resize)...
164          */
165         int resize;
166         int resize_prev;
167
168         /* Filtering data. */
169         int *items_filter_flags;      /* items_len length. */
170         int *items_filter_neworder;   /* org_idx -> new_idx, items_len length. */
171 } uiListDyn;
172
173 typedef struct uiList {           /* some list UI data need to be saved in file */
174         struct uiList *next, *prev;
175
176         struct uiListType *type;      /* runtime */
177
178         char list_id[64];             /* defined as UI_MAX_NAME_STR */
179
180         int layout_type;              /* How items are layedout in the list */
181         int flag;
182
183         int list_scroll;
184         int list_grip;
185         int list_last_len;
186         int list_last_activei;
187
188         /* Filtering data. */
189         char filter_byname[64];       /* defined as UI_MAX_NAME_STR */
190         int filter_flag;
191         int filter_sort_flag;
192
193         /* Custom sub-classes properties. */
194         IDProperty *properties;
195
196         /* Dynamic data (runtime). */
197         uiListDyn *dyn_data;
198 } uiList;
199
200 typedef struct TransformOrientation {
201         struct TransformOrientation *next, *prev;
202         char name[64];  /* MAX_NAME */
203         float mat[3][3];
204         int pad;
205 } TransformOrientation;
206
207 typedef struct uiPreview {           /* some preview UI data need to be saved in file */
208         struct uiPreview *next, *prev;
209
210         char preview_id[64];             /* defined as UI_MAX_NAME_STR */
211         short height;
212         short pad1[3];
213 } uiPreview;
214
215 typedef struct ScrArea {
216         struct ScrArea *next, *prev;
217         
218         ScrVert *v1, *v2, *v3, *v4;             /* ordered (bl, tl, tr, br) */
219         bScreen *full;                  /* if area==full, this is the parent */
220
221         rcti totrct;                    /* rect bound by v1 v2 v3 v4 */
222
223         char spacetype, butspacetype;   /* SPACE_..., butspacetype is button arg  */
224         short winx, winy;                               /* size */
225         
226         short headertype;                               /* OLD! 0=no header, 1= down, 2= up */
227         short do_refresh;                               /* private, for spacetype refresh callback */
228         short flag;
229         short region_active_win;                /* index of last used region of 'RGN_TYPE_WINDOW'
230                                                                          * runtime variable, updated by executing operators */
231         char temp, pad;
232         
233         struct SpaceType *type;         /* callbacks for this space type */
234
235         /* A list of space links (editors) that were open in this area before. When
236          * changing the editor type, we try to reuse old editor data from this list.
237          * The first item is the active/visible one.
238          */
239         ListBase spacedata;  /* SpaceLink */
240         /* NOTE: This region list is the one from the active/visible editor (first item in
241          * spacedata list). Use SpaceLink.regionbase if it's inactive (but only then)!
242          */
243         ListBase regionbase; /* ARegion */
244         ListBase handlers;   /* wmEventHandler */
245
246         ListBase actionzones;   /* AZone */
247 } ScrArea;
248
249 typedef struct ARegion {
250         struct ARegion *next, *prev;
251         
252         View2D v2d;                                     /* 2D-View scrolling/zoom info (most regions are 2d anyways) */
253         rcti winrct;                            /* coordinates of region */
254         rcti drawrct;                           /* runtime for partial redraw, same or smaller than winrct */
255         short winx, winy;                       /* size */
256         
257         short swinid;
258         short regiontype;                       /* window, header, etc. identifier for drawing */
259         short alignment;                        /* how it should split */
260         short flag;                                     /* hide, ... */
261         
262         float fsize;                            /* current split size in float (unused) */
263         short sizex, sizey;                     /* current split size in pixels (if zero it uses regiontype) */
264         
265         short do_draw;                          /* private, cached notifier events */
266         short do_draw_overlay;          /* private, cached notifier events */
267         short swap;                                     /* private, indicator to survive swap-exchange */
268         short overlap;                          /* private, set for indicate drawing overlapped */
269         short flagfullscreen;           /* temporary copy of flag settings for clean fullscreen */
270         short pad;
271         
272         struct ARegionType *type;       /* callbacks for this region type */
273         
274         ListBase uiblocks;                      /* uiBlock */
275         ListBase panels;                        /* Panel */
276         ListBase panels_category_active;        /* Stack of panel categories */
277         ListBase ui_lists;                      /* uiList */
278         ListBase ui_previews;           /* uiPreview */
279         ListBase handlers;                      /* wmEventHandler */
280         ListBase panels_category;       /* Panel categories runtime */
281
282         struct wmManipulatorMap *manipulator_map; /* manipulator-map of this region */
283         struct wmTimer *regiontimer; /* blend in/out */
284
285         char *headerstr;                        /* use this string to draw info */
286         void *regiondata;                       /* XXX 2.50, need spacedata equivalent? */
287 } ARegion;
288
289 /* swap */
290 #define WIN_BACK_OK             1
291 #define WIN_FRONT_OK    2
292 // #define WIN_EQUAL            3  // UNUSED
293
294 /* area->flag */
295 enum {
296         HEADER_NO_PULLDOWN           = (1 << 0),
297 //      AREA_FLAG_DEPRECATED_1       = (1 << 1),
298 //      AREA_FLAG_DEPRECATED_2       = (1 << 2),
299         AREA_TEMP_INFO               = (1 << 3),
300 //      AREA_FLAG_DEPRECATED_4       = (1 << 4),
301 //      AREA_FLAG_DEPRECATED_5       = (1 << 5),
302         /* used to check if we should switch back to prevspace (of a different type) */
303         AREA_FLAG_TEMP_TYPE          = (1 << 6),
304         /* for temporary fullscreens (file browser, image editor render) that are opened above user set fullscreens */
305         AREA_FLAG_STACKED_FULLSCREEN = (1 << 7),
306         /* update action zones (even if the mouse is not intersecting them) */
307         AREA_FLAG_ACTIONZONES_UPDATE = (1 << 8),
308 };
309
310 #define EDGEWIDTH       1
311 #define AREAGRID        4
312 #define AREAMINX        32
313 #define HEADERY         26
314
315 #define HEADERDOWN      1
316 #define HEADERTOP       2
317
318 /* screen->state */
319 enum {
320         SCREENNORMAL     = 0,
321         SCREENMAXIMIZED  = 1, /* one editor taking over the screen */
322         SCREENFULL       = 2, /* one editor taking over the screen with no bare-minimum UI elements */
323 };
324
325 /* Panel->flag */
326 enum {
327         PNL_SELECT      = (1 << 0),
328         PNL_CLOSEDX     = (1 << 1),
329         PNL_CLOSEDY     = (1 << 2),
330         PNL_CLOSED      = (PNL_CLOSEDX | PNL_CLOSEDY),
331         /*PNL_TABBED    = (1 << 3), */ /*UNUSED*/
332         PNL_OVERLAP     = (1 << 4),
333         PNL_PIN         = (1 << 5),
334 };
335
336 /* Panel->snap - for snapping to screen edges */
337 #define PNL_SNAP_NONE           0
338 /* #define PNL_SNAP_TOP         1 */
339 /* #define PNL_SNAP_RIGHT               2 */
340 #define PNL_SNAP_BOTTOM         4
341 /* #define PNL_SNAP_LEFT                8 */
342
343 /* #define PNL_SNAP_DIST                9.0 */
344
345 /* paneltype flag */
346 #define PNL_DEFAULT_CLOSED              1
347 #define PNL_NO_HEADER                   2
348
349 /* Fallback panel category (only for old scripts which need updating) */
350 #define PNL_CATEGORY_FALLBACK "Misc"
351
352 /* uiList layout_type */
353 enum {
354         UILST_LAYOUT_DEFAULT          = 0,
355         UILST_LAYOUT_COMPACT          = 1,
356         UILST_LAYOUT_GRID             = 2,
357 };
358
359 /* uiList flag */
360 enum {
361         UILST_SCROLL_TO_ACTIVE_ITEM   = 1 << 0,          /* Scroll list to make active item visible. */
362 };
363
364 /* Value (in number of items) we have to go below minimum shown items to enable auto size. */
365 #define UI_LIST_AUTO_SIZE_THRESHOLD 1
366
367 /* uiList filter flags (dyn_data) */
368 /* WARNING! Those values are used by integer RNA too, which does not handle well values > INT_MAX...
369  *          So please do not use 32nd bit here. */
370 enum {
371         UILST_FLT_ITEM      = 1 << 30,  /* This item has passed the filter process successfully. */
372 };
373
374 /* uiList filter options */
375 enum {
376         UILST_FLT_SHOW      = 1 << 0,          /* Show filtering UI. */
377         UILST_FLT_EXCLUDE   = UILST_FLT_ITEM,  /* Exclude filtered items, *must* use this same value. */
378 };
379
380 /* uiList filter orderby type */
381 enum {
382         UILST_FLT_SORT_ALPHA        = 1 << 0,
383         UILST_FLT_SORT_REVERSE      = 1u << 31  /* Special value, bitflag used to reverse order! */
384 };
385
386 #define UILST_FLT_SORT_MASK (((unsigned int)UILST_FLT_SORT_REVERSE) - 1)
387
388 /* regiontype, first two are the default set */
389 /* Do NOT change order, append on end. Types are hardcoded needed */
390 enum {
391         RGN_TYPE_WINDOW = 0,
392         RGN_TYPE_HEADER = 1,
393         RGN_TYPE_CHANNELS = 2,
394         RGN_TYPE_TEMPORARY = 3,
395         RGN_TYPE_UI = 4,
396         RGN_TYPE_TOOLS = 5,
397         RGN_TYPE_TOOL_PROPS = 6,
398         RGN_TYPE_PREVIEW = 7
399 };
400 /* use for function args */
401 #define RGN_TYPE_ANY -1
402
403 /* region alignment */
404 #define RGN_ALIGN_NONE          0
405 #define RGN_ALIGN_TOP           1
406 #define RGN_ALIGN_BOTTOM        2
407 #define RGN_ALIGN_LEFT          3
408 #define RGN_ALIGN_RIGHT         4
409 #define RGN_ALIGN_HSPLIT        5
410 #define RGN_ALIGN_VSPLIT        6
411 #define RGN_ALIGN_FLOAT         7
412 #define RGN_ALIGN_QSPLIT        8
413
414 #define RGN_SPLIT_PREV          32
415
416 /* region flag */
417 #define RGN_FLAG_HIDDEN         1
418 #define RGN_FLAG_TOO_SMALL      2
419
420 /* region do_draw */
421 #define RGN_DRAW                        1
422 #define RGN_DRAW_PARTIAL        2
423 #define RGN_DRAWING                     4
424 #define RGN_DRAW_REFRESH_UI     8  /* re-create uiBlock's where possible */
425 #endif
426