Cycles: svn merge -r41205:41225 ^/trunk/blender
[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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 /** \file blender/editors/interface/interface_intern.h
31  *  \ingroup edinterface
32  */
33
34
35 #ifndef INTERFACE_H
36 #define INTERFACE_H
37
38 #include "UI_resources.h"
39 #include "RNA_types.h"
40
41 struct ARegion;
42 struct bContext;
43 struct IDProperty;
44 struct uiHandleButtonData;
45 struct wmEvent;
46 struct wmOperatorType;
47 struct wmWindow;
48 struct wmTimer;
49 struct uiStyle;
50 struct uiWidgetColors;
51 struct uiLayout;
52 struct bContextStore;
53 struct Scene;
54 struct ID;
55 struct ImBuf;
56
57 /* ****************** general defines ************** */
58
59 /* visual types for drawing */
60 /* for time being separated from functional types */
61 typedef enum {
62         /* default */
63         UI_WTYPE_REGULAR,
64
65         /* standard set */
66         UI_WTYPE_LABEL,
67         UI_WTYPE_TOGGLE,
68         UI_WTYPE_OPTION,
69         UI_WTYPE_RADIO,
70         UI_WTYPE_NUMBER,
71         UI_WTYPE_SLIDER,
72         UI_WTYPE_EXEC,
73         
74         /* strings */
75         UI_WTYPE_NAME,
76         UI_WTYPE_NAME_LINK,
77         UI_WTYPE_POINTER_LINK,
78         UI_WTYPE_FILENAME,
79         
80         /* menus */
81         UI_WTYPE_MENU_RADIO,
82         UI_WTYPE_MENU_ICON_RADIO,
83         UI_WTYPE_MENU_POINTER_LINK,
84         UI_WTYPE_MENU_NODE_LINK,
85         
86         UI_WTYPE_PULLDOWN,
87         UI_WTYPE_MENU_ITEM,
88         UI_WTYPE_MENU_BACK,
89         
90         /* specials */
91         UI_WTYPE_ICON,
92         UI_WTYPE_SWATCH,
93         UI_WTYPE_RGB_PICKER,
94         UI_WTYPE_NORMAL,
95         UI_WTYPE_BOX,
96         UI_WTYPE_SCROLL,
97         UI_WTYPE_LISTITEM,
98         UI_WTYPE_PROGRESSBAR,
99         
100 } uiWidgetTypeEnum;
101
102
103
104 #define UI_MAX_DRAW_STR 400
105 #define UI_MAX_NAME_STR 128
106
107 /* panel limits */
108 #define UI_PANEL_MINX   100
109 #define UI_PANEL_MINY   70
110
111 /* uiBut->flag */
112 #define UI_SELECT               1       /* use when the button is pressed */
113 #define UI_SCROLLED             2       /* temp hidden, scrolled away */
114 #define UI_ACTIVE               4
115 #define UI_HAS_ICON             8
116 #define UI_TEXTINPUT    16
117 #define UI_HIDDEN               32
118 /* warn: rest of uiBut->flag in UI_interface.h */
119
120 /* internal panel drawing defines */
121 #define PNL_GRID        (UI_UNIT_Y / 5) /* 4 default */
122 #define PNL_HEADER  (UI_UNIT_Y+2)       /* 20 default */
123
124 /* panel->flag */
125 #define PNL_SELECT      1
126 #define PNL_CLOSEDX     2
127 #define PNL_CLOSEDY     4
128 #define PNL_CLOSED      6
129 /*#define PNL_TABBED    8*/ /*UNUSED*/
130 #define PNL_OVERLAP     16
131
132 /* Button text selection:
133  * extension direction, selextend, inside ui_do_but_TEX */
134 #define EXTEND_LEFT             1
135 #define EXTEND_RIGHT    2
136
137 /* for scope resize zone */
138 #define SCOPE_RESIZE_PAD        9
139
140 typedef struct uiLinkLine {                             /* only for draw/edit */
141         struct uiLinkLine *next, *prev;
142         struct uiBut *from, *to;
143         short flag, pad;
144 } uiLinkLine;
145
146 typedef struct {
147         void **poin;            /* pointer to original pointer */
148         void ***ppoin;          /* pointer to original pointer-array */
149         short *totlink;         /* if pointer-array, here is the total */
150         
151         short maxlink, pad;
152         short fromcode, tocode;
153         
154         ListBase lines;
155 } uiLink;
156
157 struct uiBut {
158         struct uiBut *next, *prev;
159         int flag;
160         short type, pointype, bit, bitnr, retval, strwidth, ofs, pos, selsta, selend, alignnr;
161         short pad1;
162
163         char *str;
164         char strdata[UI_MAX_NAME_STR];
165         char drawstr[UI_MAX_DRAW_STR];
166         
167         float x1, y1, x2, y2;
168
169         char *poin;
170         float hardmin, hardmax, softmin, softmax;
171         float a1, a2;
172         float aspect;
173         char col[4];
174
175         uiButHandleFunc func;
176         void *func_arg1;
177         void *func_arg2;
178         void *func_arg3;
179
180         uiButHandleNFunc funcN;
181         void *func_argN;
182
183         struct bContextStore *context;
184
185         /* not ysed yet, was used in 2.4x for ui_draw_pulldown_round & friends */
186         /*
187         void (*embossfunc)(int , int , float, float, float, float, float, int);
188         void (*sliderfunc)(int , float, float, float, float, float, float, int);
189         */
190
191         uiButCompleteFunc autocomplete_func;
192         void *autofunc_arg;
193         
194         uiButSearchFunc search_func;
195         void *search_arg;
196
197         uiButHandleRenameFunc rename_func;
198         void *rename_arg1;
199         void *rename_orig;
200
201         uiLink *link;
202         short linkto[2];
203         
204         const char *tip, *lockstr;
205
206         BIFIconID icon;
207         char lock;
208         char dt; /* drawtype: UI_EMBOSS, UI_EMBOSSN ... etc, copied from the block */
209         char changed; /* could be made into a single flag */
210         unsigned char unit_type; /* so buttons can support unit systems which are not RNA */
211         short modifier_key;
212         short iconadd;
213
214         /* IDPOIN data */
215         uiIDPoinFuncFP idpoin_func;
216         ID **idpoin_idpp;
217
218         /* BLOCK data */
219         uiBlockCreateFunc block_create_func;
220
221         /* PULLDOWN/MENU data */
222         uiMenuCreateFunc menu_create_func;
223
224         /* RNA data */
225         struct PointerRNA rnapoin;
226         struct PropertyRNA *rnaprop;
227         int rnaindex;
228
229         struct PointerRNA rnasearchpoin;
230         struct PropertyRNA *rnasearchprop;
231
232         /* Operator data */
233         struct wmOperatorType *optype;
234         struct IDProperty *opproperties;
235         struct PointerRNA *opptr;
236         short opcontext;
237         unsigned char menu_key; /* 'a'-'z', always lower case */
238
239         /* Draggable data, type is WM_DRAG_... */
240         char dragtype;
241         void *dragpoin;
242         struct ImBuf *imb;
243         float imb_scale;
244
245         /* active button data */
246         struct uiHandleButtonData *active;
247
248         char *editstr;
249         double *editval;
250         float *editvec;
251         void *editcoba;
252         void *editcumap;
253         
254                 /* pointer back */
255         uiBlock *block;
256 };
257
258 struct uiBlock {
259         uiBlock *next, *prev;
260
261         ListBase buttons;
262         Panel *panel;
263         uiBlock *oldblock;
264
265         ListBase layouts;
266         struct uiLayout *curlayout;
267
268         ListBase contexts;
269         
270         char name[UI_MAX_NAME_STR];
271         
272         float winmat[4][4];
273         
274         float minx, miny, maxx, maxy;
275         float aspect;
276
277         int puphash;                            // popup menu hash for memory
278
279         uiButHandleFunc func;
280         void *func_arg1;
281         void *func_arg2;
282
283         uiButHandleNFunc funcN;
284         void *func_argN;
285
286         uiMenuHandleFunc butm_func;
287         void *butm_func_arg;
288
289         uiBlockHandleFunc handle_func;
290         void *handle_func_arg;
291         
292         /* custom extra handling */
293         int (*block_event_func)(const struct bContext *C, struct uiBlock *, struct wmEvent *);
294         
295         /* extra draw function for custom blocks */
296         void (*drawextra)(const struct bContext *C, void *idv, void *arg1, void *arg2, rcti *rect);
297         void *drawextra_arg1;
298         void *drawextra_arg2;
299
300         int flag;
301         short alignnr;
302
303         char direction;
304         char dt; /* drawtype: UI_EMBOSS, UI_EMBOSSN ... etc, copied to buttons */
305         char auto_open;
306         char _pad[7];
307         double auto_open_last;
308
309         const char *lockstr;
310
311         char lock;
312         char active;                                    // to keep blocks while drawing and free them afterwards
313         char tooltipdisabled;                   // to avoid tooltip after click
314         char endblock;                                  // uiEndBlock done?
315         
316         float xofs, yofs;                               // offset to parent button
317         int dobounds, mx, my;                   // for doing delayed
318         int bounds, minbounds;                  // for doing delayed
319
320         rctf safety;                            // pulldowns, to detect outside, can differ per case how it is created
321         ListBase saferct;                       // uiSafetyRct list
322
323         uiPopupBlockHandle *handle;     // handle
324         
325         void *evil_C;                           // XXX hack for dynamic operator enums
326
327         struct UnitSettings *unit;      // unit system, used a lot for numeric buttons so include here rather then fetching through the scene every time.
328         float _hsv[3];                          // XXX, only access via ui_block_hsv_get()
329         char color_profile;                     // color profile for correcting linear colors for display
330 };
331
332 typedef struct uiSafetyRct {
333         struct uiSafetyRct *next, *prev;
334         rctf parent;
335         rctf safety;
336 } uiSafetyRct;
337
338 /* interface.c */
339
340 extern void ui_delete_linkline(uiLinkLine *line, uiBut *but);
341
342 void ui_fontscale(short *points, float aspect);
343
344 extern void ui_block_to_window_fl(const struct ARegion *ar, uiBlock *block, float *x, float *y);
345 extern void ui_block_to_window(const struct ARegion *ar, uiBlock *block, int *x, int *y);
346 extern void ui_block_to_window_rct(const struct ARegion *ar, uiBlock *block, rctf *graph, rcti *winr);
347 extern void ui_window_to_block_fl(const struct ARegion *ar, uiBlock *block, float *x, float *y);
348 extern void ui_window_to_block(const struct ARegion *ar, uiBlock *block, int *x, int *y);
349 extern void ui_window_to_region(const ARegion *ar, int *x, int *y);
350
351 extern double ui_get_but_val(uiBut *but);
352 extern void ui_set_but_val(uiBut *but, double value);
353 extern void ui_set_but_hsv(uiBut *but);
354 extern void ui_get_but_vectorf(uiBut *but, float vec[3]);
355 extern void ui_set_but_vectorf(uiBut *but, const float vec[3]);
356
357 extern void ui_hsvcircle_vals_from_pos(float *valrad, float *valdist, rcti *rect, float mx, float my);
358
359 extern void ui_get_but_string(uiBut *but, char *str, size_t maxlen);
360 extern void ui_convert_to_unit_alt_name(uiBut *but, char *str, size_t maxlen);
361 extern int ui_set_but_string(struct bContext *C, uiBut *but, const char *str);
362 extern int ui_get_but_string_max_length(uiBut *but);
363
364 extern void ui_set_but_default(struct bContext *C, short all);
365
366 extern void ui_set_but_soft_range(uiBut *but, double value);
367
368 extern void ui_check_but(uiBut *but);
369 extern int  ui_is_but_float(uiBut *but);
370 extern int  ui_is_but_unit(uiBut *but);
371 extern int  ui_is_but_rna_valid(uiBut *but);
372 extern int  ui_is_but_utf8(uiBut *but);
373
374 extern void ui_bounds_block(uiBlock *block);
375 extern void ui_block_translate(uiBlock *block, int x, int y);
376 extern void ui_block_do_align(uiBlock *block);
377
378 /* interface_regions.c */
379
380 struct uiPopupBlockHandle {
381         /* internal */
382         struct ARegion *region;
383         int towardsx, towardsy;
384         double towardstime;
385         int dotowards;
386
387         int popup;
388         void (*popup_func)(struct bContext *C, void *arg, int event);
389         void (*cancel_func)(void *arg);
390         void *popup_arg;
391         
392         struct wmTimer *scrolltimer;
393
394         /* for operator popups */
395         struct wmOperatorType *optype;
396         ScrArea *ctx_area;
397         ARegion *ctx_region;
398         int opcontext;
399         
400         /* return values */
401         int butretval;
402         int menuretval;
403         float retvalue;
404         float retvec[4];
405 };
406
407 uiBlock *ui_block_func_COL(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
408 void ui_block_func_ICONROW(struct bContext *C, uiLayout *layout, void *arg_but);
409 void ui_block_func_ICONTEXTROW(struct bContext *C, uiLayout *layout, void *arg_but);
410
411 struct ARegion *ui_tooltip_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
412 void ui_tooltip_free(struct bContext *C, struct ARegion *ar);
413
414 uiBut *ui_popup_menu_memory(struct uiBlock *block, struct uiBut *but);
415
416 float *ui_block_hsv_get(struct uiBlock *block);
417 void ui_popup_block_scrolltest(struct uiBlock *block);
418
419
420 /* searchbox for string button */
421 ARegion *ui_searchbox_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
422 int ui_searchbox_inside(struct ARegion *ar, int x, int y);
423 void ui_searchbox_update(struct bContext *C, struct ARegion *ar, uiBut *but, int reset);
424 void ui_searchbox_autocomplete(struct bContext *C, struct ARegion *ar, uiBut *but, char *str);
425 void ui_searchbox_event(struct bContext *C, struct ARegion *ar, uiBut *but, struct wmEvent *event);
426 void ui_searchbox_apply(uiBut *but, struct ARegion *ar);
427 void ui_searchbox_free(struct bContext *C, struct ARegion *ar);
428 void ui_but_search_test(uiBut *but);
429
430 typedef uiBlock* (*uiBlockHandleCreateFunc)(struct bContext *C, struct uiPopupBlockHandle *handle, void *arg1);
431
432 uiPopupBlockHandle *ui_popup_block_create(struct bContext *C, struct ARegion *butregion, uiBut *but,
433         uiBlockCreateFunc create_func, uiBlockHandleCreateFunc handle_create_func, void *arg);
434 uiPopupBlockHandle *ui_popup_menu_create(struct bContext *C, struct ARegion *butregion, uiBut *but,
435         uiMenuCreateFunc create_func, void *arg, char *str);
436
437 void ui_popup_block_free(struct bContext *C, uiPopupBlockHandle *handle);
438
439 void ui_set_name_menu(uiBut *but, int value);
440 int ui_step_name_menu(uiBut *but, int step);
441
442 struct AutoComplete;
443
444 /* interface_panel.c */
445 extern int ui_handler_panel_region(struct bContext *C, struct wmEvent *event);
446 extern void ui_draw_aligned_panel(struct uiStyle *style, uiBlock *block, rcti *rect);
447
448 /* interface_draw.c */
449 extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
450
451 void ui_draw_gradient(rcti *rect, float *hsv, int type, float alpha);
452
453 void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
454 void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
455 void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
456 void ui_draw_but_COLORBAND(uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
457 void ui_draw_but_NORMAL(uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
458 void ui_draw_but_CURVE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
459 void ui_draw_but_IMAGE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
460
461 /* interface_handlers.c */
462 extern void ui_button_activate_do(struct bContext *C, struct ARegion *ar, uiBut *but);
463 extern void ui_button_active_free(const struct bContext *C, uiBut *but);
464 extern int ui_button_is_active(struct ARegion *ar);
465
466 /* interface_widgets.c */
467 void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3);
468 void ui_draw_menu_back(struct uiStyle *style, uiBlock *block, rcti *rect);
469 void ui_draw_search_back(struct uiStyle *style, uiBlock *block, rcti *rect);
470 int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol);
471 void ui_draw_link_bezier(rcti *rect);
472
473 extern void ui_draw_but(const struct bContext *C, ARegion *ar, struct uiStyle *style, uiBut *but, rcti *rect);
474                 /* theme color init */
475 struct ThemeUI;
476 void ui_widget_color_init(struct ThemeUI *tui);
477
478 void ui_draw_menu_item(struct uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state);
479 void ui_draw_preview_item(struct uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state);
480
481 extern unsigned char checker_stipple_sml[];
482 /* used for transp checkers */
483 #define UI_TRANSP_DARK 100
484 #define UI_TRANSP_LIGHT 160
485
486 /* interface_style.c */
487 void uiStyleInit(void);
488
489 /* interface_icons.c */
490 int ui_id_icon_get(struct bContext *C, struct ID *id, int preview);
491
492 /* resources.c */
493 void init_userdef_do_versions(void);
494 void ui_theme_init_default(void);
495 void ui_resources_init(void);
496 void ui_resources_free(void);
497
498 /* interface_layout.c */
499 void ui_layout_add_but(uiLayout *layout, uiBut *but);
500 int ui_but_can_align(uiBut *but);
501 void ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRNA *searchptr, PropertyRNA *searchprop);
502
503 /* interface_anim.c */
504 void ui_but_anim_flag(uiBut *but, float cfra);
505 void ui_but_anim_insert_keyframe(struct bContext *C);
506 void ui_but_anim_delete_keyframe(struct bContext *C);
507 void ui_but_anim_add_driver(struct bContext *C);
508 void ui_but_anim_remove_driver(struct bContext *C);
509 void ui_but_anim_copy_driver(struct bContext *C);
510 void ui_but_anim_paste_driver(struct bContext *C);
511 void ui_but_anim_add_keyingset(struct bContext *C);
512 void ui_but_anim_remove_keyingset(struct bContext *C);
513 int ui_but_anim_expression_get(uiBut *but, char *str, size_t maxlen);
514 int ui_but_anim_expression_set(uiBut *but, const char *str);
515 int ui_but_anim_expression_create(uiBut *but, const char *str);
516 void ui_but_anim_autokey(struct bContext *C, uiBut *but, struct Scene *scene, float cfra);
517
518 #endif
519