UI: ignore events in empty region overlap areas
[blender.git] / source / blender / editors / interface / interface_intern.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup edinterface
22  */
23
24 #ifndef __INTERFACE_INTERN_H__
25 #define __INTERFACE_INTERN_H__
26
27 #include "BLI_compiler_attrs.h"
28 #include "UI_resources.h"
29 #include "RNA_types.h"
30 #include "DNA_listBase.h"
31
32 struct ARegion;
33 struct ID;
34 struct ImBuf;
35 struct Scene;
36 struct bContext;
37 struct bContextStore;
38 struct uiHandleButtonData;
39 struct uiLayout;
40 struct uiStyle;
41 struct uiWidgetColors;
42 struct wmEvent;
43 struct wmKeyConfig;
44 struct wmOperatorType;
45 struct wmTimer;
46
47 /* ****************** general defines ************** */
48
49 #define RNA_NO_INDEX -1
50 #define RNA_ENUM_VALUE -2
51
52 #define UI_MENU_PADDING (int)(0.2f * UI_UNIT_Y)
53
54 #define UI_MENU_WIDTH_MIN (UI_UNIT_Y * 9)
55 /* some extra padding added to menus containing submenu icons */
56 #define UI_MENU_SUBMENU_PADDING (6 * UI_DPI_FAC)
57
58 /* menu scrolling */
59 #define UI_MENU_SCROLL_ARROW 12
60 #define UI_MENU_SCROLL_MOUSE (UI_MENU_SCROLL_ARROW + 2)
61 #define UI_MENU_SCROLL_PAD 4
62
63 /* panel limits */
64 #define UI_PANEL_MINX 100
65 #define UI_PANEL_MINY 70
66
67 /* popover width (multiplied by 'U.widget_unit') */
68 #define UI_POPOVER_WIDTH_UNITS 10
69
70 /* uiBut->flag */
71 enum {
72   UI_SELECT = (1 << 0),   /* use when the button is pressed */
73   UI_SCROLLED = (1 << 1), /* temp hidden, scrolled away */
74   UI_ACTIVE = (1 << 2),
75   UI_HAS_ICON = (1 << 3),
76   UI_HIDDEN = (1 << 4),
77   UI_SELECT_DRAW = (1 << 5), /* Display selected, doesn't impact interaction. */
78   /* warn: rest of uiBut->flag in UI_interface.h */
79 };
80
81 /* some buttons display icons only under special conditions
82  * (e.g. 'x' icon in search menu) - used with ui_but_icon_extra_get */
83 typedef enum uiButExtraIconType {
84   UI_BUT_ICONEXTRA_NONE = 1,
85   UI_BUT_ICONEXTRA_CLEAR,
86   UI_BUT_ICONEXTRA_EYEDROPPER,
87 } uiButExtraIconType;
88
89 /* uiBut->dragflag */
90 enum {
91   UI_BUT_DRAGPOIN_FREE = (1 << 0),
92 };
93
94 /* but->pie_dir */
95 typedef enum RadialDirection {
96   UI_RADIAL_NONE = -1,
97   UI_RADIAL_N = 0,
98   UI_RADIAL_NE = 1,
99   UI_RADIAL_E = 2,
100   UI_RADIAL_SE = 3,
101   UI_RADIAL_S = 4,
102   UI_RADIAL_SW = 5,
103   UI_RADIAL_W = 6,
104   UI_RADIAL_NW = 7,
105 } RadialDirection;
106
107 extern const char ui_radial_dir_order[8];
108 extern const char ui_radial_dir_to_numpad[8];
109 extern const short ui_radial_dir_to_angle[8];
110
111 /* internal panel drawing defines */
112 #define PNL_GRID (UI_UNIT_Y / 5)     /* 4 default */
113 #define PNL_HEADER (UI_UNIT_Y * 1.2) /* 24 default */
114
115 /* bit button defines */
116 /* Bit operations */
117 #define UI_BITBUT_TEST(a, b) (((a) & (1 << (b))) != 0)
118 #define UI_BITBUT_VALUE_TOGGLED(a, b) ((a) ^ (1 << (b)))
119 #define UI_BITBUT_VALUE_ENABLED(a, b) ((a) | (1 << (b)))
120 #define UI_BITBUT_VALUE_DISABLED(a, b) ((a) & ~(1 << (b)))
121
122 /* bit-row */
123 #define UI_BITBUT_ROW(min, max) \
124   (((max) >= 31 ? 0xFFFFFFFF : (1 << ((max) + 1)) - 1) - ((min) ? ((1 << (min)) - 1) : 0))
125
126 /* split numbuts by ':' and align l/r */
127 #define USE_NUMBUTS_LR_ALIGN
128
129 /* Use new 'align' computation code. */
130 #define USE_UIBUT_SPATIAL_ALIGN
131
132 /* PieMenuData->flags */
133 enum {
134   /** pie menu item collision is detected at 90 degrees */
135   UI_PIE_DEGREES_RANGE_LARGE = (1 << 0),
136   /** use initial center of pie menu to calculate direction */
137   UI_PIE_INITIAL_DIRECTION = (1 << 1),
138   /** pie menu is drag style */
139   UI_PIE_DRAG_STYLE = (1 << 2),
140   /** mouse not far enough from center position  */
141   UI_PIE_INVALID_DIR = (1 << 3),
142   /** pie menu changed to click style, click to confirm  */
143   UI_PIE_CLICK_STYLE = (1 << 4),
144   /** pie animation finished, do not calculate any more motion  */
145   UI_PIE_ANIMATION_FINISHED = (1 << 5),
146   /** pie gesture selection has been done, now wait for mouse motion to end */
147   UI_PIE_GESTURE_END_WAIT = (1 << 6),
148 };
149
150 #define PIE_CLICK_THRESHOLD_SQ 50.0f
151
152 /* max amount of items a radial menu (pie menu) can contain */
153 #define PIE_MAX_ITEMS 8
154
155 struct uiBut {
156   struct uiBut *next, *prev;
157   int flag, drawflag;
158   eButType type;
159   eButPointerType pointype;
160   short bit, bitnr, retval, strwidth, alignnr;
161   short ofs, pos, selsta, selend;
162
163   char *str;
164   char strdata[UI_MAX_NAME_STR];
165   char drawstr[UI_MAX_DRAW_STR];
166
167   rctf rect; /* block relative coords */
168
169   char *poin;
170   float hardmin, hardmax, softmin, softmax;
171
172   /* both these values use depends on the button type
173    * (polymorphic struct or union would be nicer for this stuff) */
174
175   /**
176    * For #uiBut.type:
177    * - UI_BTYPE_HSVCUBE:      Use UI_GRAD_* values.
178    * - UI_BTYPE_NUM:          Use to store RNA 'step' value, for dragging and click-step.
179    * - UI_BTYPE_LABEL:        Use `(a1 == 1.0f)` to use a2 as a blending factor (imaginative!).
180    * - UI_BTYPE_SCROLL:       Use as scroll size.
181    * - UI_BTYPE_SEARCH_MENU:  Use as number or rows.
182    * - UI_BTYPE_COLOR:        Use as indication of color palette.
183    * - UI_BTYPE_PROGRESS_BAR: Use to store progress (0..1).
184    */
185   float a1;
186
187   /**
188    * For #uiBut.type:
189    * - UI_BTYPE_HSVCIRCLE:    Use to store the luminosity.
190    * - UI_BTYPE_NUM:          Use to store RNA 'precision' value, for dragging and click-step.
191    * - UI_BTYPE_LABEL:        If `(a1 == 1.0f)` use a2 as a blending factor.
192    * - UI_BTYPE_SEARCH_MENU:  Use as number or columns.
193    * - UI_BTYPE_COLOR:        Use as index in palette (not so good, needs refactor).
194    */
195   float a2;
196
197   uchar col[4];
198
199   uiButHandleFunc func;
200   void *func_arg1;
201   void *func_arg2;
202
203   uiButHandleNFunc funcN;
204   void *func_argN;
205
206   struct bContextStore *context;
207
208   uiButCompleteFunc autocomplete_func;
209   void *autofunc_arg;
210
211   uiButSearchCreateFunc search_create_func;
212   uiButSearchFunc search_func;
213   bool free_search_arg;
214   void *search_arg;
215
216   uiButHandleRenameFunc rename_func;
217   void *rename_arg1;
218   void *rename_orig;
219
220   /** Run an action when holding the button down. */
221   uiButHandleHoldFunc hold_func;
222   void *hold_argN;
223
224   const char *tip;
225   uiButToolTipFunc tip_func;
226   void *tip_argN;
227
228   /** info on why button is disabled, displayed in tooltip */
229   const char *disabled_info;
230
231   BIFIconID icon;
232   /** drawtype: UI_EMBOSS, UI_EMBOSS_NONE ... etc, copied from the block */
233   char dt;
234   /** direction in a pie menu, used for collision detection (RadialDirection) */
235   signed char pie_dir;
236   /** could be made into a single flag */
237   bool changed;
238   /** so buttons can support unit systems which are not RNA */
239   uchar unit_type;
240   short modifier_key;
241   short iconadd;
242
243   /* UI_BTYPE_BLOCK data */
244   uiBlockCreateFunc block_create_func;
245
246   /* UI_BTYPE_PULLDOWN/UI_BTYPE_MENU data */
247   uiMenuCreateFunc menu_create_func;
248
249   uiMenuStepFunc menu_step_func;
250
251   /* RNA data */
252   struct PointerRNA rnapoin;
253   struct PropertyRNA *rnaprop;
254   int rnaindex;
255
256   struct PointerRNA rnasearchpoin;
257   struct PropertyRNA *rnasearchprop;
258
259   /* Operator data */
260   struct wmOperatorType *optype;
261   struct PointerRNA *opptr;
262   short opcontext;
263   uchar menu_key; /* 'a'-'z', always lower case */
264
265   /* Draggable data, type is WM_DRAG_... */
266   char dragtype;
267   short dragflag;
268   void *dragpoin;
269   struct ImBuf *imb;
270   float imb_scale;
271
272   /* active button data */
273   struct uiHandleButtonData *active;
274
275   /* Custom button data. */
276   void *custom_data;
277
278   char *editstr;
279   double *editval;
280   float *editvec;
281   void *editcoba;
282   void *editcumap;
283
284   uiButPushedStateFunc pushed_state_func;
285   void *pushed_state_arg;
286
287   /* pointer back */
288   uiBlock *block;
289 };
290
291 typedef struct uiButTab {
292   uiBut but;
293   struct MenuType *menu;
294 } uiButTab;
295
296 typedef struct ColorPicker {
297   struct ColorPicker *next, *prev;
298   /** Color data, may be HSV or HSL. */
299   float color_data[3];
300   /** Initial color data (detect changes). */
301   float color_data_init[3];
302   bool is_init;
303   /** Cubic saturation for the color wheel. */
304   bool use_color_cubic;
305   bool use_color_lock;
306   bool use_luminosity_lock;
307   float luminosity_lock_value;
308 } ColorPicker;
309
310 typedef struct ColorPickerData {
311   ListBase list;
312 } ColorPickerData;
313
314 struct PieMenuData {
315   /** store title and icon to allow access when pie levels are created */
316   const char *title;
317   int icon;
318
319   float pie_dir[2];
320   float pie_center_init[2];
321   float pie_center_spawned[2];
322   float last_pos[2];
323   double duration_gesture;
324   int flags;
325   /** initial event used to fire the pie menu, store here so we can query for release */
326   int event;
327   float alphafac;
328 };
329
330 /* uiBlock.content_hints */
331 enum eBlockContentHints {
332   /** In a menu block, if there is a single sub-menu button, we add some
333    * padding to the right to put nicely aligned triangle icons there. */
334   UI_BLOCK_CONTAINS_SUBMENU_BUT = (1 << 0),
335 };
336
337 struct uiBlock {
338   uiBlock *next, *prev;
339
340   ListBase buttons;
341   Panel *panel;
342   uiBlock *oldblock;
343
344   ListBase butstore; /* UI_butstore_* runtime function */
345
346   ListBase layouts;
347   struct uiLayout *curlayout;
348
349   ListBase contexts;
350
351   char name[UI_MAX_NAME_STR];
352
353   float winmat[4][4];
354
355   rctf rect;
356   float aspect;
357
358   uint puphash; /* popup menu hash for memory */
359
360   uiButHandleFunc func;
361   void *func_arg1;
362   void *func_arg2;
363
364   uiButHandleNFunc funcN;
365   void *func_argN;
366
367   uiMenuHandleFunc butm_func;
368   void *butm_func_arg;
369
370   uiBlockHandleFunc handle_func;
371   void *handle_func_arg;
372
373   /* custom extra handling */
374   int (*block_event_func)(const struct bContext *C, struct uiBlock *, const struct wmEvent *);
375
376   /* extra draw function for custom blocks */
377   void (*drawextra)(const struct bContext *C, void *idv, void *arg1, void *arg2, rcti *rect);
378   void *drawextra_arg1;
379   void *drawextra_arg2;
380
381   int flag;
382   short alignnr;
383   /** Hints about the buttons of this block. Used to avoid iterating over
384    * buttons to find out if some criteria is met by any. Instead, check this
385    * criteria when adding the button and set a flag here if it's met. */
386   short content_hints; /* eBlockContentHints */
387
388   char direction;
389   /** UI_BLOCK_THEME_STYLE_* */
390   char theme_style;
391   /** drawtype: UI_EMBOSS, UI_EMBOSS_NONE ... etc, copied to buttons */
392   char dt;
393   bool auto_open;
394   char _pad[5];
395   double auto_open_last;
396
397   const char *lockstr;
398
399   char lock;
400   /** to keep blocks while drawing and free them afterwards */
401   char active;
402   /** to avoid tooltip after click */
403   char tooltipdisabled;
404   /** UI_block_end done? */
405   char endblock;
406
407   /** for doing delayed */
408   eBlockBoundsCalc bounds_type;
409   /** Offset to use when calculating bounds (in pixels). */
410   int bounds_offset[2];
411   /** for doing delayed */
412   int bounds, minbounds;
413
414   /** pulldowns, to detect outside, can differ per case how it is created */
415   rctf safety;
416   /** uiSafetyRct list */
417   ListBase saferct;
418
419   uiPopupBlockHandle *handle; /* handle */
420
421   /** use so presets can find the operator,
422    * across menus and from nested popups which fail for operator context. */
423   struct wmOperator *ui_operator;
424
425   /** XXX hack for dynamic operator enums */
426   void *evil_C;
427
428   /** unit system, used a lot for numeric buttons so include here
429    * rather then fetching through the scene every time. */
430   struct UnitSettings *unit;
431   /** \note only accessed by color picker templates. */
432   ColorPickerData color_pickers;
433
434   bool is_color_gamma_picker; /* Block for color picker with gamma baked in. */
435
436   /** display device name used to display this block,
437    * used by color widgets to transform colors from/to scene linear
438    */
439   char display_device[64];
440
441   struct PieMenuData pie_data;
442 };
443
444 typedef struct uiSafetyRct {
445   struct uiSafetyRct *next, *prev;
446   rctf parent;
447   rctf safety;
448 } uiSafetyRct;
449
450 /* interface.c */
451
452 void ui_fontscale(short *points, float aspect);
453
454 extern void ui_block_to_window_fl(const struct ARegion *ar, uiBlock *block, float *x, float *y);
455 extern void ui_block_to_window(const struct ARegion *ar, uiBlock *block, int *x, int *y);
456 extern void ui_block_to_window_rctf(const struct ARegion *ar,
457                                     uiBlock *block,
458                                     rctf *rct_dst,
459                                     const rctf *rct_src);
460 extern float ui_block_to_window_scale(const struct ARegion *ar, uiBlock *block);
461 extern void ui_window_to_block_fl(const struct ARegion *ar, uiBlock *block, float *x, float *y);
462 extern void ui_window_to_block(const struct ARegion *ar, uiBlock *block, int *x, int *y);
463 extern void ui_window_to_block_rctf(const struct ARegion *ar,
464                                     uiBlock *block,
465                                     rctf *rct_dst,
466                                     const rctf *rct_src);
467 extern void ui_window_to_region(const ARegion *ar, int *x, int *y);
468 extern void ui_window_to_region_rcti(const ARegion *ar, rcti *rect_dst, const rcti *rct_src);
469 extern void ui_region_to_window(const struct ARegion *ar, int *x, int *y);
470 extern void ui_region_winrct_get_no_margin(const struct ARegion *ar, struct rcti *r_rect);
471
472 extern double ui_but_value_get(uiBut *but);
473 extern void ui_but_value_set(uiBut *but, double value);
474 extern void ui_but_hsv_set(uiBut *but);
475 extern void ui_but_v3_get(uiBut *but, float vec[3]);
476 extern void ui_but_v3_set(uiBut *but, const float vec[3]);
477
478 extern void ui_hsvcircle_vals_from_pos(
479     const rcti *rect, const float mx, const float my, float *r_val_rad, float *r_val_dist);
480 extern void ui_hsvcircle_pos_from_vals(
481     const ColorPicker *cpicker, const rcti *rect, const float *hsv, float *xpos, float *ypos);
482 extern void ui_hsvcube_pos_from_vals(
483     const struct uiBut *but, const rcti *rect, const float *hsv, float *xp, float *yp);
484
485 extern void ui_but_string_get_ex(uiBut *but,
486                                  char *str,
487                                  const size_t maxlen,
488                                  const int float_precision,
489                                  const bool use_exp_float,
490                                  bool *r_use_exp_float) ATTR_NONNULL(1, 2);
491 extern void ui_but_string_get(uiBut *but, char *str, const size_t maxlen) ATTR_NONNULL();
492 extern char *ui_but_string_get_dynamic(uiBut *but, int *r_str_size);
493 extern void ui_but_convert_to_unit_alt_name(uiBut *but, char *str, size_t maxlen) ATTR_NONNULL();
494 extern bool ui_but_string_set(struct bContext *C, uiBut *but, const char *str) ATTR_NONNULL();
495 extern bool ui_but_string_set_eval_num(struct bContext *C,
496                                        uiBut *but,
497                                        const char *str,
498                                        double *value) ATTR_NONNULL();
499 extern int ui_but_string_get_max_length(uiBut *but);
500 extern uiBut *ui_but_drag_multi_edit_get(uiBut *but);
501
502 void ui_def_but_icon(uiBut *but, const int icon, const int flag);
503 extern uiButExtraIconType ui_but_icon_extra_get(uiBut *but);
504
505 extern void ui_but_default_set(struct bContext *C, const bool all, const bool use_afterfunc);
506
507 extern void ui_but_rna_menu_convert_to_panel_type(struct uiBut *but, const char *panel_type);
508 extern void ui_but_rna_menu_convert_to_menu_type(struct uiBut *but, const char *menu_type);
509 extern bool ui_but_menu_draw_as_popover(const uiBut *but);
510
511 extern void ui_but_update(uiBut *but);
512 extern void ui_but_update_edited(uiBut *but);
513 extern bool ui_but_is_float(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
514 extern bool ui_but_is_bool(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
515 extern bool ui_but_is_unit(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
516 extern bool ui_but_is_compatible(const uiBut *but_a, const uiBut *but_b) ATTR_WARN_UNUSED_RESULT;
517 extern bool ui_but_is_rna_valid(uiBut *but) ATTR_WARN_UNUSED_RESULT;
518 extern bool ui_but_supports_cycling(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
519
520 extern int ui_but_is_pushed_ex(uiBut *but, double *value) ATTR_WARN_UNUSED_RESULT;
521 extern int ui_but_is_pushed(uiBut *but) ATTR_WARN_UNUSED_RESULT;
522
523 void ui_but_override_flag(uiBut *but);
524
525 extern void ui_block_bounds_calc(uiBlock *block);
526
527 extern struct ColorManagedDisplay *ui_block_cm_display_get(uiBlock *block);
528 void ui_block_cm_to_display_space_v3(uiBlock *block, float pixel[3]);
529
530 /* interface_regions.c */
531
532 struct uiKeyNavLock {
533   /* set when we're using keyinput */
534   bool is_keynav;
535   /* only used to check if we've moved the cursor */
536   int event_xy[2];
537 };
538
539 typedef uiBlock *(*uiBlockHandleCreateFunc)(struct bContext *C,
540                                             struct uiPopupBlockHandle *handle,
541                                             void *arg1);
542 typedef void (*uiBlockHandleFreeFunc)(struct uiPopupBlockHandle *handle, void *arg1);
543
544 struct uiPopupBlockCreate {
545   uiBlockCreateFunc create_func;
546   uiBlockHandleCreateFunc handle_create_func;
547   uiBlockHandleFreeFunc free_func;
548   void *arg;
549
550   int event_xy[2];
551
552   /* when popup is initialized from a button */
553   ARegion *butregion;
554   uiBut *but;
555 };
556
557 struct uiPopupBlockHandle {
558   /* internal */
559   struct ARegion *region;
560
561   /* use only for 'UI_BLOCK_MOVEMOUSE_QUIT' popups */
562   float towards_xy[2];
563   double towardstime;
564   bool dotowards;
565
566   bool popup;
567   void (*popup_func)(struct bContext *C, void *arg, int event);
568   void (*cancel_func)(struct bContext *C, void *arg);
569   void *popup_arg;
570
571   /* store data for refreshing popups */
572   struct uiPopupBlockCreate popup_create_vars;
573   /* true if we can re-create the popup using 'popup_create_vars' */
574   bool can_refresh;
575   bool refresh;
576
577   struct wmTimer *scrolltimer;
578   float scrolloffset;
579
580   struct uiKeyNavLock keynav_state;
581
582   /* for operator popups */
583   struct wmOperator *popup_op;
584   struct wmOperatorType *optype;
585   ScrArea *ctx_area;
586   ARegion *ctx_region;
587   int opcontext;
588
589   /* return values */
590   int butretval;
591   int menuretval;
592   int retvalue;
593   float retvec[4];
594
595   /* menu direction */
596   int direction;
597
598   /* Previous values so we don't resize or reposition on refresh. */
599   rctf prev_block_rect;
600   rctf prev_butrct;
601   short prev_dir1, prev_dir2;
602   int prev_bounds_offset[2];
603
604   /* Maximum estimated size to avoid having to reposition on refresh. */
605   float max_size_x, max_size_y;
606
607   /* #ifdef USE_DRAG_POPUP */
608   bool is_grab;
609   int grab_xy_prev[2];
610   /* #endif */
611 };
612
613 /* -------------------------------------------------------------------- */
614 /* interface_region_*.c */
615
616 /* interface_region_tooltip.c */
617 /* exposed as public API in UI_interface.h */
618
619 /* interface_region_color_picker.c */
620 void ui_rgb_to_color_picker_compat_v(const float rgb[3], float r_cp[3]);
621 void ui_rgb_to_color_picker_v(const float rgb[3], float r_cp[3]);
622 void ui_color_picker_to_rgb_v(const float r_cp[3], float rgb[3]);
623 void ui_color_picker_to_rgb(float r_cp0, float r_cp1, float r_cp2, float *r, float *g, float *b);
624
625 bool ui_but_is_color_gamma(uiBut *but);
626
627 void ui_scene_linear_to_color_picker_space(uiBut *but, float rgb[3]);
628 void ui_color_picker_to_scene_linear_space(uiBut *but, float rgb[3]);
629
630 uiBlock *ui_block_func_COLOR(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
631 ColorPicker *ui_block_colorpicker_create(struct uiBlock *block);
632
633 /* interface_region_search.c */
634 /* Searchbox for string button */
635 ARegion *ui_searchbox_create_generic(struct bContext *C, struct ARegion *butregion, uiBut *but);
636 ARegion *ui_searchbox_create_operator(struct bContext *C, struct ARegion *butregion, uiBut *but);
637 bool ui_searchbox_inside(struct ARegion *ar, int x, int y);
638 int ui_searchbox_find_index(struct ARegion *ar, const char *name);
639 void ui_searchbox_update(struct bContext *C, struct ARegion *ar, uiBut *but, const bool reset);
640 int ui_searchbox_autocomplete(struct bContext *C, struct ARegion *ar, uiBut *but, char *str);
641 void ui_searchbox_event(struct bContext *C,
642                         struct ARegion *ar,
643                         uiBut *but,
644                         const struct wmEvent *event);
645 bool ui_searchbox_apply(uiBut *but, struct ARegion *ar);
646 void ui_searchbox_free(struct bContext *C, struct ARegion *ar);
647 void ui_but_search_refresh(uiBut *but);
648
649 /* interface_region_menu_popup.c */
650 int ui_but_menu_step(uiBut *but, int step);
651 bool ui_but_menu_step_poll(const uiBut *but);
652 uiBut *ui_popup_menu_memory_get(struct uiBlock *block);
653 void ui_popup_menu_memory_set(uiBlock *block, struct uiBut *but);
654
655 uiBlock *ui_popup_block_refresh(struct bContext *C,
656                                 uiPopupBlockHandle *handle,
657                                 ARegion *butregion,
658                                 uiBut *but);
659
660 uiPopupBlockHandle *ui_popup_block_create(struct bContext *C,
661                                           struct ARegion *butregion,
662                                           uiBut *but,
663                                           uiBlockCreateFunc create_func,
664                                           uiBlockHandleCreateFunc handle_create_func,
665                                           void *arg);
666 uiPopupBlockHandle *ui_popup_menu_create(struct bContext *C,
667                                          struct ARegion *butregion,
668                                          uiBut *but,
669                                          uiMenuCreateFunc create_func,
670                                          void *arg);
671
672 /* interface_region_popover.c */
673 uiPopupBlockHandle *ui_popover_panel_create(struct bContext *C,
674                                             struct ARegion *butregion,
675                                             uiBut *but,
676                                             uiMenuCreateFunc create_func,
677                                             void *arg);
678
679 /* interface_region_menu_pie.c */
680 void ui_pie_menu_level_create(uiBlock *block,
681                               struct wmOperatorType *ot,
682                               const char *propname,
683                               IDProperty *properties,
684                               const EnumPropertyItem *items,
685                               int totitem,
686                               int context,
687                               int flag);
688
689 /* interface_region_popup.c */
690 void ui_popup_translate(struct ARegion *ar, const int mdiff[2]);
691 void ui_popup_block_free(struct bContext *C, uiPopupBlockHandle *handle);
692 void ui_popup_block_scrolltest(struct uiBlock *block);
693
694 /* end interface_region_*.c */
695
696 /* interface_panel.c */
697 extern int ui_handler_panel_region(struct bContext *C,
698                                    const struct wmEvent *event,
699                                    struct ARegion *ar,
700                                    const uiBut *active_but);
701 extern void ui_draw_aligned_panel(struct uiStyle *style,
702                                   uiBlock *block,
703                                   const rcti *rect,
704                                   const bool show_pin,
705                                   const bool show_background);
706
707 /* interface_draw.c */
708 extern void ui_draw_dropshadow(
709     const rctf *rct, float radius, float aspect, float alpha, int select);
710
711 void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, const float alpha);
712
713 void ui_draw_but_TAB_outline(const rcti *rect,
714                              float rad,
715                              uchar highlight[3],
716                              uchar highlight_fade[3]);
717 void ui_draw_but_HISTOGRAM(ARegion *ar,
718                            uiBut *but,
719                            const struct uiWidgetColors *wcol,
720                            const rcti *rect);
721 void ui_draw_but_WAVEFORM(ARegion *ar,
722                           uiBut *but,
723                           const struct uiWidgetColors *wcol,
724                           const rcti *rect);
725 void ui_draw_but_VECTORSCOPE(ARegion *ar,
726                              uiBut *but,
727                              const struct uiWidgetColors *wcol,
728                              const rcti *rect);
729 void ui_draw_but_COLORBAND(uiBut *but, const struct uiWidgetColors *wcol, const rcti *rect);
730 void ui_draw_but_UNITVEC(uiBut *but, const struct uiWidgetColors *wcol, const rcti *rect);
731 void ui_draw_but_CURVE(ARegion *ar,
732                        uiBut *but,
733                        const struct uiWidgetColors *wcol,
734                        const rcti *rect);
735 void ui_draw_but_IMAGE(ARegion *ar,
736                        uiBut *but,
737                        const struct uiWidgetColors *wcol,
738                        const rcti *rect);
739 void ui_draw_but_TRACKPREVIEW(ARegion *ar,
740                               uiBut *but,
741                               const struct uiWidgetColors *wcol,
742                               const rcti *rect);
743 void ui_draw_but_NODESOCKET(ARegion *ar,
744                             uiBut *but,
745                             const struct uiWidgetColors *wcol,
746                             const rcti *rect);
747
748 /* interface_handlers.c */
749 PointerRNA *ui_handle_afterfunc_add_operator(struct wmOperatorType *ot,
750                                              int opcontext,
751                                              bool create_props);
752 extern void ui_pan_to_scroll(const struct wmEvent *event, int *type, int *val);
753 extern void ui_but_activate_event(struct bContext *C, struct ARegion *ar, uiBut *but);
754 extern void ui_but_activate_over(struct bContext *C, struct ARegion *ar, uiBut *but);
755 extern void ui_but_execute_begin(struct bContext *C,
756                                  struct ARegion *ar,
757                                  uiBut *but,
758                                  void **active_back);
759 extern void ui_but_execute_end(struct bContext *C,
760                                struct ARegion *ar,
761                                uiBut *but,
762                                void *active_back);
763 extern void ui_but_active_free(const struct bContext *C, uiBut *but);
764 extern int ui_but_menu_direction(uiBut *but);
765 extern void ui_but_text_password_hide(char password_str[UI_MAX_DRAW_STR],
766                                       uiBut *but,
767                                       const bool restore);
768 extern uiBut *ui_but_find_select_in_enum(uiBut *but, int direction);
769 bool ui_but_is_editing(const uiBut *but);
770 float ui_block_calc_pie_segment(struct uiBlock *block, const float event_xy[2]);
771
772 void ui_but_add_shortcut(uiBut *but, const char *key_str, const bool do_strip);
773 void ui_but_clipboard_free(void);
774 uiBut *ui_but_find_old(uiBlock *block_old, const uiBut *but_new);
775 uiBut *ui_but_find_new(uiBlock *block_old, const uiBut *but_new);
776
777 #ifdef WITH_INPUT_IME
778 void ui_but_ime_reposition(uiBut *but, int x, int y, bool complete);
779 struct wmIMEData *ui_but_ime_data_get(uiBut *but);
780 #endif
781
782 /* interface_widgets.c */
783
784 /* Widget shader parameters, must match the shader layout. */
785 typedef struct uiWidgetBaseParameters {
786   rctf recti, rect;
787   float radi, rad;
788   float facxi, facyi;
789   float round_corners[4];
790   float color_inner1[4], color_inner2[4];
791   float color_outline[4], color_emboss[4];
792   float color_tria[4];
793   float tria1_center[2], tria2_center[2];
794   float tria1_size, tria2_size;
795   float shade_dir;
796   /* We pack alpha check and discard factor in alpha_discard.
797    * If the value is negative then we do alpha check.
798    * The absolute value itself is the discard factor.
799    * Initialize value to 1.0.f if you don't want discard */
800   float alpha_discard;
801 } uiWidgetBaseParameters;
802
803 enum {
804   ROUNDBOX_TRIA_NONE = 0,
805   ROUNDBOX_TRIA_ARROWS,
806   ROUNDBOX_TRIA_SCROLL,
807   ROUNDBOX_TRIA_MENU,
808   ROUNDBOX_TRIA_CHECK,
809   ROUNDBOX_TRIA_HOLD_ACTION_ARROW,
810
811   ROUNDBOX_TRIA_MAX, /* don't use */
812 };
813
814 struct GPUBatch *ui_batch_roundbox_get(bool filled, bool antialiased);
815 struct GPUBatch *ui_batch_roundbox_widget_get(int tria);
816 struct GPUBatch *ui_batch_roundbox_shadow_get(void);
817
818 void ui_draw_anti_tria_rect(const rctf *rect, char dir, const float color[4]);
819 void ui_draw_menu_back(struct uiStyle *style, uiBlock *block, rcti *rect);
820 void ui_draw_popover_back(ARegion *ar, struct uiStyle *style, uiBlock *block, rcti *rect);
821 void ui_draw_pie_center(uiBlock *block);
822 const struct uiWidgetColors *ui_tooltip_get_theme(void);
823
824 void ui_draw_widget_menu_back_color(const rcti *rect, bool use_shadow, const float color[4]);
825 void ui_draw_widget_menu_back(const rcti *rect, bool use_shadow);
826 void ui_draw_tooltip_background(struct uiStyle *UNUSED(style), uiBlock *block, rcti *rect);
827
828 extern void ui_draw_but(
829     const struct bContext *C, ARegion *ar, struct uiStyle *style, uiBut *but, rcti *rect);
830
831 void ui_draw_menu_item(const struct uiFontStyle *fstyle,
832                        rcti *rect,
833                        const char *name,
834                        int iconid,
835                        int state,
836                        bool use_sep);
837 void ui_draw_preview_item(
838     const struct uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state);
839
840 #define UI_TEXT_MARGIN_X 0.4f
841 #define UI_POPUP_MARGIN (UI_DPI_FAC * 12)
842 /* margin at top of screen for popups */
843 #define UI_POPUP_MENU_TOP (int)(8 * UI_DPI_FAC)
844
845 #define UI_PIXEL_AA_JITTER 8
846 extern const float ui_pixel_jitter[UI_PIXEL_AA_JITTER][2];
847
848 /* interface_style.c */
849 void uiStyleInit(void);
850
851 /* interface_icons.c */
852 void ui_icon_ensure_deferred(const struct bContext *C, const int icon_id, const bool big);
853 int ui_id_icon_get(const struct bContext *C, struct ID *id, const bool big);
854
855 /* interface_icons_event.c */
856 void icon_draw_rect_input(
857     float x, float y, int w, int h, float alpha, short event_type, short event_value);
858
859 /* resources.c */
860 void init_userdef_do_versions(struct Main *bmain);
861 void ui_resources_init(void);
862 void ui_resources_free(void);
863
864 /* interface_layout.c */
865 void ui_layout_add_but(uiLayout *layout, uiBut *but);
866 void ui_but_add_search(uiBut *but,
867                        PointerRNA *ptr,
868                        PropertyRNA *prop,
869                        PointerRNA *searchptr,
870                        PropertyRNA *searchprop);
871 void ui_layout_list_set_labels_active(uiLayout *layout);
872 /* menu callback */
873 void ui_item_menutype_func(struct bContext *C, struct uiLayout *layout, void *arg_mt);
874 void ui_item_paneltype_func(struct bContext *C, struct uiLayout *layout, void *arg_pt);
875
876 /* interface_align.c */
877 bool ui_but_can_align(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
878 int ui_but_align_opposite_to_area_align_get(const ARegion *ar) ATTR_WARN_UNUSED_RESULT;
879 void ui_block_align_calc(uiBlock *block, const ARegion *region);
880
881 /* interface_anim.c */
882 void ui_but_anim_flag(uiBut *but, float cfra);
883 void ui_but_anim_copy_driver(struct bContext *C);
884 void ui_but_anim_paste_driver(struct bContext *C);
885 bool ui_but_anim_expression_get(uiBut *but, char *str, size_t maxlen);
886 bool ui_but_anim_expression_set(uiBut *but, const char *str);
887 bool ui_but_anim_expression_create(uiBut *but, const char *str);
888 void ui_but_anim_autokey(struct bContext *C, uiBut *but, struct Scene *scene, float cfra);
889
890 void ui_but_anim_decorate_cb(struct bContext *C, void *arg_but, void *arg_dummy);
891 void ui_but_anim_decorate_update_from_flag(uiBut *but);
892
893 /* interface_query.c */
894 bool ui_but_is_editable(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
895 bool ui_but_is_editable_as_text(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
896 bool ui_but_is_toggle(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
897 bool ui_but_is_interactive(const uiBut *but, const bool labeledit) ATTR_WARN_UNUSED_RESULT;
898 bool ui_but_is_utf8(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
899 bool ui_but_is_popover_once_compat(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
900 bool ui_but_has_array_value(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
901 void ui_but_pie_dir(RadialDirection dir, float vec[2]);
902
903 bool ui_but_is_cursor_warp(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
904
905 bool ui_but_contains_pt(const uiBut *but, float mx, float my) ATTR_WARN_UNUSED_RESULT;
906 bool ui_but_contains_rect(const uiBut *but, const rctf *rect);
907 bool ui_but_contains_point_px_icon(const uiBut *but,
908                                    struct ARegion *ar,
909                                    const struct wmEvent *event) ATTR_WARN_UNUSED_RESULT;
910 bool ui_but_contains_point_px(const uiBut *but, const struct ARegion *ar, int x, int y)
911     ATTR_WARN_UNUSED_RESULT;
912
913 uiBut *ui_list_find_mouse_over(struct ARegion *ar,
914                                const struct wmEvent *event) ATTR_WARN_UNUSED_RESULT;
915
916 uiBut *ui_but_find_mouse_over_ex(struct ARegion *ar,
917                                  const int x,
918                                  const int y,
919                                  const bool labeledit) ATTR_WARN_UNUSED_RESULT;
920 uiBut *ui_but_find_mouse_over(struct ARegion *ar,
921                               const struct wmEvent *event) ATTR_WARN_UNUSED_RESULT;
922 uiBut *ui_but_find_rect_over(const struct ARegion *ar,
923                              const rcti *rect_px) ATTR_WARN_UNUSED_RESULT;
924
925 uiBut *ui_list_find_mouse_over_ex(struct ARegion *ar, int x, int y) ATTR_WARN_UNUSED_RESULT;
926
927 bool ui_but_contains_password(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
928
929 uiBut *ui_but_prev(uiBut *but) ATTR_WARN_UNUSED_RESULT;
930 uiBut *ui_but_next(uiBut *but) ATTR_WARN_UNUSED_RESULT;
931 uiBut *ui_but_first(uiBlock *block) ATTR_WARN_UNUSED_RESULT;
932 uiBut *ui_but_last(uiBlock *block) ATTR_WARN_UNUSED_RESULT;
933
934 bool ui_block_is_menu(const uiBlock *block) ATTR_WARN_UNUSED_RESULT;
935 bool ui_block_is_popover(const uiBlock *block) ATTR_WARN_UNUSED_RESULT;
936 bool ui_block_is_pie_menu(const uiBlock *block) ATTR_WARN_UNUSED_RESULT;
937 bool ui_block_is_popup_any(const uiBlock *block) ATTR_WARN_UNUSED_RESULT;
938
939 uiBut *ui_region_find_first_but_test_flag(struct ARegion *ar, int flag_include, int flag_exclude);
940 uiBut *ui_region_find_active_but(struct ARegion *ar) ATTR_WARN_UNUSED_RESULT;
941 bool ui_region_contains_point_px(const struct ARegion *ar, int x, int y) ATTR_WARN_UNUSED_RESULT;
942 bool ui_region_contains_rect_px(const struct ARegion *ar, const rcti *rect_px);
943
944 /* interface_context_menu.c */
945 bool ui_popup_context_menu_for_button(struct bContext *C, uiBut *but);
946 void ui_popup_context_menu_for_panel(struct bContext *C, struct ARegion *ar, struct Panel *pa);
947
948 /* interface_eyedropper.c */
949 struct wmKeyMap *eyedropper_modal_keymap(struct wmKeyConfig *keyconf);
950 struct wmKeyMap *eyedropper_colorband_modal_keymap(struct wmKeyConfig *keyconf);
951
952 /* interface_eyedropper_color.c */
953 void UI_OT_eyedropper_color(struct wmOperatorType *ot);
954
955 /* interface_eyedropper_colorband.c */
956 void UI_OT_eyedropper_colorramp(struct wmOperatorType *ot);
957 void UI_OT_eyedropper_colorramp_point(struct wmOperatorType *ot);
958
959 /* interface_eyedropper_datablock.c */
960 void UI_OT_eyedropper_id(struct wmOperatorType *ot);
961
962 /* interface_eyedropper_depth.c */
963 void UI_OT_eyedropper_depth(struct wmOperatorType *ot);
964
965 /* interface_eyedropper_driver.c */
966 void UI_OT_eyedropper_driver(struct wmOperatorType *ot);
967
968 /* interface_util.c */
969
970 /**
971  * For use with #ui_rna_collection_search_cb.
972  */
973 typedef struct uiRNACollectionSearch {
974   PointerRNA target_ptr;
975   PropertyRNA *target_prop;
976
977   PointerRNA search_ptr;
978   PropertyRNA *search_prop;
979
980   bool *but_changed; /* pointer to uiBut.changed */
981 } uiRNACollectionSearch;
982 void ui_rna_collection_search_cb(const struct bContext *C,
983                                  void *arg,
984                                  const char *str,
985                                  uiSearchItems *items);
986
987 /* interface_ops.c */
988 bool ui_jump_to_target_button_poll(struct bContext *C);
989
990 #endif /* __INTERFACE_INTERN_H__ */