SVN maintenance.
[blender.git] / source / blender / editors / interface / interface_intern.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #ifndef INTERFACE_H
31 #define INTERFACE_H
32
33 #include "UI_resources.h"
34 #include "RNA_types.h"
35
36 struct ARegion;
37 struct bContext;
38 struct IDProperty;
39 struct uiHandleButtonData;
40 struct wmEvent;
41 struct wmOperatorType;
42 struct wmWindow;
43 struct uiStyle;
44 struct uiWidgetColors;
45 struct uiLayout;
46 struct bContextStore;
47
48 /* ****************** general defines ************** */
49
50 /* visual types for drawing */
51 /* for time being separated from functional types */
52 typedef enum {
53         /* standard set */
54         UI_WTYPE_LABEL,
55         UI_WTYPE_TOGGLE,
56         UI_WTYPE_OPTION,
57         UI_WTYPE_RADIO,
58         UI_WTYPE_NUMBER,
59         UI_WTYPE_SLIDER,
60         UI_WTYPE_EXEC,
61         
62         /* strings */
63         UI_WTYPE_NAME,
64         UI_WTYPE_NAME_LINK,
65         UI_WTYPE_POINTER_LINK,
66         UI_WTYPE_FILENAME,
67         
68         /* menus */
69         UI_WTYPE_MENU_RADIO,
70         UI_WTYPE_MENU_POINTER_LINK,
71         
72         UI_WTYPE_PULLDOWN,
73         UI_WTYPE_MENU_ITEM,
74         UI_WTYPE_MENU_BACK,
75         
76         /* specials */
77         UI_WTYPE_ICON,
78         UI_WTYPE_SWATCH,
79         UI_WTYPE_RGB_PICKER,
80         UI_WTYPE_NORMAL,
81         UI_WTYPE_BOX
82         
83 } uiWidgetTypeEnum;
84
85
86
87 #define UI_MAX_DRAW_STR 400
88 #define UI_MAX_NAME_STR 64
89 #define UI_ARRAY        29
90
91 /* panel limits */
92 #define UI_PANEL_MINX   100
93 #define UI_PANEL_MINY   70
94
95 /* uiBut->flag */
96 #define UI_SELECT               1
97 #define UI_MOUSE_OVER   2
98 #define UI_ACTIVE               4
99 #define UI_HAS_ICON             8
100 #define UI_TEXTINPUT    16
101
102 /* warn: rest of uiBut->flag in UI_interface.h */
103
104 /* internal panel drawing defines */
105 #define PNL_GRID        4
106 #define PNL_HEADER  20
107
108 /* panel->flag */
109 #define PNL_SELECT      1
110 #define PNL_CLOSEDX     2
111 #define PNL_CLOSEDY     4
112 #define PNL_CLOSED      6
113 #define PNL_TABBED      8
114 #define PNL_OVERLAP     16
115
116 /* Button text selection:
117  * extension direction, selextend, inside ui_do_but_TEX */
118 #define EXTEND_LEFT             1
119 #define EXTEND_RIGHT    2
120
121 typedef struct {
122         short xim, yim;
123         unsigned int *rect;
124         short xofs, yofs;
125 } uiIconImage;
126
127
128 typedef struct uiLinkLine {                             /* only for draw/edit */
129         struct uiLinkLine *next, *prev;
130
131         short flag, pad;
132         
133         struct uiBut *from, *to;        
134 } uiLinkLine;
135
136 typedef struct {
137         void **poin;            /* pointer to original pointer */
138         void ***ppoin;          /* pointer to original pointer-array */
139         short *totlink;         /* if pointer-array, here is the total */
140         
141         short maxlink, pad;
142         short fromcode, tocode;
143         
144         ListBase lines;
145 } uiLink;
146
147 struct uiBut {
148         struct uiBut *next, *prev;
149         short type, pointype, bit, bitnr, retval, strwidth, ofs, pos, selsta, selend;
150         short alignnr;
151         int flag;
152         
153         char *str;
154         char strdata[UI_MAX_NAME_STR];
155         char drawstr[UI_MAX_DRAW_STR];
156         
157         float x1, y1, x2, y2;
158
159         char *poin;
160         float hardmin, hardmax, softmin, softmax;
161         float a1, a2, hsv[3];   // hsv is temp memory for hsv buttons
162         float aspect;
163
164         uiButHandleFunc func;
165         void *func_arg1;
166         void *func_arg2;
167         void *func_arg3;
168
169         uiButHandleNFunc funcN;
170         void *func_argN;
171
172         struct bContextStore *context;
173
174         void (*embossfunc)(int , int , float, float, float, float, float, int);
175         void (*sliderfunc)(int , float, float, float, float, float, float, int);
176
177         uiButCompleteFunc autocomplete_func;
178         void *autofunc_arg;
179         
180         uiButSearchFunc search_func;
181         void *search_arg;
182         
183         uiLink *link;
184         short linkto[2];
185         
186         char *tip, *lockstr;
187
188         BIFIconID icon;
189         short but_align;        /* aligning buttons, horiz/vertical */
190         short lock, win;
191         short iconadd, dt;
192
193         /* IDPOIN data */
194         uiIDPoinFuncFP idpoin_func;
195         ID **idpoin_idpp;
196
197         /* BLOCK data */
198         uiBlockCreateFunc block_create_func;
199
200         /* PULLDOWN/MENU data */
201         uiMenuCreateFunc menu_create_func;
202
203         /* RNA data */
204         struct PointerRNA rnapoin;
205         struct PropertyRNA *rnaprop;
206         int rnaindex;
207
208         /* Operator data */
209         struct wmOperatorType *optype;
210         int opcontext;
211         struct IDProperty *opproperties;
212         struct PointerRNA *opptr;
213
214                 /* active button data */
215         struct uiHandleButtonData *active;
216
217         char *editstr;
218         double *editval;
219         float *editvec;
220         void *editcoba;
221         void *editcumap;
222         
223                 /* pointer back */
224         uiBlock *block;
225 };
226
227 struct uiBlock {
228         uiBlock *next, *prev;
229
230         ListBase buttons;
231         Panel *panel;
232         uiBlock *oldblock;
233
234         ListBase layouts;
235         struct uiLayout *curlayout;
236
237         ListBase contexts;
238         
239         char name[UI_MAX_NAME_STR];
240         
241         float winmat[4][4];
242         
243         float minx, miny, maxx, maxy;
244         float aspect;
245
246         short alignnr;
247
248         uiButHandleFunc func;
249         void *func_arg1;
250         void *func_arg2;
251
252         uiMenuHandleFunc butm_func;
253         void *butm_func_arg;
254
255         uiBlockHandleFunc handle_func;
256         void *handle_func_arg;
257         
258         /* custom extra handling */
259         int (*block_event_func)(const struct bContext *C, struct uiBlock *, struct wmEvent *);
260         
261         /* extra draw function for custom blocks */
262         void (*drawextra)(const struct bContext *C, void *idv, rcti *rect);
263
264         int afterval, flag;
265         
266         short direction, dt;
267         short auto_open, in_use;
268         double auto_open_last;
269
270         int lock;
271         char *lockstr;
272         
273         float xofs, yofs;                               // offset to parent button
274         int bounds, dobounds, mx, my;   // for doing delayed
275         int endblock;                                   // uiEndBlock done?
276
277         rctf safety;                            // pulldowns, to detect outside, can differ per case how it is created
278         ListBase saferct;                       // uiSafetyRct list
279
280         uiPopupBlockHandle *handle;     // handle
281         int tooltipdisabled;            // to avoid tooltip after click
282
283         int active;                                     // to keep blocks while drawing and free them afterwards
284 };
285
286 typedef struct uiSafetyRct {
287         struct uiSafetyRct *next, *prev;
288         rctf parent;
289         rctf safety;
290 } uiSafetyRct;
291
292 /* interface.c */
293
294 extern int ui_translate_buttons(void);
295 extern int ui_translate_menus(void);
296 extern int ui_translate_tooltips(void);
297
298 void ui_fontscale(short *points, float aspect);
299
300 extern void ui_block_to_window_fl(const struct ARegion *ar, uiBlock *block, float *x, float *y);
301 extern void ui_block_to_window(const struct ARegion *ar, uiBlock *block, int *x, int *y);
302 extern void ui_block_to_window_rct(const struct ARegion *ar, uiBlock *block, rctf *graph, rcti *winr);
303 extern void ui_window_to_block_fl(const struct ARegion *ar, uiBlock *block, float *x, float *y);
304 extern void ui_window_to_block(const struct ARegion *ar, uiBlock *block, int *x, int *y);
305 extern void ui_window_to_region(const ARegion *ar, int *x, int *y);
306
307 extern double ui_get_but_val(uiBut *but);
308 extern void ui_set_but_val(uiBut *but, double value);
309 extern void ui_set_but_hsv(uiBut *but);
310 extern void ui_get_but_vectorf(uiBut *but, float *vec);
311 extern void ui_set_but_vectorf(uiBut *but, float *vec);
312
313 extern void ui_hsvcircle_vals_from_pos(float *valrad, float *valdist, rcti *rect, float mx, float my);
314
315 extern void ui_get_but_string(uiBut *but, char *str, int maxlen);
316 extern int ui_set_but_string(struct bContext *C, uiBut *but, const char *str);
317 extern int ui_get_but_string_max_length(uiBut *but);
318
319 extern void ui_set_but_soft_range(uiBut *but, double value);
320
321 extern void ui_check_but(uiBut *but);
322 extern int  ui_is_but_float(uiBut *but);
323 extern void ui_update_block_buts_hsv(uiBlock *block, float *hsv);
324
325 extern void ui_bounds_block(uiBlock *block);
326 extern void ui_block_translate(uiBlock *block, int x, int y);
327 extern void ui_block_do_align(uiBlock *block);
328
329 /* interface_regions.c */
330
331 struct uiPopupBlockHandle {
332         /* internal */
333         struct ARegion *region;
334         int towardsx, towardsy;
335         double towardstime;
336         int dotowards;
337
338         int popup;
339         void (*popup_func)(struct bContext *C, void *arg, int event);
340         void (*cancel_func)(void *arg);
341         void *popup_arg;
342
343         /* for operator popups */
344         struct wmOperatorType *optype;
345         int opcontext;
346         ScrArea *ctx_area;
347         ARegion *ctx_region;
348         
349         /* return values */
350         int butretval;
351         int menuretval;
352         float retvalue;
353         float retvec[3];
354 };
355
356 uiBlock *ui_block_func_MENU(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
357 uiBlock *ui_block_func_ICONROW(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
358 uiBlock *ui_block_func_ICONTEXTROW(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
359 uiBlock *ui_block_func_COL(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
360
361 struct ARegion *ui_tooltip_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
362 void ui_tooltip_free(struct bContext *C, struct ARegion *ar);
363
364 /* searchbox for string button */
365 ARegion *ui_searchbox_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
366 int ui_searchbox_inside(struct ARegion *ar, int x, int y);
367 void ui_searchbox_update(struct bContext *C, struct ARegion *ar, uiBut *but, int reset);
368 void ui_searchbox_event(struct bContext *C, struct ARegion *ar, uiBut *but, struct wmEvent *event);
369 void ui_searchbox_apply(uiBut *but, struct ARegion *ar);
370 void ui_searchbox_free(struct bContext *C, struct ARegion *ar);
371
372 typedef uiBlock* (*uiBlockHandleCreateFunc)(struct bContext *C, struct uiPopupBlockHandle *handle, void *arg1);
373
374 uiPopupBlockHandle *ui_popup_block_create(struct bContext *C, struct ARegion *butregion, uiBut *but,
375         uiBlockCreateFunc create_func, uiBlockHandleCreateFunc handle_create_func, void *arg);
376 uiPopupBlockHandle *ui_popup_menu_create(struct bContext *C, struct ARegion *butregion, uiBut *but,
377         uiMenuCreateFunc create_func, void *arg);
378 void ui_popup_block_free(struct bContext *C, uiPopupBlockHandle *handle);
379
380 void ui_set_name_menu(uiBut *but, int value);
381 int ui_step_name_menu(uiBut *but, int step);
382
383 struct AutoComplete;
384 struct AutoComplete *autocomplete_begin(char *startname, int maxlen);
385 void autocomplete_do_name(struct AutoComplete *autocpl, const char *name);
386 void autocomplete_end(struct AutoComplete *autocpl, char *autoname);
387
388 /* interface_panel.c */
389 extern int ui_handler_panel_region(struct bContext *C, struct wmEvent *event);
390 extern void ui_draw_aligned_panel(struct ARegion *ar, struct uiStyle *style, uiBlock *block, rcti *rect);
391
392 /* interface_draw.c */
393 extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
394
395 extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
396 extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
397 extern void gl_round_box_vertical_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadeLeft, float shadeRight);
398
399 void ui_draw_but_COLORBAND(uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
400 void ui_draw_but_NORMAL(uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
401 void ui_draw_but_CURVE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
402
403
404 /* interface_handlers.c */
405 extern void ui_button_active_cancel(const struct bContext *C, uiBut *but);
406 extern int ui_button_is_active(struct ARegion *ar);
407
408 /* interface_widgets.c */
409 void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3);
410 void ui_draw_menu_back(struct uiStyle *style, uiBlock *block, rcti *rect);
411 void ui_draw_search_back(struct uiStyle *style, uiBlock *block, rcti *rect);
412 void ui_draw_link_bezier(rcti *rect);
413
414 extern void ui_draw_but(const struct bContext *C, ARegion *ar, struct uiStyle *style, uiBut *but, rcti *rect);
415                 /* theme color init */
416 struct ThemeUI;
417 void ui_widget_color_init(struct ThemeUI *tui);
418
419 void ui_draw_menu_item(struct uiFontStyle *fstyle, rcti *rect, char *name, int state);
420
421 /* interface_style.c */
422 void uiStyleInit(void);
423
424 /* resources.c */
425 void init_userdef_do_versions(void);
426 void ui_theme_init_userdef(void);
427 void ui_resources_init(void);
428 void ui_resources_free(void);
429
430 /* interface_layout.c */
431 void ui_layout_add_but(struct uiLayout *layout, uiBut *but);
432 int ui_but_can_align(uiBut *but);
433
434 /* interface_anim.c */
435 void ui_but_anim_flag(uiBut *but, float cfra);
436 void ui_but_anim_insert_keyframe(struct bContext *C);
437 void ui_but_anim_delete_keyframe(struct bContext *C);
438 void ui_but_anim_add_driver(struct bContext *C);
439 void ui_but_anim_remove_driver(struct bContext *C);
440 void ui_but_anim_menu(struct bContext *C, uiBut *but);
441
442 #endif
443