f67ec0903816aad0797ad4f0b596b0408c7f076e
[blender.git] / source / blender / makesdna / DNA_screen_types.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
20 /** \file
21  * \ingroup DNA
22  */
23
24 #ifndef __DNA_SCREEN_TYPES_H__
25 #define __DNA_SCREEN_TYPES_H__
26
27 #include "DNA_defs.h"
28 #include "DNA_listBase.h"
29 #include "DNA_view2d_types.h"
30 #include "DNA_vec_types.h"
31
32 #include "DNA_ID.h"
33
34 struct ARegion;
35 struct ARegionType;
36 struct PanelType;
37 struct Scene;
38 struct SpaceLink;
39 struct SpaceType;
40 struct uiLayout;
41 struct wmDrawBuffer;
42 struct wmTimer;
43 struct wmTooltipState;
44
45
46 /* TODO Doing this is quite ugly :)
47  * Once the top-bar is merged bScreen should be refactored to use ScrAreaMap. */
48 #define AREAMAP_FROM_SCREEN(screen) ((ScrAreaMap *)&(screen)->vertbase)
49
50 typedef struct bScreen {
51         ID id;
52
53         /* TODO Should become ScrAreaMap now.
54          * ** NOTE: KEEP ORDER IN SYNC WITH ScrAreaMap! (see AREAMAP_FROM_SCREEN macro above) ** */
55         /** Screens have vertices/edges to define areas. */
56         ListBase vertbase;
57         ListBase edgebase;
58         ListBase areabase;
59
60         /** Screen level regions (menus), runtime only. */
61         ListBase regionbase;
62
63         struct Scene *scene DNA_DEPRECATED;
64
65         /** General flags. */
66         short flag;
67         /** Winid from WM, starts with 1. */
68         short winid;
69         /** User-setting for which editors get redrawn during anim playback. */
70         short redraws_flag;
71
72         /** Temp screen in a temp window, don't save (like user prefs). */
73         char temp;
74         /** Temp screen for image render display or fileselect. */
75         char state;
76         /** Notifier for drawing edges. */
77         char do_draw;
78         /** Notifier for scale screen, changed screen, etc. */
79         char do_refresh;
80         /** Notifier for gesture draw. */
81         char do_draw_gesture;
82         /** Notifier for paint cursor draw. */
83         char do_draw_paintcursor;
84         /** Notifier for dragging draw. */
85         char do_draw_drag;
86         /** Set to delay screen handling after switching back from maximized area. */
87         char skip_handling;
88         /** Set when scrubbing to avoid some costly updates. */
89         char scrubbing;
90         char pad[1];
91
92         /** Active region that has mouse focus. */
93         struct ARegion *active_region;
94
95         /** If set, screen has timer handler added in window. */
96         struct wmTimer *animtimer;
97         /** Context callback. */
98         void *context;
99
100         /** Runtime. */
101         struct wmTooltipState *tool_tip;
102
103         PreviewImage *preview;
104 } bScreen;
105
106 typedef struct ScrVert {
107         struct ScrVert *next, *prev, *newv;
108         vec2s vec;
109         /* first one used internally, second one for tools */
110         short flag, editflag;
111 } ScrVert;
112
113 typedef struct ScrEdge {
114         struct ScrEdge *next, *prev;
115         ScrVert *v1, *v2;
116         /** 1 when at edge of screen. */
117         short border;
118         short flag;
119         int pad;
120 } ScrEdge;
121
122 typedef struct ScrAreaMap {
123         /* ** NOTE: KEEP ORDER IN SYNC WITH LISTBASES IN bScreen! ** */
124
125         /** ScrVert - screens have vertices/edges to define areas. */
126         ListBase vertbase;
127         /** ScrEdge. */
128         ListBase edgebase;
129         /** ScrArea. */
130         ListBase areabase;
131 } ScrAreaMap;
132
133 /** The part from uiBlock that needs saved in file. */
134 typedef struct Panel {
135         struct Panel *next, *prev;
136
137         /** Runtime. */
138         struct PanelType *type;
139         /** Runtime for drawing. */
140         struct uiLayout *layout;
141
142         /** Defined as UI_MAX_NAME_STR. */
143         char panelname[64], tabname[64];
144         /** Panelname is identifier for restoring location. */
145         char drawname[64];
146         /** Offset within the region. */
147         int ofsx, ofsy;
148         /** Panel size including children. */
149         int sizex, sizey;
150         /** Panel size excluding children. */
151         int blocksizex, blocksizey;
152         short labelofs, pad;
153         short flag, runtime_flag;
154         short control;
155         short snap;
156         /** Panels are aligned according to increasing sortorder. */
157         int sortorder;
158         /** This panel is tabbed in *paneltab. */
159         struct Panel *paneltab;
160         /** Runtime for panel manipulation. */
161         void *activedata;
162         /** Sub panels. */
163         ListBase children;
164 } Panel;
165
166
167 /* Notes on Panel Catogories:
168  *
169  * ar->panels_category (PanelCategoryDyn) is a runtime only list of categories collected during draw.
170  *
171  * ar->panels_category_active (PanelCategoryStack) is basically a list of strings (category id's).
172  *
173  * Clicking on a tab moves it to the front of ar->panels_category_active,
174  * If the context changes so this tab is no longer displayed,
175  * then the first-most tab in ar->panels_category_active is used.
176  *
177  * This way you can change modes and always have the tab you last clicked on.
178  */
179
180 /* region level tabs */
181 #
182 #
183 typedef struct PanelCategoryDyn {
184         struct PanelCategoryDyn *next, *prev;
185         char idname[64];
186         rcti rect;
187 } PanelCategoryDyn;
188
189 /* region stack of active tabs */
190 typedef struct PanelCategoryStack {
191         struct PanelCategoryStack *next, *prev;
192         char idname[64];
193 } PanelCategoryStack;
194
195
196 /* uiList dynamic data... */
197 /* These two Lines with # tell makesdna this struct can be excluded. */
198 #
199 #
200 typedef struct uiListDyn {
201         /** Number of rows needed to draw all elements. */
202         int height;
203         /** Actual visual height of the list (in rows). */
204         int visual_height;
205         /** Minimal visual height of the list (in rows). */
206         int visual_height_min;
207
208         /** Number of items in collection. */
209         int items_len;
210         /** Number of items actually visible after filtering. */
211         int items_shown;
212
213         /* Those are temp data used during drag-resize with GRIP button
214          * (they are in pixels, the meaningful data is the
215          * difference between resize_prev and resize)...
216          */
217         int resize;
218         int resize_prev;
219
220         /* Filtering data. */
221         /** Items_len length. */
222         int *items_filter_flags;
223         /** Org_idx -> new_idx, items_len length. */
224         int *items_filter_neworder;
225 } uiListDyn;
226
227 typedef struct uiList {           /* some list UI data need to be saved in file */
228         struct uiList *next, *prev;
229
230         /** Runtime. */
231         struct uiListType *type;
232
233         /** Defined as UI_MAX_NAME_STR. */
234         char list_id[64];
235
236         /** How items are layedout in the list. */
237         int layout_type;
238         int flag;
239
240         int list_scroll;
241         int list_grip;
242         int list_last_len;
243         int list_last_activei;
244
245         /* Filtering data. */
246         /** Defined as UI_MAX_NAME_STR. */
247         char filter_byname[64];
248         int filter_flag;
249         int filter_sort_flag;
250
251         /* Custom sub-classes properties. */
252         IDProperty *properties;
253
254         /* Dynamic data (runtime). */
255         uiListDyn *dyn_data;
256 } uiList;
257
258 typedef struct TransformOrientation {
259         struct TransformOrientation *next, *prev;
260         /** MAX_NAME. */
261         char name[64];
262         float mat[3][3];
263         int pad;
264 } TransformOrientation;
265
266 /** Some preview UI data need to be saved in file. */
267 typedef struct uiPreview {
268         struct uiPreview *next, *prev;
269
270         /** Defined as UI_MAX_NAME_STR. */
271         char preview_id[64];
272         short height;
273         short pad1[3];
274 } uiPreview;
275
276 /* These two lines with # tell makesdna this struct can be excluded.
277  * Should be: #ifndef WITH_GLOBAL_AREA_WRITING */
278 #
279 #
280 typedef struct ScrGlobalAreaData {
281         /* Global areas have a non-dynamic size. That means, changing the window
282          * size doesn't affect their size at all. However, they can still be
283          * 'collapsed', by changing this value. Ignores DPI (ED_area_global_size_y
284          * and winx/winy don't) */
285         short cur_fixed_height;
286         /* For global areas, this is the min and max size they can use depending on
287          * if they are 'collapsed' or not. Value is set on area creation and not
288          * touched afterwards. */
289         short size_min, size_max;
290         /** GlobalAreaAlign. */
291         short align;
292
293         /** GlobalAreaFlag. */
294         short flag;
295         short pad;
296 } ScrGlobalAreaData;
297
298 enum GlobalAreaFlag {
299         GLOBAL_AREA_IS_HIDDEN = (1 << 0),
300 };
301
302 typedef enum GlobalAreaAlign {
303         GLOBAL_AREA_ALIGN_TOP,
304         GLOBAL_AREA_ALIGN_BOTTOM,
305 } GlobalAreaAlign;
306
307 typedef struct ScrArea_Runtime {
308         struct bToolRef *tool;
309         char          is_tool_set;
310         char _pad0[7];
311 } ScrArea_Runtime;
312
313 typedef struct ScrArea {
314         struct ScrArea *next, *prev;
315
316         /** Ordered (bl, tl, tr, br). */
317         ScrVert *v1, *v2, *v3, *v4;
318         /** If area==full, this is the parent. */
319         bScreen *full;
320
321         /** Rect bound by v1 v2 v3 v4. */
322         rcti totrct;
323
324         /**
325          * eSpace_Type (SPACE_FOO).
326          *
327          * Temporarily used while switching area type, otherwise this should be SPACE_EMPTY.
328          * Also, versioning uses it to nicely replace deprecated * editors.
329          * It's been there for ages, name doesn't fit any more.
330          */
331         char spacetype;
332         /** #eSpace_Type (SPACE_FOO). */
333         char butspacetype;
334         short butspacetype_subtype;
335
336         /** Size. */
337         short winx, winy;
338
339         /** OLD! 0=no header, 1= down, 2= up. */
340         char headertype DNA_DEPRECATED;
341         /** Private, for spacetype refresh callback. */
342         char do_refresh;
343         short flag;
344         /**
345          * Index of last used region of 'RGN_TYPE_WINDOW'
346          * runtime variable, updated by executing operators.
347          */
348         short region_active_win;
349         char temp, pad;
350
351         /** Callbacks for this space type. */
352         struct SpaceType *type;
353
354         /* Non-NULL if this area is global. */
355         ScrGlobalAreaData *global;
356
357         /* A list of space links (editors) that were open in this area before. When
358          * changing the editor type, we try to reuse old editor data from this list.
359          * The first item is the active/visible one.
360          */
361         /** #SpaceLink. */
362         ListBase spacedata;
363         /* NOTE: This region list is the one from the active/visible editor (first item in
364          * spacedata list). Use SpaceLink.regionbase if it's inactive (but only then)!
365          */
366         /** #ARegion. */
367         ListBase regionbase;
368         /** #wmEventHandler. */
369         ListBase handlers;
370
371         /** #AZone. */
372         ListBase actionzones;
373
374         ScrArea_Runtime runtime;
375 } ScrArea;
376
377
378 typedef struct ARegion_Runtime {
379         /* Panel category to use between 'layout' and 'draw'. */
380         const char *category;
381 } ARegion_Runtime;
382
383 typedef struct ARegion {
384         struct ARegion *next, *prev;
385
386         /** 2D-View scrolling/zoom info (most regions are 2d anyways). */
387         View2D v2d;
388         /** Coordinates of region. */
389         rcti winrct;
390         /** Runtime for partial redraw, same or smaller than winrct. */
391         rcti drawrct;
392         /** Size. */
393         short winx, winy;
394
395         /** Region is currently visible on screen. */
396         short visible;
397         /** Window, header, etc. identifier for drawing. */
398         short regiontype;
399         /** How it should split. */
400         short alignment;
401         /** Hide, .... */
402         short flag;
403
404         /** Current split size in float (unused). */
405         float fsize;
406         /** Current split size in pixels (if zero it uses regiontype). */
407         short sizex, sizey;
408
409         /** Private, cached notifier events. */
410         short do_draw;
411         /** Private, cached notifier events. */
412         short do_draw_overlay;
413         /** Private, set for indicate drawing overlapped. */
414         short overlap;
415         /** Temporary copy of flag settings for clean fullscreen. */
416         short flagfullscreen;
417         short pad1, pad2;
418
419         /** Callbacks for this region type. */
420         struct ARegionType *type;
421
422         /** #uiBlock. */
423         ListBase uiblocks;
424         /** Panel. */
425         ListBase panels;
426         /** Stack of panel categories. */
427         ListBase panels_category_active;
428         /** #uiList. */
429         ListBase ui_lists;
430         /** #uiPreview. */
431         ListBase ui_previews;
432         /** #wmEventHandler. */
433         ListBase handlers;
434         /** Panel categories runtime. */
435         ListBase panels_category;
436
437         /** Gizmo-map of this region. */
438         struct wmGizmoMap *gizmo_map;
439         /** Blend in/out. */
440         struct wmTimer *regiontimer;
441         struct wmDrawBuffer *draw_buffer;
442
443         /** Use this string to draw info. */
444         char *headerstr;
445         /** XXX 2.50, need spacedata equivalent?. */
446         void *regiondata;
447
448         ARegion_Runtime runtime;
449 } ARegion;
450
451 /** #ScrArea.flag */
452 enum {
453         HEADER_NO_PULLDOWN           = (1 << 0),
454 //      AREA_FLAG_DEPRECATED_1       = (1 << 1),
455 //      AREA_FLAG_DEPRECATED_2       = (1 << 2),
456 #ifdef DNA_DEPRECATED_ALLOW
457         AREA_TEMP_INFO               = (1 << 3), /* versioned to make slot reusable */
458 #endif
459         /* update size of regions within the area */
460         AREA_FLAG_REGION_SIZE_UPDATE = (1 << 3),
461         AREA_FLAG_ACTIVE_TOOL_UPDATE = (1 << 4),
462 //      AREA_FLAG_DEPRECATED_5       = (1 << 5),
463         /* used to check if we should switch back to prevspace (of a different type) */
464         AREA_FLAG_TEMP_TYPE          = (1 << 6),
465         /* for temporary fullscreens (file browser, image editor render)
466          * that are opened above user set fullscreens */
467         AREA_FLAG_STACKED_FULLSCREEN = (1 << 7),
468         /* update action zones (even if the mouse is not intersecting them) */
469         AREA_FLAG_ACTIONZONES_UPDATE = (1 << 8),
470 };
471
472 #define AREAGRID        4
473 #define AREAMINX        32
474 #define HEADERY         26
475
476 /** #bScreen.flag */
477 enum {
478         SCREEN_COLLAPSE_TOPBAR    = 1,
479         SCREEN_COLLAPSE_STATUSBAR = 2,
480 };
481
482 /** #bScreen.state */
483 enum {
484         SCREENNORMAL     = 0,
485         SCREENMAXIMIZED  = 1, /* one editor taking over the screen */
486         SCREENFULL       = 2, /* one editor taking over the screen with no bare-minimum UI elements */
487 };
488
489 /** #bScreen.redraws_flag */
490 typedef enum eScreen_Redraws_Flag {
491         TIME_REGION            = (1 << 0),
492         TIME_ALL_3D_WIN        = (1 << 1),
493         TIME_ALL_ANIM_WIN      = (1 << 2),
494         TIME_ALL_BUTS_WIN      = (1 << 3),
495         // TIME_WITH_SEQ_AUDIO    = (1 << 4), /* DEPRECATED */
496         TIME_SEQ               = (1 << 5),
497         TIME_ALL_IMAGE_WIN     = (1 << 6),
498         // TIME_CONTINUE_PHYSICS  = (1 << 7), /* UNUSED */
499         TIME_NODES             = (1 << 8),
500         TIME_CLIPS             = (1 << 9),
501
502         TIME_FOLLOW            = (1 << 15),
503 } eScreen_Redraws_Flag;
504
505 /** #Panel.flag */
506 enum {
507         PNL_SELECT      = (1 << 0),
508         PNL_CLOSEDX     = (1 << 1),
509         PNL_CLOSEDY     = (1 << 2),
510         PNL_CLOSED      = (PNL_CLOSEDX | PNL_CLOSEDY),
511         /*PNL_TABBED    = (1 << 3), */ /*UNUSED*/
512         PNL_OVERLAP     = (1 << 4),
513         PNL_PIN         = (1 << 5),
514         PNL_POPOVER     = (1 << 6),
515 };
516
517 /** #Panel.snap - for snapping to screen edges */
518 #define PNL_SNAP_NONE           0
519 /* #define PNL_SNAP_TOP         1 */
520 /* #define PNL_SNAP_RIGHT               2 */
521 #define PNL_SNAP_BOTTOM         4
522 /* #define PNL_SNAP_LEFT                8 */
523
524 /* #define PNL_SNAP_DIST                9.0 */
525
526 /* paneltype flag */
527 #define PNL_DEFAULT_CLOSED              1
528 #define PNL_NO_HEADER                   2
529 #define PNL_LAYOUT_VERT_BAR             4
530
531 /* Fallback panel category (only for old scripts which need updating) */
532 #define PNL_CATEGORY_FALLBACK "Misc"
533
534 /** #uiList.layout_type */
535 enum {
536         UILST_LAYOUT_DEFAULT          = 0,
537         UILST_LAYOUT_COMPACT          = 1,
538         UILST_LAYOUT_GRID             = 2,
539 };
540
541 /** #uiList.flag */
542 enum {
543         /* Scroll list to make active item visible. */
544         UILST_SCROLL_TO_ACTIVE_ITEM   = 1 << 0,
545 };
546
547 /* Value (in number of items) we have to go below minimum shown items to enable auto size. */
548 #define UI_LIST_AUTO_SIZE_THRESHOLD 1
549
550 /* uiList filter flags (dyn_data) */
551 /* WARNING! Those values are used by integer RNA too, which does not handle well values > INT_MAX...
552  *          So please do not use 32nd bit here. */
553 enum {
554         UILST_FLT_ITEM      = 1 << 30,  /* This item has passed the filter process successfully. */
555 };
556
557 /** #uiList.filter_flag */
558 enum {
559         UILST_FLT_SHOW      = 1 << 0,          /* Show filtering UI. */
560         UILST_FLT_EXCLUDE   = UILST_FLT_ITEM,  /* Exclude filtered items, *must* use this same value. */
561 };
562
563 /** #uiList.filter_sort_flag */
564 enum {
565         /* Plain values (only one is valid at a time, once masked with UILST_FLT_SORT_MASK. */
566         /** Just for sake of consistency. */
567         UILST_FLT_SORT_INDEX        = 0,
568         UILST_FLT_SORT_ALPHA        = 1,
569
570         /* Bitflags affecting behavior of any kind of sorting. */
571         /** Special flag to indicate that order is locked (not user-changeable). */
572         UILST_FLT_SORT_LOCK       = 1u << 30,
573         /** Special value, bitflag used to reverse order! */
574         UILST_FLT_SORT_REVERSE      = 1u << 31,
575 };
576
577 #define UILST_FLT_SORT_MASK (((unsigned int)(UILST_FLT_SORT_REVERSE | UILST_FLT_SORT_LOCK)) - 1)
578
579 /* regiontype, first two are the default set */
580 /* Do NOT change order, append on end. Types are hardcoded needed */
581 enum {
582         RGN_TYPE_WINDOW = 0,
583         RGN_TYPE_HEADER = 1,
584         RGN_TYPE_CHANNELS = 2,
585         RGN_TYPE_TEMPORARY = 3,
586         RGN_TYPE_UI = 4,
587         RGN_TYPE_TOOLS = 5,
588         RGN_TYPE_TOOL_PROPS = 6,
589         RGN_TYPE_PREVIEW = 7,
590         RGN_TYPE_HUD = 8,
591         /* Region to navigate the main region from (RGN_TYPE_WINDOW). */
592         RGN_TYPE_NAV_BAR = 9,
593         /* A place for buttons to trigger execution of somthing that was set up in other regions. */
594         RGN_TYPE_EXECUTE = 10,
595 };
596 /* use for function args */
597 #define RGN_TYPE_ANY -1
598
599 /* Region supports panel tabs (categories). */
600 #define RGN_TYPE_HAS_CATEGORY_MASK (1 << RGN_TYPE_UI)
601
602 /* region alignment */
603 #define RGN_ALIGN_NONE          0
604 #define RGN_ALIGN_TOP           1
605 #define RGN_ALIGN_BOTTOM        2
606 #define RGN_ALIGN_LEFT          3
607 #define RGN_ALIGN_RIGHT         4
608 #define RGN_ALIGN_HSPLIT        5
609 #define RGN_ALIGN_VSPLIT        6
610 #define RGN_ALIGN_FLOAT         7
611 #define RGN_ALIGN_QSPLIT        8
612
613 #define RGN_SPLIT_PREV          32
614
615 /** #ARegion.flag */
616 enum {
617         RGN_FLAG_HIDDEN             = (1 << 0),
618         RGN_FLAG_TOO_SMALL          = (1 << 1),
619         /* Force delayed reinit of region size data, so that region size is calculated
620          * just big enough to show all its content (if enough space is available).
621          * Note that only ED_region_header supports this right now. */
622         RGN_FLAG_DYNAMIC_SIZE       = (1 << 2),
623         /* Region data is NULL'd on read, never written. */
624         RGN_FLAG_TEMP_REGIONDATA    = (1 << 3),
625         /* The region must either use its prefsizex/y or be hidden. */
626         RGN_FLAG_PREFSIZE_OR_HIDDEN = (1 << 4),
627 };
628
629 /** #ARegion.do_draw */
630 #define RGN_DRAW                        1
631 #define RGN_DRAW_PARTIAL        2
632 #define RGN_DRAWING                     4
633 #define RGN_DRAW_REFRESH_UI     8  /* re-create uiBlock's where possible */
634 #define RGN_DRAW_NO_REBUILD     16
635 #endif