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