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