Last uiList patch (for now!): filtering and reordering of shown elements.
[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 /* uiList dynamic data... */
116 /* These two Lines with # tell makesdna this struct can be excluded. */
117 #
118 #
119 typedef struct uiListDyn {
120         int height;                   /* Number of rows needed to draw all elements. */
121         int visual_height;            /* Actual visual height of the list (in rows). */
122         int visual_height_min;        /* Minimal visual height of the list (in rows). */
123
124         int items_len;                /* Number of items in collection. */
125         int items_shown;              /* Number of items actually visible after filtering. */
126
127         /* Filtering data. */
128         int *items_filter_flags;      /* items_len length. */
129         int *items_filter_neworder;   /* org_idx -> new_idx, items_len length. */
130 } uiListDyn;
131
132 typedef struct uiList {           /* some list UI data need to be saved in file */
133         struct uiList *next, *prev;
134
135         struct uiListType *type;      /* runtime */
136
137         char list_id[64];             /* defined as UI_MAX_NAME_STR */
138
139         int layout_type;              /* How items are layedout in the list */
140         int flag;
141
142         int list_scroll;
143         int list_grip;
144         int list_last_len;
145         int padi1;
146
147         /* Filtering data. */
148         char filter_byname[64];       /* defined as UI_MAX_NAME_STR */
149         int filter_flag;
150         int filter_orderby_flag;
151
152         /* Custom sub-classes properties. */
153         IDProperty *properties;
154
155         /* Dynamic data (runtime). */
156         uiListDyn *dyn_data;
157 } uiList;
158
159 typedef struct ScrArea {
160         struct ScrArea *next, *prev;
161         
162         ScrVert *v1, *v2, *v3, *v4;             /* ordered (bl, tl, tr, br) */
163         bScreen *full;                  /* if area==full, this is the parent */
164
165         rcti totrct;                    /* rect bound by v1 v2 v3 v4 */
166
167         char spacetype, butspacetype;   /* SPACE_..., butspacetype is button arg  */
168         short winx, winy;                               /* size */
169         
170         short headertype;                               /* OLD! 0=no header, 1= down, 2= up */
171         short do_refresh;                               /* private, for spacetype refresh callback */
172         short flag;
173         short region_active_win;                /* index of last used region of 'RGN_TYPE_WINDOW'
174                                                                          * runtuime variable, updated by executing operators */
175         short pad;
176         
177         struct SpaceType *type;         /* callbacks for this space type */
178         
179         ListBase spacedata;             /* SpaceLink */
180         ListBase regionbase;    /* ARegion */
181         ListBase handlers;              /* wmEventHandler */
182         
183         ListBase actionzones;   /* AZone */
184 } ScrArea;
185
186 typedef struct ARegion {
187         struct ARegion *next, *prev;
188         
189         View2D v2d;                                     /* 2D-View scrolling/zoom info (most regions are 2d anyways) */
190         rcti winrct;                            /* coordinates of region */
191         rcti drawrct;                           /* runtime for partial redraw, same or smaller than winrct */
192         short winx, winy;                       /* size */
193         
194         short swinid;
195         short regiontype;                       /* window, header, etc. identifier for drawing */
196         short alignment;                        /* how it should split */
197         short flag;                                     /* hide, ... */
198         
199         float fsize;                            /* current split size in float (unused) */
200         short sizex, sizey;                     /* current split size in pixels (if zero it uses regiontype) */
201         
202         short do_draw;                          /* private, cached notifier events */
203         short do_draw_overlay;          /* private, cached notifier events */
204         short swap;                                     /* private, indicator to survive swap-exchange */
205         short overlap;                          /* private, set for indicate drawing overlapped */
206         short pad[2];
207         
208         struct ARegionType *type;       /* callbacks for this region type */
209         
210         ListBase uiblocks;                      /* uiBlock */
211         ListBase panels;                        /* Panel */
212         ListBase ui_lists;                      /* uiList */
213         ListBase handlers;                      /* wmEventHandler */
214         
215         struct wmTimer *regiontimer; /* blend in/out */
216         
217         char *headerstr;                        /* use this string to draw info */
218         void *regiondata;                       /* XXX 2.50, need spacedata equivalent? */
219 } ARegion;
220
221 /* swap */
222 #define WIN_BACK_OK             1
223 #define WIN_FRONT_OK    2
224 // #define WIN_EQUAL            3  // UNUSED
225
226 /* area->flag */
227 #define HEADER_NO_PULLDOWN              1
228 #define AREA_FLAG_DRAWJOINTO    2
229 #define AREA_FLAG_DRAWJOINFROM  4
230 #define AREA_TEMP_INFO                  8
231 #define AREA_FLAG_DRAWSPLIT_H   16
232 #define AREA_FLAG_DRAWSPLIT_V   32
233
234 #define EDGEWIDTH       1
235 #define AREAGRID        4
236 #define AREAMINX        32
237 #define HEADERY         26
238 #define AREAMINY        (HEADERY+EDGEWIDTH)
239
240 #define HEADERDOWN      1
241 #define HEADERTOP       2
242
243 /* screen->full */
244 #define SCREENNORMAL    0
245 #define SCREENFULL              1
246
247
248 /* Panel->snap - for snapping to screen edges */
249 #define PNL_SNAP_NONE           0
250 /* #define PNL_SNAP_TOP         1 */
251 /* #define PNL_SNAP_RIGHT               2 */
252 #define PNL_SNAP_BOTTOM         4
253 /* #define PNL_SNAP_LEFT                8 */
254
255 /* #define PNL_SNAP_DIST                9.0 */
256
257 /* paneltype flag */
258 #define PNL_DEFAULT_CLOSED              1
259 #define PNL_NO_HEADER                   2
260
261 /* uiList layout_type */
262 enum {
263         UILST_LAYOUT_DEFAULT          = 0,
264         UILST_LAYOUT_COMPACT          = 1,
265         UILST_LAYOUT_GRID             = 2,
266 };
267
268 /* uiList flag */
269 enum {
270         UILST_SCROLL_TO_ACTIVE_ITEM   = 1 << 0,          /* Scroll list to make active item visible. */
271         UILST_RESIZING                = 1 << 1,          /* We are currently resizing, deactivate autosize! */
272 };
273
274 /* uiList filter flags (dyn_data) */
275 enum {
276         UILST_FLT_ITEM      = 1 << 31,  /* This item has passed the filter process successfully. */
277 };
278
279 /* uiList filter options */
280 enum {
281         UILST_FLT_SHOW      = 1 << 0,          /* Show filtering UI. */
282         UILST_FLT_EXCLUDE   = UILST_FLT_ITEM,  /* Exclude filtered items, *must* use this same value. */
283 };
284
285 /* uiList filter orderby type */
286 enum {
287         UILST_FLT_ORDERBY_NAME         = 1 << 0,
288         UILST_FLT_ORDERBY_REVERSE      = 1 << 31  /* Special value, bitflag used to reverse order! */
289 };
290
291 #define UILST_FLT_ORDERBY_MASK (((unsigned int)UILST_FLT_ORDERBY_REVERSE) - 1)
292
293 /* regiontype, first two are the default set */
294 /* Do NOT change order, append on end. Types are hardcoded needed */
295 enum {
296         RGN_TYPE_WINDOW = 0,
297         RGN_TYPE_HEADER = 1,
298         RGN_TYPE_CHANNELS = 2,
299         RGN_TYPE_TEMPORARY = 3,
300         RGN_TYPE_UI = 4,
301         RGN_TYPE_TOOLS = 5,
302         RGN_TYPE_TOOL_PROPS = 6,
303         RGN_TYPE_PREVIEW = 7
304 };
305
306 /* region alignment */
307 #define RGN_ALIGN_NONE          0
308 #define RGN_ALIGN_TOP           1
309 #define RGN_ALIGN_BOTTOM        2
310 #define RGN_ALIGN_LEFT          3
311 #define RGN_ALIGN_RIGHT         4
312 #define RGN_ALIGN_HSPLIT        5
313 #define RGN_ALIGN_VSPLIT        6
314 #define RGN_ALIGN_FLOAT         7
315 #define RGN_ALIGN_QSPLIT        8
316
317 #define RGN_SPLIT_PREV          32
318
319 /* region flag */
320 #define RGN_FLAG_HIDDEN         1
321 #define RGN_FLAG_TOO_SMALL      2
322
323 /* region do_draw */
324 #define RGN_DRAW                        1
325 #define RGN_DRAW_PARTIAL        2
326
327 #endif
328