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