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