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