UI: ignore events in empty region overlap areas
[blender.git] / source / blender / editors / include / UI_interface.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 editorui
22  */
23
24 #ifndef __UI_INTERFACE_H__
25 #define __UI_INTERFACE_H__
26
27 #include "BLI_compiler_attrs.h"
28 #include "BLI_sys_types.h" /* size_t */
29 #include "RNA_types.h"
30
31 /* Struct Declarations */
32
33 struct ARegion;
34 struct ARegionType;
35 struct AutoComplete;
36 struct ID;
37 struct IDProperty;
38 struct ImBuf;
39 struct Image;
40 struct ImageUser;
41 struct ListBase;
42 struct MTex;
43 struct Panel;
44 struct PanelType;
45 struct PointerRNA;
46 struct PropertyRNA;
47 struct ReportList;
48 struct ScrArea;
49 struct bContext;
50 struct bContextStore;
51 struct bNode;
52 struct bNodeSocket;
53 struct bNodeTree;
54 struct bScreen;
55 struct rcti;
56 struct uiFontStyle;
57 struct uiList;
58 struct uiStyle;
59 struct uiWidgetColors;
60 struct wmDrag;
61 struct wmDropBox;
62 struct wmEvent;
63 struct wmEvent;
64 struct wmGizmo;
65 struct wmKeyConfig;
66 struct wmKeyMap;
67 struct wmKeyMapItem;
68 struct wmMsgBus;
69 struct wmOperator;
70 struct wmOperatorType;
71 struct wmWindow;
72
73 typedef struct uiBlock uiBlock;
74 typedef struct uiBut uiBut;
75 typedef struct uiLayout uiLayout;
76 typedef struct uiPopupBlockHandle uiPopupBlockHandle;
77
78 /* Defines */
79
80 /* char for splitting strings, aligning shortcuts in menus, users never see */
81 #define UI_SEP_CHAR '|'
82 #define UI_SEP_CHAR_S "|"
83
84 /* names */
85 #define UI_MAX_DRAW_STR 400
86 #define UI_MAX_NAME_STR 128
87 #define UI_MAX_SHORTCUT_STR 64
88
89 /**
90  * For #ARegion.overlap regions, pass events though if they don't overlap
91  * the regions contents (the usable part of the #View2D and buttons).
92  *
93  * The margin is needed so it's not possible to accidentally click inbetween buttons.
94  */
95 #define UI_REGION_OVERLAP_MARGIN (U.widget_unit / 3)
96
97 /* use for clamping popups within the screen */
98 #define UI_SCREEN_MARGIN 10
99
100 /* uiBlock->dt and uiBut->dt */
101 enum {
102   UI_EMBOSS = 0,          /* use widget style for drawing */
103   UI_EMBOSS_NONE = 1,     /* Nothing, only icon and/or text */
104   UI_EMBOSS_PULLDOWN = 2, /* Pulldown menu style */
105   UI_EMBOSS_RADIAL = 3,   /* Pie Menu */
106
107   UI_EMBOSS_UNDEFINED = 255, /* For layout engine, use emboss from block. */
108 };
109
110 /* uiBlock->direction */
111 enum {
112   UI_DIR_UP = 1 << 0,
113   UI_DIR_DOWN = 1 << 1,
114   UI_DIR_LEFT = 1 << 2,
115   UI_DIR_RIGHT = 1 << 3,
116   UI_DIR_CENTER_X = 1 << 4,
117   UI_DIR_CENTER_Y = 1 << 5,
118
119   UI_DIR_ALL = UI_DIR_UP | UI_DIR_DOWN | UI_DIR_LEFT | UI_DIR_RIGHT,
120 };
121
122 #if 0
123 /* uiBlock->autofill (not yet used) */
124 #  define UI_BLOCK_COLLUMNS 1
125 #  define UI_BLOCK_ROWS 2
126 #endif
127
128 /** #uiBlock.flag (controls) */
129 enum {
130   UI_BLOCK_LOOP = 1 << 0,
131   UI_BLOCK_IS_FLIP = 1 << 1,
132   UI_BLOCK_NO_FLIP = 1 << 2,
133   UI_BLOCK_NUMSELECT = 1 << 3,
134   /** Don't apply window clipping. */
135   UI_BLOCK_NO_WIN_CLIP = 1 << 4,
136   UI_BLOCK_CLIPBOTTOM = 1 << 5,
137   UI_BLOCK_CLIPTOP = 1 << 6,
138   UI_BLOCK_MOVEMOUSE_QUIT = 1 << 7,
139   UI_BLOCK_KEEP_OPEN = 1 << 8,
140   UI_BLOCK_POPUP = 1 << 9,
141   UI_BLOCK_OUT_1 = 1 << 10,
142   UI_BLOCK_SEARCH_MENU = 1 << 11,
143   UI_BLOCK_POPUP_MEMORY = 1 << 12,
144   /* Stop handling mouse events. */
145   UI_BLOCK_CLIP_EVENTS = 1 << 13,
146
147   /* block->flag bits 14-17 are identical to but->drawflag bits */
148
149   UI_BLOCK_POPUP_HOLD = 1 << 18,
150   UI_BLOCK_LIST_ITEM = 1 << 19,
151   UI_BLOCK_RADIAL = 1 << 20,
152   UI_BLOCK_POPOVER = 1 << 21,
153   UI_BLOCK_POPOVER_ONCE = 1 << 22,
154   /** Always show keymaps, even for non-menus. */
155   UI_BLOCK_SHOW_SHORTCUT_ALWAYS = 1 << 23,
156 };
157
158 /** #uiPopupBlockHandle.menuretval */
159 enum {
160   /** Cancel all menus cascading. */
161   UI_RETURN_CANCEL = 1 << 0,
162   /** Choice made. */
163   UI_RETURN_OK = 1 << 1,
164   /** Left the menu. */
165   UI_RETURN_OUT = 1 << 2,
166   /** Let the parent handle this event. */
167   UI_RETURN_OUT_PARENT = 1 << 3,
168   /** Update the button that opened. */
169   UI_RETURN_UPDATE = 1 << 4,
170   /** Popup is ok to be handled. */
171   UI_RETURN_POPUP_OK = 1 << 5,
172 };
173
174 /* panel controls */
175 enum {
176   UI_PNL_SOLID = 1 << 1,
177   UI_PNL_CLOSE = 1 << 5,
178   UI_PNL_SCALE = 1 << 9,
179 };
180
181 /* but->flag - general state flags. */
182 enum {
183   /** Warning, the first 6 flags are internal. */
184   UI_BUT_ICON_SUBMENU = 1 << 6,
185   UI_BUT_ICON_PREVIEW = 1 << 7,
186
187   UI_BUT_NODE_LINK = 1 << 8,
188   UI_BUT_NODE_ACTIVE = 1 << 9,
189   UI_BUT_DRAG_LOCK = 1 << 10,
190   /** Grayed out and un-editable. */
191   UI_BUT_DISABLED = 1 << 11,
192
193   UI_BUT_ANIMATED = 1 << 13,
194   UI_BUT_ANIMATED_KEY = 1 << 14,
195   UI_BUT_DRIVEN = 1 << 15,
196   UI_BUT_REDALERT = 1 << 16,
197   /** Grayed out but still editable. */
198   UI_BUT_INACTIVE = 1 << 17,
199   UI_BUT_LAST_ACTIVE = 1 << 18,
200   UI_BUT_UNDO = 1 << 19,
201   UI_BUT_IMMEDIATE = 1 << 20,
202   UI_BUT_NO_UTF8 = 1 << 21,
203
204   /** For popups, pressing return activates this button, overriding the highlighted button.
205    * For non-popups this is just used as a display hint for the user to let them
206    * know the action which is activated when pressing return (file selector for eg). */
207   UI_BUT_ACTIVE_DEFAULT = 1 << 23,
208
209   /** This but is "inside" a list item (currently used to change theme colors). */
210   UI_BUT_LIST_ITEM = 1 << 24,
211   /** edit this button as well as the active button (not just dragging) */
212   UI_BUT_DRAG_MULTI = 1 << 25,
213   /** Use for popups to start editing the button on initialization. */
214   UI_BUT_ACTIVATE_ON_INIT = 1 << 26,
215
216   /** #uiBut.str contains #UI_SEP_CHAR, used for key shortcuts */
217   UI_BUT_HAS_SEP_CHAR = 1 << 27,
218   /** Don't run updates while dragging (needed in rare cases). */
219   UI_BUT_UPDATE_DELAY = 1 << 28,
220   /** When widget is in textedit mode, update value on each char stroke */
221   UI_BUT_TEXTEDIT_UPDATE = 1 << 29,
222   /** Show 'x' icon to clear/unlink value of text or search button. */
223   UI_BUT_VALUE_CLEAR = 1 << 30,
224
225   /** RNA property of the button is overridden from linked reference data. */
226   UI_BUT_OVERRIDEN = 1u << 31u,
227 };
228
229 #define UI_PANEL_WIDTH 340
230 #define UI_COMPACT_PANEL_WIDTH 160
231 #define UI_NAVIGATION_REGION_WIDTH UI_COMPACT_PANEL_WIDTH
232 #define UI_NARROW_NAVIGATION_REGION_WIDTH 100
233
234 #define UI_PANEL_CATEGORY_MARGIN_WIDTH (U.widget_unit * 1.0f)
235
236 /* but->drawflag - these flags should only affect how the button is drawn. */
237 /* Note: currently, these flags _are not passed_ to the widget's state() or draw() functions
238  *       (except for the 'align' ones)!
239  */
240 enum {
241   /** Text and icon alignment (by default, they are centered). */
242   UI_BUT_TEXT_LEFT = 1 << 1,
243   UI_BUT_ICON_LEFT = 1 << 2,
244   UI_BUT_TEXT_RIGHT = 1 << 3,
245   /** Prevent the button to show any tooltip. */
246   UI_BUT_NO_TOOLTIP = 1 << 4,
247
248   /* Button align flag, for drawing groups together.
249    * Used in 'uiBlock.flag', take care! */
250   UI_BUT_ALIGN_TOP = 1 << 14,
251   UI_BUT_ALIGN_LEFT = 1 << 15,
252   UI_BUT_ALIGN_RIGHT = 1 << 16,
253   UI_BUT_ALIGN_DOWN = 1 << 17,
254   UI_BUT_ALIGN = UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_LEFT | UI_BUT_ALIGN_RIGHT | UI_BUT_ALIGN_DOWN,
255   /* end bits shared with 'uiBlock.flag' */
256
257   /**
258    * Warning - HACK!
259    * Needed for buttons which are not TOP/LEFT aligned,
260    * but have some top/left corner stitched to some other TOP/LEFT-aligned button,
261    * because of 'corrective' hack in widget_roundbox_set()... */
262   UI_BUT_ALIGN_STITCH_TOP = 1 << 18,
263   UI_BUT_ALIGN_STITCH_LEFT = 1 << 19,
264   UI_BUT_ALIGN_ALL = UI_BUT_ALIGN | UI_BUT_ALIGN_STITCH_TOP | UI_BUT_ALIGN_STITCH_LEFT,
265
266   /** This but is "inside" a box item (currently used to change theme colors). */
267   UI_BUT_BOX_ITEM = 1 << 20,
268
269   /** Active left part of number button */
270   UI_BUT_ACTIVE_LEFT = 1 << 21,
271   /** Active right part of number button */
272   UI_BUT_ACTIVE_RIGHT = 1 << 22,
273
274   /* (also used by search buttons to enforce shortcut display for their items). */
275   /** Button has shortcut text. */
276   UI_BUT_HAS_SHORTCUT = 1 << 23,
277
278   /** Reverse order of consecutive off/on icons */
279   UI_BUT_ICON_REVERSE = 1 << 24,
280
281   /** Value is animated, but the current value differs from the animated one. */
282   UI_BUT_ANIMATED_CHANGED = 1 << 25,
283 };
284
285 /* scale fixed button widths by this to account for DPI */
286
287 #define UI_DPI_FAC (U.dpi_fac)
288 /* 16 to copy ICON_DEFAULT_HEIGHT */
289 #define UI_DPI_ICON_SIZE ((float)16 * UI_DPI_FAC)
290
291 /* Button types, bits stored in 1 value... and a short even!
292  * - bits 0-4:  bitnr (0-31)
293  * - bits 5-7:  pointer type
294  * - bit  8:    for 'bit'
295  * - bit  9-15: button type (now 6 bits, 64 types)
296  * */
297 typedef enum {
298   UI_BUT_POIN_CHAR = 32,
299   UI_BUT_POIN_SHORT = 64,
300   UI_BUT_POIN_INT = 96,
301   UI_BUT_POIN_FLOAT = 128,
302   /*  UI_BUT_POIN_FUNCTION = 192, */ /*UNUSED*/
303   UI_BUT_POIN_BIT = 256,             /* OR'd with a bit index*/
304 } eButPointerType;
305
306 /* requires (but->poin != NULL) */
307 #define UI_BUT_POIN_TYPES (UI_BUT_POIN_FLOAT | UI_BUT_POIN_SHORT | UI_BUT_POIN_CHAR)
308
309 /* assigned to but->type, OR'd with the flags above when passing args */
310 typedef enum {
311   UI_BTYPE_BUT = 1 << 9,
312   UI_BTYPE_ROW = 2 << 9,
313   UI_BTYPE_TEXT = 3 << 9,
314   /** dropdown list */
315   UI_BTYPE_MENU = 4 << 9,
316   UI_BTYPE_BUT_MENU = 5 << 9,
317   /** number button */
318   UI_BTYPE_NUM = 6 << 9,
319   /** number slider */
320   UI_BTYPE_NUM_SLIDER = 7 << 9,
321   UI_BTYPE_TOGGLE = 8 << 9,
322   UI_BTYPE_TOGGLE_N = 9 << 9,
323   UI_BTYPE_ICON_TOGGLE = 10 << 9,
324   UI_BTYPE_ICON_TOGGLE_N = 11 << 9,
325   /** same as regular toggle, but no on/off state displayed */
326   UI_BTYPE_BUT_TOGGLE = 12 << 9,
327   /** similar to toggle, display a 'tick' */
328   UI_BTYPE_CHECKBOX = 13 << 9,
329   UI_BTYPE_CHECKBOX_N = 14 << 9,
330   UI_BTYPE_COLOR = 15 << 9,
331   UI_BTYPE_TAB = 16 << 9,
332   UI_BTYPE_POPOVER = 17 << 9,
333   UI_BTYPE_SCROLL = 18 << 9,
334   UI_BTYPE_BLOCK = 19 << 9,
335   UI_BTYPE_LABEL = 20 << 9,
336   UI_BTYPE_KEY_EVENT = 24 << 9,
337   UI_BTYPE_HSVCUBE = 26 << 9,
338   /** menu (often used in headers), **_MENU /w different draw-type */
339   UI_BTYPE_PULLDOWN = 27 << 9,
340   UI_BTYPE_ROUNDBOX = 28 << 9,
341   UI_BTYPE_COLORBAND = 30 << 9,
342   /** sphere widget (used to input a unit-vector, aka normal) */
343   UI_BTYPE_UNITVEC = 31 << 9,
344   UI_BTYPE_CURVE = 32 << 9,
345   UI_BTYPE_LISTBOX = 36 << 9,
346   UI_BTYPE_LISTROW = 37 << 9,
347   UI_BTYPE_HSVCIRCLE = 38 << 9,
348   UI_BTYPE_TRACK_PREVIEW = 40 << 9,
349
350   /** Buttons with value >= #UI_BTYPE_SEARCH_MENU don't get undo pushes. */
351   UI_BTYPE_SEARCH_MENU = 41 << 9,
352   UI_BTYPE_EXTRA = 42 << 9,
353   UI_BTYPE_HOTKEY_EVENT = 46 << 9,
354   /** Non-interactive image, used for splash screen */
355   UI_BTYPE_IMAGE = 47 << 9,
356   UI_BTYPE_HISTOGRAM = 48 << 9,
357   UI_BTYPE_WAVEFORM = 49 << 9,
358   UI_BTYPE_VECTORSCOPE = 50 << 9,
359   UI_BTYPE_PROGRESS_BAR = 51 << 9,
360   UI_BTYPE_NODE_SOCKET = 53 << 9,
361   UI_BTYPE_SEPR = 54 << 9,
362   UI_BTYPE_SEPR_LINE = 55 << 9,
363   /** Dynamically fill available space. */
364   UI_BTYPE_SEPR_SPACER = 56 << 9,
365   /** Resize handle (resize uilist). */
366   UI_BTYPE_GRIP = 57 << 9,
367 } eButType;
368
369 #define BUTTYPE (63 << 9)
370
371 /** Gradient types, for color picker #UI_BTYPE_HSVCUBE etc. */
372 enum {
373   UI_GRAD_SV = 0,
374   UI_GRAD_HV = 1,
375   UI_GRAD_HS = 2,
376   UI_GRAD_H = 3,
377   UI_GRAD_S = 4,
378   UI_GRAD_V = 5,
379
380   UI_GRAD_V_ALT = 9,
381   UI_GRAD_L_ALT = 10,
382 };
383
384 #define UI_PALETTE_COLOR 20
385
386 /* Drawing
387  *
388  * Functions to draw various shapes, taking theme settings into account.
389  * Used for code that draws its own UI style elements. */
390
391 void UI_draw_anti_tria(
392     float x1, float y1, float x2, float y2, float x3, float y3, const float color[4]);
393 void UI_draw_anti_fan(float tri_array[][2], unsigned int length, const float color[4]);
394
395 void UI_draw_roundbox_corner_set(int type);
396 void UI_draw_roundbox_aa(
397     bool filled, float minx, float miny, float maxx, float maxy, float rad, const float color[4]);
398 void UI_draw_roundbox_4fv(
399     bool filled, float minx, float miny, float maxx, float maxy, float rad, const float col[4]);
400 void UI_draw_roundbox_3ubAlpha(bool filled,
401                                float minx,
402                                float miny,
403                                float maxx,
404                                float maxy,
405                                float rad,
406                                const unsigned char col[3],
407                                unsigned char alpha);
408 void UI_draw_roundbox_3fvAlpha(bool filled,
409                                float minx,
410                                float miny,
411                                float maxx,
412                                float maxy,
413                                float rad,
414                                const float col[3],
415                                float alpha);
416 void UI_draw_roundbox_shade_x(bool filled,
417                               float minx,
418                               float miny,
419                               float maxx,
420                               float maxy,
421                               float rad,
422                               float shadetop,
423                               float shadedown,
424                               const float col[4]);
425
426 #if 0 /* unused */
427 int UI_draw_roundbox_corner_get(void);
428 void UI_draw_roundbox_shade_y(bool filled,
429                               float minx,
430                               float miny,
431                               float maxx,
432                               float maxy,
433                               float rad,
434                               float shadeleft,
435                               float shaderight,
436                               const float col[4]);
437 #endif
438
439 void UI_draw_box_shadow(unsigned char alpha, float minx, float miny, float maxx, float maxy);
440 void UI_draw_text_underline(int pos_x, int pos_y, int len, int height, const float color[4]);
441
442 void UI_draw_safe_areas(uint pos,
443                         float x1,
444                         float x2,
445                         float y1,
446                         float y2,
447                         const float title_aspect[2],
448                         const float action_aspect[2]);
449
450 /** State for scrolldrawing. */
451 enum {
452   UI_SCROLL_PRESSED = 1 << 0,
453   UI_SCROLL_ARROWS = 1 << 1,
454   UI_SCROLL_NO_OUTLINE = 1 << 2,
455 };
456 void UI_draw_widget_scroll(struct uiWidgetColors *wcol,
457                            const struct rcti *rect,
458                            const struct rcti *slider,
459                            int state);
460
461 /* Shortening string helper. */
462 float UI_text_clip_middle_ex(const struct uiFontStyle *fstyle,
463                              char *str,
464                              float okwidth,
465                              const float minwidth,
466                              const size_t max_len,
467                              const char rpart_sep);
468
469 /**
470  * Callbacks
471  *
472  * UI_block_func_handle_set/ButmFunc are for handling events through a callback.
473  * HandleFunc gets the retval passed on, and ButmFunc gets a2. The latter is
474  * mostly for compatibility with older code.
475  *
476  * - #UI_but_func_complete_set is for tab completion.
477  *
478  * - #uiButSearchFunc is for name buttons, showing a popup with matches
479  *
480  * - #UI_block_func_set and UI_but_func_set are callbacks run when a button is used,
481  *   in case events, operators or RNA are not sufficient to handle the button.
482  *
483  * - #UI_but_funcN_set will free the argument with MEM_freeN. */
484
485 typedef struct uiSearchItems uiSearchItems;
486
487 typedef void (*uiButHandleFunc)(struct bContext *C, void *arg1, void *arg2);
488 typedef void (*uiButHandleRenameFunc)(struct bContext *C, void *arg, char *origstr);
489 typedef void (*uiButHandleNFunc)(struct bContext *C, void *argN, void *arg2);
490 typedef void (*uiButHandleHoldFunc)(struct bContext *C, struct ARegion *butregion, uiBut *but);
491 typedef int (*uiButCompleteFunc)(struct bContext *C, char *str, void *arg);
492 typedef struct ARegion *(*uiButSearchCreateFunc)(struct bContext *C,
493                                                  struct ARegion *butregion,
494                                                  uiBut *but);
495 typedef void (*uiButSearchFunc)(const struct bContext *C,
496                                 void *arg,
497                                 const char *str,
498                                 uiSearchItems *items);
499 /* Must return allocated string. */
500 typedef char *(*uiButToolTipFunc)(struct bContext *C, void *argN, const char *tip);
501 typedef int (*uiButPushedStateFunc)(struct bContext *C, void *arg);
502
503 typedef void (*uiBlockHandleFunc)(struct bContext *C, void *arg, int event);
504
505 /* Menu Callbacks */
506
507 typedef void (*uiMenuCreateFunc)(struct bContext *C, struct uiLayout *layout, void *arg1);
508 typedef void (*uiMenuHandleFunc)(struct bContext *C, void *arg, int event);
509 /**
510  * Used for cycling menu values without opening the menu (Ctrl-Wheel).
511  * \param direction: forward or backwards [1 / -1].
512  * \param arg1: uiBut.poin (as with #uiMenuCreateFunc).
513  * \return true when the button was changed.
514  */
515 typedef bool (*uiMenuStepFunc)(struct bContext *C, int direction, void *arg1);
516
517 /* interface_query.c */
518 bool UI_but_has_tooltip_label(const uiBut *but);
519 bool UI_but_is_tool(const uiBut *but);
520 #define UI_but_is_decorator(but) ((but)->func == ui_but_anim_decorate_cb)
521
522 bool UI_block_is_empty(const uiBlock *block);
523
524 /* interface_region_menu_popup.c */
525 /**
526  * Popup Menus
527  *
528  * Functions used to create popup menus. For more extended menus the
529  * UI_popup_menu_begin/End functions can be used to define own items with
530  * the uiItem functions in between. If it is a simple confirmation menu
531  * or similar, popups can be created with a single function call.
532  */
533 typedef struct uiPopupMenu uiPopupMenu;
534
535 uiPopupMenu *UI_popup_menu_begin(struct bContext *C, const char *title, int icon) ATTR_NONNULL();
536 uiPopupMenu *UI_popup_menu_begin_ex(struct bContext *C,
537                                     const char *title,
538                                     const char *block_name,
539                                     int icon) ATTR_NONNULL();
540 void UI_popup_menu_end(struct bContext *C, struct uiPopupMenu *head);
541 bool UI_popup_menu_end_or_cancel(struct bContext *C, struct uiPopupMenu *head);
542 struct uiLayout *UI_popup_menu_layout(uiPopupMenu *head);
543
544 void UI_popup_menu_reports(struct bContext *C, struct ReportList *reports) ATTR_NONNULL();
545 int UI_popup_menu_invoke(struct bContext *C, const char *idname, struct ReportList *reports)
546     ATTR_NONNULL(1, 2);
547
548 void UI_popup_menu_retval_set(const uiBlock *block, const int retval, const bool enable);
549 void UI_popup_menu_but_set(uiPopupMenu *pup, struct ARegion *butregion, uiBut *but);
550
551 /* interface_region_popover.c */
552
553 typedef struct uiPopover uiPopover;
554
555 int UI_popover_panel_invoke(struct bContext *C,
556                             const char *idname,
557                             bool keep_open,
558                             struct ReportList *reports);
559
560 uiPopover *UI_popover_begin(struct bContext *C, int menu_width) ATTR_NONNULL(1);
561 void UI_popover_end(struct bContext *C, struct uiPopover *head, struct wmKeyMap *keymap);
562 struct uiLayout *UI_popover_layout(uiPopover *head);
563 void UI_popover_once_clear(uiPopover *pup);
564
565 /* interface_region_menu_pie.c */
566 /* Pie menus */
567 typedef struct uiPieMenu uiPieMenu;
568
569 int UI_pie_menu_invoke(struct bContext *C, const char *idname, const struct wmEvent *event);
570 int UI_pie_menu_invoke_from_operator_enum(struct bContext *C,
571                                           const char *title,
572                                           const char *opname,
573                                           const char *propname,
574                                           const struct wmEvent *event);
575 int UI_pie_menu_invoke_from_rna_enum(struct bContext *C,
576                                      const char *title,
577                                      const char *path,
578                                      const struct wmEvent *event);
579
580 struct uiPieMenu *UI_pie_menu_begin(struct bContext *C,
581                                     const char *title,
582                                     int icon,
583                                     const struct wmEvent *event) ATTR_NONNULL();
584 void UI_pie_menu_end(struct bContext *C, uiPieMenu *pie);
585 struct uiLayout *UI_pie_menu_layout(struct uiPieMenu *pie);
586
587 /* interface_region_menu_popup.c */
588
589 /* Popup Blocks
590  *
591  * Functions used to create popup blocks. These are like popup menus
592  * but allow using all button types and creating an own layout. */
593 typedef uiBlock *(*uiBlockCreateFunc)(struct bContext *C, struct ARegion *ar, void *arg1);
594 typedef void (*uiBlockCancelFunc)(struct bContext *C, void *arg1);
595
596 void UI_popup_block_invoke(struct bContext *C, uiBlockCreateFunc func, void *arg);
597 void UI_popup_block_invoke_ex(
598     struct bContext *C, uiBlockCreateFunc func, void *arg, const char *opname, int opcontext);
599 void UI_popup_block_ex(struct bContext *C,
600                        uiBlockCreateFunc func,
601                        uiBlockHandleFunc popup_func,
602                        uiBlockCancelFunc cancel_func,
603                        void *arg,
604                        struct wmOperator *op);
605 #if 0 /* UNUSED */
606 void uiPupBlockOperator(struct bContext *C,
607                         uiBlockCreateFunc func,
608                         struct wmOperator *op,
609                         int opcontext);
610 #endif
611
612 void UI_popup_block_close(struct bContext *C, struct wmWindow *win, uiBlock *block);
613
614 bool UI_popup_block_name_exists(struct bContext *C, const char *name);
615
616 /* Blocks
617  *
618  * Functions for creating, drawing and freeing blocks. A Block is a
619  * container of buttons and used for various purposes.
620  *
621  * Begin/Define Buttons/End/Draw is the typical order in which these
622  * function should be called, though for popup blocks Draw is left out.
623  * Freeing blocks is done by the screen/ module automatically.
624  *
625  * */
626
627 uiBlock *UI_block_begin(const struct bContext *C,
628                         struct ARegion *region,
629                         const char *name,
630                         short dt);
631 void UI_block_end_ex(const struct bContext *C, uiBlock *block, const int xy[2], int r_xy[2]);
632 void UI_block_end(const struct bContext *C, uiBlock *block);
633 void UI_block_draw(const struct bContext *C, struct uiBlock *block);
634 void UI_blocklist_update_window_matrix(const struct bContext *C, const struct ListBase *lb);
635 void UI_blocklist_draw(const struct bContext *C, const struct ListBase *lb);
636 void UI_block_update_from_old(const struct bContext *C, struct uiBlock *block);
637
638 enum {
639   UI_BLOCK_THEME_STYLE_REGULAR = 0,
640   UI_BLOCK_THEME_STYLE_POPUP = 1,
641 };
642 void UI_block_theme_style_set(uiBlock *block, char theme_style);
643 void UI_block_emboss_set(uiBlock *block, char dt);
644
645 void UI_block_free(const struct bContext *C, uiBlock *block);
646 void UI_blocklist_free(const struct bContext *C, struct ListBase *lb);
647 void UI_blocklist_free_inactive(const struct bContext *C, struct ListBase *lb);
648 void UI_screen_free_active_but(const struct bContext *C, struct bScreen *screen);
649
650 void UI_block_region_set(uiBlock *block, struct ARegion *region);
651
652 void UI_block_lock_set(uiBlock *block, bool val, const char *lockstr);
653 void UI_block_lock_clear(uiBlock *block);
654
655 /* automatic aligning, horiz or verical */
656 void UI_block_align_begin(uiBlock *block);
657 void UI_block_align_end(uiBlock *block);
658
659 /* block bounds/position calculation */
660 typedef enum {
661   UI_BLOCK_BOUNDS_NONE = 0,
662   UI_BLOCK_BOUNDS = 1,
663   UI_BLOCK_BOUNDS_TEXT,
664   UI_BLOCK_BOUNDS_POPUP_MOUSE,
665   UI_BLOCK_BOUNDS_POPUP_MENU,
666   UI_BLOCK_BOUNDS_POPUP_CENTER,
667   UI_BLOCK_BOUNDS_PIE_CENTER,
668 } eBlockBoundsCalc;
669
670 void UI_block_bounds_set_normal(struct uiBlock *block, int addval);
671 void UI_block_bounds_set_text(uiBlock *block, int addval);
672 void UI_block_bounds_set_popup(uiBlock *block, int addval, const int bounds_offset[2]);
673 void UI_block_bounds_set_menu(uiBlock *block, int addval, const int bounds_offset[2]);
674 void UI_block_bounds_set_centered(uiBlock *block, int addval);
675 void UI_block_bounds_set_explicit(uiBlock *block, int minx, int miny, int maxx, int maxy);
676
677 int UI_blocklist_min_y_get(struct ListBase *lb);
678
679 void UI_block_direction_set(uiBlock *block, char direction);
680 void UI_block_order_flip(uiBlock *block);
681 void UI_block_flag_enable(uiBlock *block, int flag);
682 void UI_block_flag_disable(uiBlock *block, int flag);
683 void UI_block_translate(uiBlock *block, int x, int y);
684
685 int UI_but_return_value_get(uiBut *but);
686
687 void UI_but_drag_set_id(uiBut *but, struct ID *id);
688 void UI_but_drag_set_rna(uiBut *but, struct PointerRNA *ptr);
689 void UI_but_drag_set_path(uiBut *but, const char *path, const bool use_free);
690 void UI_but_drag_set_name(uiBut *but, const char *name);
691 void UI_but_drag_set_value(uiBut *but);
692 void UI_but_drag_set_image(
693     uiBut *but, const char *path, int icon, struct ImBuf *ima, float scale, const bool use_free);
694
695 bool UI_but_active_drop_name(struct bContext *C);
696 bool UI_but_active_drop_color(struct bContext *C);
697
698 void UI_but_flag_enable(uiBut *but, int flag);
699 void UI_but_flag_disable(uiBut *but, int flag);
700 bool UI_but_flag_is_set(uiBut *but, int flag);
701
702 void UI_but_drawflag_enable(uiBut *but, int flag);
703 void UI_but_drawflag_disable(uiBut *but, int flag);
704
705 void UI_but_type_set_menu_from_pulldown(uiBut *but);
706
707 /* special button case, only draw it when used actively, for outliner etc */
708 bool UI_but_active_only(const struct bContext *C, struct ARegion *ar, uiBlock *block, uiBut *but);
709 bool UI_block_active_only_flagged_buttons(const struct bContext *C,
710                                           struct ARegion *ar,
711                                           struct uiBlock *block);
712
713 void UI_but_execute(const struct bContext *C, uiBut *but);
714
715 bool UI_but_online_manual_id(const uiBut *but,
716                              char *r_str,
717                              size_t maxlength) ATTR_WARN_UNUSED_RESULT;
718 bool UI_but_online_manual_id_from_active(const struct bContext *C,
719                                          char *r_str,
720                                          size_t maxlength) ATTR_WARN_UNUSED_RESULT;
721
722 /* Buttons
723  *
724  * Functions to define various types of buttons in a block. Postfixes:
725  * - F: float
726  * - I: int
727  * - S: short
728  * - C: char
729  * - R: RNA
730  * - O: operator */
731
732 uiBut *uiDefBut(uiBlock *block,
733                 int type,
734                 int retval,
735                 const char *str,
736                 int x1,
737                 int y1,
738                 short x2,
739                 short y2,
740                 void *poin,
741                 float min,
742                 float max,
743                 float a1,
744                 float a2,
745                 const char *tip);
746 uiBut *uiDefButF(uiBlock *block,
747                  int type,
748                  int retval,
749                  const char *str,
750                  int x,
751                  int y,
752                  short width,
753                  short height,
754                  float *poin,
755                  float min,
756                  float max,
757                  float a1,
758                  float a2,
759                  const char *tip);
760 uiBut *uiDefButBitF(uiBlock *block,
761                     int type,
762                     int bit,
763                     int retval,
764                     const char *str,
765                     int x,
766                     int y,
767                     short width,
768                     short height,
769                     float *poin,
770                     float min,
771                     float max,
772                     float a1,
773                     float a2,
774                     const char *tip);
775 uiBut *uiDefButI(uiBlock *block,
776                  int type,
777                  int retval,
778                  const char *str,
779                  int x,
780                  int y,
781                  short width,
782                  short height,
783                  int *poin,
784                  float min,
785                  float max,
786                  float a1,
787                  float a2,
788                  const char *tip);
789 uiBut *uiDefButBitI(uiBlock *block,
790                     int type,
791                     int bit,
792                     int retval,
793                     const char *str,
794                     int x,
795                     int y,
796                     short width,
797                     short height,
798                     int *poin,
799                     float min,
800                     float max,
801                     float a1,
802                     float a2,
803                     const char *tip);
804 uiBut *uiDefButS(uiBlock *block,
805                  int type,
806                  int retval,
807                  const char *str,
808                  int x,
809                  int y,
810                  short width,
811                  short height,
812                  short *poin,
813                  float min,
814                  float max,
815                  float a1,
816                  float a2,
817                  const char *tip);
818 uiBut *uiDefButBitS(uiBlock *block,
819                     int type,
820                     int bit,
821                     int retval,
822                     const char *str,
823                     int x,
824                     int y,
825                     short width,
826                     short height,
827                     short *poin,
828                     float min,
829                     float max,
830                     float a1,
831                     float a2,
832                     const char *tip);
833 uiBut *uiDefButC(uiBlock *block,
834                  int type,
835                  int retval,
836                  const char *str,
837                  int x,
838                  int y,
839                  short width,
840                  short height,
841                  char *poin,
842                  float min,
843                  float max,
844                  float a1,
845                  float a2,
846                  const char *tip);
847 uiBut *uiDefButBitC(uiBlock *block,
848                     int type,
849                     int bit,
850                     int retval,
851                     const char *str,
852                     int x,
853                     int y,
854                     short width,
855                     short height,
856                     char *poin,
857                     float min,
858                     float max,
859                     float a1,
860                     float a2,
861                     const char *tip);
862 uiBut *uiDefButR(uiBlock *block,
863                  int type,
864                  int retval,
865                  const char *str,
866                  int x,
867                  int y,
868                  short width,
869                  short height,
870                  struct PointerRNA *ptr,
871                  const char *propname,
872                  int index,
873                  float min,
874                  float max,
875                  float a1,
876                  float a2,
877                  const char *tip);
878 uiBut *uiDefButR_prop(uiBlock *block,
879                       int type,
880                       int retval,
881                       const char *str,
882                       int x,
883                       int y,
884                       short width,
885                       short height,
886                       struct PointerRNA *ptr,
887                       struct PropertyRNA *prop,
888                       int index,
889                       float min,
890                       float max,
891                       float a1,
892                       float a2,
893                       const char *tip);
894 uiBut *uiDefButO(uiBlock *block,
895                  int type,
896                  const char *opname,
897                  int opcontext,
898                  const char *str,
899                  int x,
900                  int y,
901                  short width,
902                  short height,
903                  const char *tip);
904 uiBut *uiDefButO_ptr(uiBlock *block,
905                      int type,
906                      struct wmOperatorType *ot,
907                      int opcontext,
908                      const char *str,
909                      int x,
910                      int y,
911                      short width,
912                      short height,
913                      const char *tip);
914
915 uiBut *uiDefIconBut(uiBlock *block,
916                     int type,
917                     int retval,
918                     int icon,
919                     int x1,
920                     int y1,
921                     short x2,
922                     short y2,
923                     void *poin,
924                     float min,
925                     float max,
926                     float a1,
927                     float a2,
928                     const char *tip);
929 uiBut *uiDefIconButF(uiBlock *block,
930                      int type,
931                      int retval,
932                      int icon,
933                      int x,
934                      int y,
935                      short width,
936                      short height,
937                      float *poin,
938                      float min,
939                      float max,
940                      float a1,
941                      float a2,
942                      const char *tip);
943 uiBut *uiDefIconButBitF(uiBlock *block,
944                         int type,
945                         int bit,
946                         int retval,
947                         int icon,
948                         int x,
949                         int y,
950                         short width,
951                         short height,
952                         float *poin,
953                         float min,
954                         float max,
955                         float a1,
956                         float a2,
957                         const char *tip);
958 uiBut *uiDefIconButI(uiBlock *block,
959                      int type,
960                      int retval,
961                      int icon,
962                      int x,
963                      int y,
964                      short width,
965                      short height,
966                      int *poin,
967                      float min,
968                      float max,
969                      float a1,
970                      float a2,
971                      const char *tip);
972 uiBut *uiDefIconButBitI(uiBlock *block,
973                         int type,
974                         int bit,
975                         int retval,
976                         int icon,
977                         int x,
978                         int y,
979                         short width,
980                         short height,
981                         int *poin,
982                         float min,
983                         float max,
984                         float a1,
985                         float a2,
986                         const char *tip);
987 uiBut *uiDefIconButS(uiBlock *block,
988                      int type,
989                      int retval,
990                      int icon,
991                      int x,
992                      int y,
993                      short width,
994                      short height,
995                      short *poin,
996                      float min,
997                      float max,
998                      float a1,
999                      float a2,
1000                      const char *tip);
1001 uiBut *uiDefIconButBitS(uiBlock *block,
1002                         int type,
1003                         int bit,
1004                         int retval,
1005                         int icon,
1006                         int x,
1007                         int y,
1008                         short width,
1009                         short height,
1010                         short *poin,
1011                         float min,
1012                         float max,
1013                         float a1,
1014                         float a2,
1015                         const char *tip);
1016 uiBut *uiDefIconButC(uiBlock *block,
1017                      int type,
1018                      int retval,
1019                      int icon,
1020                      int x,
1021                      int y,
1022                      short width,
1023                      short height,
1024                      char *poin,
1025                      float min,
1026                      float max,
1027                      float a1,
1028                      float a2,
1029                      const char *tip);
1030 uiBut *uiDefIconButBitC(uiBlock *block,
1031                         int type,
1032                         int bit,
1033                         int retval,
1034                         int icon,
1035                         int x,
1036                         int y,
1037                         short width,
1038                         short height,
1039                         char *poin,
1040                         float min,
1041                         float max,
1042                         float a1,
1043                         float a2,
1044                         const char *tip);
1045 uiBut *uiDefIconButR(uiBlock *block,
1046                      int type,
1047                      int retval,
1048                      int icon,
1049                      int x,
1050                      int y,
1051                      short width,
1052                      short height,
1053                      struct PointerRNA *ptr,
1054                      const char *propname,
1055                      int index,
1056                      float min,
1057                      float max,
1058                      float a1,
1059                      float a2,
1060                      const char *tip);
1061 uiBut *uiDefIconButR_prop(uiBlock *block,
1062                           int type,
1063                           int retval,
1064                           int icon,
1065                           int x,
1066                           int y,
1067                           short width,
1068                           short height,
1069                           struct PointerRNA *ptr,
1070                           PropertyRNA *prop,
1071                           int index,
1072                           float min,
1073                           float max,
1074                           float a1,
1075                           float a2,
1076                           const char *tip);
1077 uiBut *uiDefIconButO(uiBlock *block,
1078                      int type,
1079                      const char *opname,
1080                      int opcontext,
1081                      int icon,
1082                      int x,
1083                      int y,
1084                      short width,
1085                      short height,
1086                      const char *tip);
1087 uiBut *uiDefIconButO_ptr(uiBlock *block,
1088                          int type,
1089                          struct wmOperatorType *ot,
1090                          int opcontext,
1091                          int icon,
1092                          int x,
1093                          int y,
1094                          short width,
1095                          short height,
1096                          const char *tip);
1097
1098 uiBut *uiDefIconTextBut(uiBlock *block,
1099                         int type,
1100                         int retval,
1101                         int icon,
1102                         const char *str,
1103                         int x1,
1104                         int y1,
1105                         short x2,
1106                         short y2,
1107                         void *poin,
1108                         float min,
1109                         float max,
1110                         float a1,
1111                         float a2,
1112                         const char *tip);
1113 uiBut *uiDefIconTextButF(uiBlock *block,
1114                          int type,
1115                          int retval,
1116                          int icon,
1117                          const char *str,
1118                          int x,
1119                          int y,
1120                          short width,
1121                          short height,
1122                          float *poin,
1123                          float min,
1124                          float max,
1125                          float a1,
1126                          float a2,
1127                          const char *tip);
1128 uiBut *uiDefIconTextButBitF(uiBlock *block,
1129                             int type,
1130                             int bit,
1131                             int retval,
1132                             int icon,
1133                             const char *str,
1134                             int x,
1135                             int y,
1136                             short width,
1137                             short height,
1138                             float *poin,
1139                             float min,
1140                             float max,
1141                             float a1,
1142                             float a2,
1143                             const char *tip);
1144 uiBut *uiDefIconTextButI(uiBlock *block,
1145                          int type,
1146                          int retval,
1147                          int icon,
1148                          const char *str,
1149                          int x,
1150                          int y,
1151                          short width,
1152                          short height,
1153                          int *poin,
1154                          float min,
1155                          float max,
1156                          float a1,
1157                          float a2,
1158                          const char *tip);
1159 uiBut *uiDefIconTextButBitI(uiBlock *block,
1160                             int type,
1161                             int bit,
1162                             int retval,
1163                             int icon,
1164                             const char *str,
1165                             int x,
1166                             int y,
1167                             short width,
1168                             short height,
1169                             int *poin,
1170                             float min,
1171                             float max,
1172                             float a1,
1173                             float a2,
1174                             const char *tip);
1175 uiBut *uiDefIconTextButS(uiBlock *block,
1176                          int type,
1177                          int retval,
1178                          int icon,
1179                          const char *str,
1180                          int x,
1181                          int y,
1182                          short width,
1183                          short height,
1184                          short *poin,
1185                          float min,
1186                          float max,
1187                          float a1,
1188                          float a2,
1189                          const char *tip);
1190 uiBut *uiDefIconTextButBitS(uiBlock *block,
1191                             int type,
1192                             int bit,
1193                             int retval,
1194                             int icon,
1195                             const char *str,
1196                             int x,
1197                             int y,
1198                             short width,
1199                             short height,
1200                             short *poin,
1201                             float min,
1202                             float max,
1203                             float a1,
1204                             float a2,
1205                             const char *tip);
1206 uiBut *uiDefIconTextButC(uiBlock *block,
1207                          int type,
1208                          int retval,
1209                          int icon,
1210                          const char *str,
1211                          int x,
1212                          int y,
1213                          short width,
1214                          short height,
1215                          char *poin,
1216                          float min,
1217                          float max,
1218                          float a1,
1219                          float a2,
1220                          const char *tip);
1221 uiBut *uiDefIconTextButBitC(uiBlock *block,
1222                             int type,
1223                             int bit,
1224                             int retval,
1225                             int icon,
1226                             const char *str,
1227                             int x,
1228                             int y,
1229                             short width,
1230                             short height,
1231                             char *poin,
1232                             float min,
1233                             float max,
1234                             float a1,
1235                             float a2,
1236                             const char *tip);
1237 uiBut *uiDefIconTextButR(uiBlock *block,
1238                          int type,
1239                          int retval,
1240                          int icon,
1241                          const char *str,
1242                          int x,
1243                          int y,
1244                          short width,
1245                          short height,
1246                          struct PointerRNA *ptr,
1247                          const char *propname,
1248                          int index,
1249                          float min,
1250                          float max,
1251                          float a1,
1252                          float a2,
1253                          const char *tip);
1254 uiBut *uiDefIconTextButR_prop(uiBlock *block,
1255                               int type,
1256                               int retval,
1257                               int icon,
1258                               const char *str,
1259                               int x,
1260                               int y,
1261                               short width,
1262                               short height,
1263                               struct PointerRNA *ptr,
1264                               struct PropertyRNA *prop,
1265                               int index,
1266                               float min,
1267                               float max,
1268                               float a1,
1269                               float a2,
1270                               const char *tip);
1271 uiBut *uiDefIconTextButO(uiBlock *block,
1272                          int type,
1273                          const char *opname,
1274                          int opcontext,
1275                          int icon,
1276                          const char *str,
1277                          int x,
1278                          int y,
1279                          short width,
1280                          short height,
1281                          const char *tip);
1282 uiBut *uiDefIconTextButO_ptr(uiBlock *block,
1283                              int type,
1284                              struct wmOperatorType *ot,
1285                              int opcontext,
1286                              int icon,
1287                              const char *str,
1288                              int x,
1289                              int y,
1290                              short width,
1291                              short height,
1292                              const char *tip);
1293
1294 /* for passing inputs to ButO buttons */
1295 struct PointerRNA *UI_but_operator_ptr_get(uiBut *but);
1296
1297 void UI_but_unit_type_set(uiBut *but, const int unit_type);
1298 int UI_but_unit_type_get(const uiBut *but);
1299
1300 enum {
1301   BUT_GET_RNAPROP_IDENTIFIER = 1,
1302   BUT_GET_RNASTRUCT_IDENTIFIER,
1303   BUT_GET_RNAENUM_IDENTIFIER,
1304   BUT_GET_LABEL,
1305   BUT_GET_RNA_LABEL,
1306   BUT_GET_RNAENUM_LABEL,
1307   BUT_GET_RNA_LABEL_CONTEXT, /* Context specified in CTX_XXX_ macros are just unreachable! */
1308   BUT_GET_TIP,
1309   BUT_GET_RNA_TIP,
1310   BUT_GET_RNAENUM_TIP,
1311   BUT_GET_OP_KEYMAP,
1312   BUT_GET_PROP_KEYMAP,
1313 };
1314
1315 typedef struct uiStringInfo {
1316   int type;
1317   char *strinfo;
1318 } uiStringInfo;
1319
1320 /* Note: Expects pointers to uiStringInfo structs as parameters.
1321  *       Will fill them with translated strings, when possible.
1322  *       Strings in uiStringInfo must be MEM_freeN'ed by caller. */
1323 void UI_but_string_info_get(struct bContext *C, uiBut *but, ...) ATTR_SENTINEL(0);
1324
1325 /* Edit i18n stuff. */
1326 /* Name of the main py op from i18n addon. */
1327 #define EDTSRC_I18N_OP_NAME "UI_OT_edittranslation"
1328
1329 /**
1330  * Special Buttons
1331  *
1332  * Buttons with a more specific purpose:
1333  * - MenuBut: buttons that popup a menu (in headers usually).
1334  * - PulldownBut: like MenuBut, but creating a uiBlock (for compatibility).
1335  * - BlockBut: buttons that popup a block with more buttons.
1336  * - KeyevtBut: buttons that can be used to turn key events into values.
1337  * - PickerButtons: buttons like the color picker (for code sharing).
1338  * - AutoButR: RNA property button with type automatically defined.
1339  */
1340 enum {
1341   UI_ID_RENAME = 1 << 0,
1342   UI_ID_BROWSE = 1 << 1,
1343   UI_ID_ADD_NEW = 1 << 2,
1344   UI_ID_ALONE = 1 << 4,
1345   UI_ID_OPEN = 1 << 3,
1346   UI_ID_DELETE = 1 << 5,
1347   UI_ID_LOCAL = 1 << 6,
1348   UI_ID_AUTO_NAME = 1 << 7,
1349   UI_ID_FAKE_USER = 1 << 8,
1350   UI_ID_PIN = 1 << 9,
1351   UI_ID_PREVIEWS = 1 << 10,
1352   UI_ID_OVERRIDE = 1 << 11,
1353   UI_ID_FULL = UI_ID_RENAME | UI_ID_BROWSE | UI_ID_ADD_NEW | UI_ID_OPEN | UI_ID_ALONE |
1354                UI_ID_DELETE | UI_ID_LOCAL,
1355 };
1356
1357 /**
1358  * Ways to limit what is displayed in ID-search popup.
1359  * \note We may want to add LOCAL, LIBRARY ... as needed.
1360  */
1361 enum {
1362   UI_TEMPLATE_ID_FILTER_ALL = 0,
1363   UI_TEMPLATE_ID_FILTER_AVAILABLE = 1,
1364 };
1365
1366 int UI_icon_from_id(struct ID *id);
1367 int UI_icon_from_report_type(int type);
1368
1369 int UI_icon_from_event_type(short event_type, short event_value);
1370 int UI_icon_from_keymap_item(const struct wmKeyMapItem *kmi, int r_icon_mod[4]);
1371
1372 uiBut *uiDefPulldownBut(uiBlock *block,
1373                         uiBlockCreateFunc func,
1374                         void *arg,
1375                         const char *str,
1376                         int x,
1377                         int y,
1378                         short width,
1379                         short height,
1380                         const char *tip);
1381 uiBut *uiDefMenuBut(uiBlock *block,
1382                     uiMenuCreateFunc func,
1383                     void *arg,
1384                     const char *str,
1385                     int x,
1386                     int y,
1387                     short width,
1388                     short height,
1389                     const char *tip);
1390 uiBut *uiDefIconTextMenuBut(uiBlock *block,
1391                             uiMenuCreateFunc func,
1392                             void *arg,
1393                             int icon,
1394                             const char *str,
1395                             int x,
1396                             int y,
1397                             short width,
1398                             short height,
1399                             const char *tip);
1400 uiBut *uiDefIconMenuBut(uiBlock *block,
1401                         uiMenuCreateFunc func,
1402                         void *arg,
1403                         int icon,
1404                         int x,
1405                         int y,
1406                         short width,
1407                         short height,
1408                         const char *tip);
1409
1410 uiBut *uiDefBlockBut(uiBlock *block,
1411                      uiBlockCreateFunc func,
1412                      void *func_arg1,
1413                      const char *str,
1414                      int x,
1415                      int y,
1416                      short width,
1417                      short height,
1418                      const char *tip);
1419 uiBut *uiDefBlockButN(uiBlock *block,
1420                       uiBlockCreateFunc func,
1421                       void *argN,
1422                       const char *str,
1423                       int x,
1424                       int y,
1425                       short width,
1426                       short height,
1427                       const char *tip);
1428
1429 uiBut *uiDefIconBlockBut(uiBlock *block,
1430                          uiBlockCreateFunc func,
1431                          void *arg,
1432                          int retval,
1433                          int icon,
1434                          int x,
1435                          int y,
1436                          short width,
1437                          short height,
1438                          const char *tip);
1439 uiBut *uiDefIconTextBlockBut(uiBlock *block,
1440                              uiBlockCreateFunc func,
1441                              void *arg,
1442                              int icon,
1443                              const char *str,
1444                              int x,
1445                              int y,
1446                              short width,
1447                              short height,
1448                              const char *tip);
1449
1450 uiBut *uiDefKeyevtButS(uiBlock *block,
1451                        int retval,
1452                        const char *str,
1453                        int x,
1454                        int y,
1455                        short width,
1456                        short height,
1457                        short *spoin,
1458                        const char *tip);
1459 uiBut *uiDefHotKeyevtButS(uiBlock *block,
1460                           int retval,
1461                           const char *str,
1462                           int x,
1463                           int y,
1464                           short width,
1465                           short height,
1466                           short *keypoin,
1467                           short *modkeypoin,
1468                           const char *tip);
1469
1470 uiBut *uiDefSearchBut(uiBlock *block,
1471                       void *arg,
1472                       int retval,
1473                       int icon,
1474                       int maxlen,
1475                       int x,
1476                       int y,
1477                       short width,
1478                       short height,
1479                       float a1,
1480                       float a2,
1481                       const char *tip);
1482 uiBut *uiDefSearchButO_ptr(uiBlock *block,
1483                            struct wmOperatorType *ot,
1484                            struct IDProperty *properties,
1485                            void *arg,
1486                            int retval,
1487                            int icon,
1488                            int maxlen,
1489                            int x,
1490                            int y,
1491                            short width,
1492                            short height,
1493                            float a1,
1494                            float a2,
1495                            const char *tip);
1496
1497 /* For uiDefAutoButsRNA */
1498 typedef enum {
1499   /* Keep current layout for aligning label with property button. */
1500   UI_BUT_LABEL_ALIGN_NONE,
1501   /* Align label and property button vertically. */
1502   UI_BUT_LABEL_ALIGN_COLUMN,
1503   /* Split layout into a column for the label and one for property button. */
1504   UI_BUT_LABEL_ALIGN_SPLIT_COLUMN,
1505 } eButLabelAlign;
1506
1507 /* Return info for uiDefAutoButsRNA */
1508 typedef enum {
1509   /* Returns when no buttons were added */
1510   UI_PROP_BUTS_NONE_ADDED = 1 << 0,
1511   /* Returned when any property failed the custom check callback (check_prop) */
1512   UI_PROP_BUTS_ANY_FAILED_CHECK = 1 << 1,
1513 } eAutoPropButsReturn;
1514
1515 uiBut *uiDefAutoButR(uiBlock *block,
1516                      struct PointerRNA *ptr,
1517                      struct PropertyRNA *prop,
1518                      int index,
1519                      const char *name,
1520                      int icon,
1521                      int x1,
1522                      int y1,
1523                      int x2,
1524                      int y2);
1525 eAutoPropButsReturn uiDefAutoButsRNA(uiLayout *layout,
1526                                      struct PointerRNA *ptr,
1527                                      bool (*check_prop)(struct PointerRNA *ptr,
1528                                                         struct PropertyRNA *prop,
1529                                                         void *user_data),
1530                                      void *user_data,
1531                                      struct PropertyRNA *prop_activate_init,
1532                                      eButLabelAlign label_align,
1533                                      const bool compact);
1534
1535 /* use inside searchfunc to add items */
1536 bool UI_search_item_add(uiSearchItems *items, const char *name, void *poin, int iconid);
1537 /* bfunc gets search item *poin as arg2, or if NULL the old string */
1538 void UI_but_func_search_set(uiBut *but,
1539                             uiButSearchCreateFunc cfunc,
1540                             uiButSearchFunc sfunc,
1541                             void *arg,
1542                             bool free_arg,
1543                             uiButHandleFunc bfunc,
1544                             void *active);
1545 /* height in pixels, it's using hardcoded values still */
1546 int UI_searchbox_size_y(void);
1547 int UI_searchbox_size_x(void);
1548 /* check if a string is in an existing search box */
1549 int UI_search_items_find_index(uiSearchItems *items, const char *name);
1550
1551 void UI_block_func_handle_set(uiBlock *block, uiBlockHandleFunc func, void *arg);
1552 void UI_block_func_butmenu_set(uiBlock *block, uiMenuHandleFunc func, void *arg);
1553 void UI_block_func_set(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2);
1554 void UI_block_funcN_set(uiBlock *block, uiButHandleNFunc funcN, void *argN, void *arg2);
1555
1556 void UI_but_func_rename_set(uiBut *but, uiButHandleRenameFunc func, void *arg1);
1557 void UI_but_func_set(uiBut *but, uiButHandleFunc func, void *arg1, void *arg2);
1558 void UI_but_funcN_set(uiBut *but, uiButHandleNFunc funcN, void *argN, void *arg2);
1559
1560 void UI_but_func_complete_set(uiBut *but, uiButCompleteFunc func, void *arg);
1561
1562 void UI_but_func_drawextra_set(
1563     uiBlock *block,
1564     void (*func)(const struct bContext *C, void *, void *, void *, struct rcti *rect),
1565     void *arg1,
1566     void *arg2);
1567
1568 void UI_but_func_menu_step_set(uiBut *but, uiMenuStepFunc func);
1569
1570 void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *argN);
1571 void UI_but_tooltip_refresh(struct bContext *C, uiBut *but);
1572 void UI_but_tooltip_timer_remove(struct bContext *C, uiBut *but);
1573
1574 bool UI_textbutton_activate_rna(const struct bContext *C,
1575                                 struct ARegion *ar,
1576                                 const void *rna_poin_data,
1577                                 const char *rna_prop_id);
1578 bool UI_textbutton_activate_but(const struct bContext *C, uiBut *but);
1579
1580 void UI_but_focus_on_enter_event(struct wmWindow *win, uiBut *but);
1581
1582 void UI_but_func_hold_set(uiBut *but, uiButHandleHoldFunc func, void *argN);
1583
1584 void UI_but_func_pushed_state_set(uiBut *but, uiButPushedStateFunc func, void *arg);
1585
1586 /* Autocomplete
1587  *
1588  * Tab complete helper functions, for use in uiButCompleteFunc callbacks.
1589  * Call begin once, then multiple times do_name with all possibilities,
1590  * and finally end to finish and get the completed name. */
1591
1592 typedef struct AutoComplete AutoComplete;
1593
1594 #define AUTOCOMPLETE_NO_MATCH 0
1595 #define AUTOCOMPLETE_FULL_MATCH 1
1596 #define AUTOCOMPLETE_PARTIAL_MATCH 2
1597
1598 AutoComplete *UI_autocomplete_begin(const char *startname, size_t maxlen);
1599 void UI_autocomplete_update_name(AutoComplete *autocpl, const char *name);
1600 int UI_autocomplete_end(AutoComplete *autocpl, char *autoname);
1601
1602 /* Panels
1603  *
1604  * Functions for creating, freeing and drawing panels. The API here
1605  * could use a good cleanup, though how they will function in 2.5 is
1606  * not clear yet so we postpone that. */
1607
1608 void UI_panels_begin(const struct bContext *C, struct ARegion *ar);
1609 void UI_panels_end(const struct bContext *C, struct ARegion *ar, int *r_x, int *r_y);
1610 void UI_panels_draw(const struct bContext *C, struct ARegion *ar);
1611
1612 struct Panel *UI_panel_find_by_type(struct ListBase *lb, struct PanelType *pt);
1613 struct Panel *UI_panel_begin(struct ScrArea *sa,
1614                              struct ARegion *ar,
1615                              struct ListBase *lb,
1616                              uiBlock *block,
1617                              struct PanelType *pt,
1618                              struct Panel *pa,
1619                              bool *r_open);
1620 void UI_panel_end(uiBlock *block, int width, int height);
1621 void UI_panels_scale(struct ARegion *ar, float new_width);
1622 void UI_panel_label_offset(struct uiBlock *block, int *r_x, int *r_y);
1623 int UI_panel_size_y(const struct Panel *pa);
1624
1625 bool UI_panel_category_is_visible(struct ARegion *ar);
1626 void UI_panel_category_add(struct ARegion *ar, const char *name);
1627 struct PanelCategoryDyn *UI_panel_category_find(struct ARegion *ar, const char *idname);
1628 struct PanelCategoryStack *UI_panel_category_active_find(struct ARegion *ar, const char *idname);
1629 const char *UI_panel_category_active_get(struct ARegion *ar, bool set_fallback);
1630 void UI_panel_category_active_set(struct ARegion *ar, const char *idname);
1631 struct PanelCategoryDyn *UI_panel_category_find_mouse_over_ex(struct ARegion *ar,
1632                                                               const int x,
1633                                                               const int y);
1634 struct PanelCategoryDyn *UI_panel_category_find_mouse_over(struct ARegion *ar,
1635                                                            const struct wmEvent *event);
1636 void UI_panel_category_clear_all(struct ARegion *ar);
1637 void UI_panel_category_draw_all(struct ARegion *ar, const char *category_id_active);
1638
1639 struct PanelType *UI_paneltype_find(int space_id, int region_id, const char *idname);
1640
1641 /* Handlers
1642  *
1643  * Handlers that can be registered in regions, areas and windows for
1644  * handling WM events. Mostly this is done automatic by modules such
1645  * as screen/ if ED_KEYMAP_UI is set, or internally in popup functions. */
1646
1647 void UI_region_handlers_add(struct ListBase *handlers);
1648 void UI_popup_handlers_add(struct bContext *C,
1649                            struct ListBase *handlers,
1650                            uiPopupBlockHandle *popup,
1651                            const char flag);
1652 void UI_popup_handlers_remove(struct ListBase *handlers, uiPopupBlockHandle *popup);
1653 void UI_popup_handlers_remove_all(struct bContext *C, struct ListBase *handlers);
1654
1655 /* Module
1656  *
1657  * init and exit should be called before using this module. init_userdef must
1658  * be used to reinitialize some internal state if user preferences change. */
1659
1660 void UI_init(void);
1661 void UI_init_userdef(struct Main *bmain);
1662 void UI_reinit_font(void);
1663 void UI_exit(void);
1664
1665 /* Layout
1666  *
1667  * More automated layout of buttons. Has three levels:
1668  * - Layout: contains a number templates, within a bounded width or height.
1669  * - Template: predefined layouts for buttons with a number of slots, each
1670  *   slot can contain multiple items.
1671  * - Item: item to put in a template slot, being either an RNA property,
1672  *   operator, label or menu. Also regular buttons can be used when setting
1673  *   uiBlockCurLayout. */
1674
1675 /* layout */
1676 enum {
1677   UI_LAYOUT_HORIZONTAL = 0,
1678   UI_LAYOUT_VERTICAL = 1,
1679 };
1680
1681 enum {
1682   UI_LAYOUT_PANEL = 0,
1683   UI_LAYOUT_HEADER = 1,
1684   UI_LAYOUT_MENU = 2,
1685   UI_LAYOUT_TOOLBAR = 3,
1686   UI_LAYOUT_PIEMENU = 4,
1687   UI_LAYOUT_VERT_BAR = 5,
1688 };
1689
1690 #define UI_UNIT_X ((void)0, U.widget_unit)
1691 #define UI_UNIT_Y ((void)0, U.widget_unit)
1692
1693 enum {
1694   UI_LAYOUT_ALIGN_EXPAND = 0,
1695   UI_LAYOUT_ALIGN_LEFT = 1,
1696   UI_LAYOUT_ALIGN_CENTER = 2,
1697   UI_LAYOUT_ALIGN_RIGHT = 3,
1698 };
1699
1700 enum {
1701   UI_ITEM_O_RETURN_PROPS = 1 << 0,
1702   UI_ITEM_R_EXPAND = 1 << 1,
1703   UI_ITEM_R_SLIDER = 1 << 2,
1704   UI_ITEM_R_TOGGLE = 1 << 3,
1705   UI_ITEM_R_ICON_ONLY = 1 << 4,
1706   UI_ITEM_R_EVENT = 1 << 5,
1707   UI_ITEM_R_FULL_EVENT = 1 << 6,
1708   UI_ITEM_R_NO_BG = 1 << 7,
1709   UI_ITEM_R_IMMEDIATE = 1 << 8,
1710   UI_ITEM_O_DEPRESS = 1 << 9,
1711   UI_ITEM_R_COMPACT = 1 << 10,
1712 };
1713
1714 #define UI_HEADER_OFFSET ((void)0, 0.4f * UI_UNIT_X)
1715
1716 /* uiLayoutOperatorButs flags */
1717 enum {
1718   UI_TEMPLATE_OP_PROPS_SHOW_TITLE = 1 << 0,
1719   UI_TEMPLATE_OP_PROPS_SHOW_EMPTY = 1 << 1,
1720   UI_TEMPLATE_OP_PROPS_COMPACT = 1 << 2,
1721   UI_TEMPLATE_OP_PROPS_HIDE_ADVANCED = 1 << 3,
1722 };
1723
1724 /* used for transp checkers */
1725 #define UI_ALPHA_CHECKER_DARK 100
1726 #define UI_ALPHA_CHECKER_LIGHT 160
1727
1728 /* flags to set which corners will become rounded:
1729  *
1730  * 1------2
1731  * |      |
1732  * 8------4 */
1733
1734 enum {
1735   UI_CNR_TOP_LEFT = 1 << 0,
1736   UI_CNR_TOP_RIGHT = 1 << 1,
1737   UI_CNR_BOTTOM_RIGHT = 1 << 2,
1738   UI_CNR_BOTTOM_LEFT = 1 << 3,
1739   /* just for convenience */
1740   UI_CNR_NONE = 0,
1741   UI_CNR_ALL = (UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT),
1742 };
1743
1744 uiLayout *UI_block_layout(uiBlock *block,
1745                           int dir,
1746                           int type,
1747                           int x,
1748                           int y,
1749                           int size,
1750                           int em,
1751                           int padding,
1752                           struct uiStyle *style);
1753 void UI_block_layout_set_current(uiBlock *block, uiLayout *layout);
1754 void UI_block_layout_resolve(uiBlock *block, int *r_x, int *r_y);
1755
1756 void UI_region_message_subscribe(struct ARegion *ar, struct wmMsgBus *mbus);
1757
1758 uiBlock *uiLayoutGetBlock(uiLayout *layout);
1759
1760 void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
1761 void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct PointerRNA *ptr);
1762 void uiLayoutContextCopy(uiLayout *layout, struct bContextStore *context);
1763 struct MenuType *UI_but_menutype_get(uiBut *but);
1764 struct PanelType *UI_but_paneltype_get(uiBut *but);
1765 void UI_menutype_draw(struct bContext *C, struct MenuType *mt, struct uiLayout *layout);
1766 void UI_paneltype_draw(struct bContext *C, struct PanelType *pt, struct uiLayout *layout);
1767
1768 /* Only for convenience. */
1769 void uiLayoutSetContextFromBut(uiLayout *layout, uiBut *but);
1770
1771 void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext);
1772 void uiLayoutSetActive(uiLayout *layout, bool active);
1773 void uiLayoutSetActiveDefault(uiLayout *layout, bool active_default);
1774 void uiLayoutSetActivateInit(uiLayout *layout, bool active);
1775 void uiLayoutSetEnabled(uiLayout *layout, bool enabled);
1776 void uiLayoutSetRedAlert(uiLayout *layout, bool redalert);
1777 void uiLayoutSetAlignment(uiLayout *layout, char alignment);
1778 void uiLayoutSetKeepAspect(uiLayout *layout, bool keepaspect);
1779 void uiLayoutSetScaleX(uiLayout *layout, float scale);
1780 void uiLayoutSetScaleY(uiLayout *layout, float scale);
1781 void uiLayoutSetUnitsX(uiLayout *layout, float unit);
1782 void uiLayoutSetUnitsY(uiLayout *layout, float unit);
1783 void uiLayoutSetEmboss(uiLayout *layout, char emboss);
1784 void uiLayoutSetPropSep(uiLayout *layout, bool is_sep);
1785 void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep);
1786 int uiLayoutGetLocalDir(const uiLayout *layout);
1787
1788 int uiLayoutGetOperatorContext(uiLayout *layout);
1789 bool uiLayoutGetActive(uiLayout *layout);
1790 bool uiLayoutGetActiveDefault(uiLayout *layout);
1791 bool uiLayoutGetActivateInit(uiLayout *layout);
1792 bool uiLayoutGetEnabled(uiLayout *layout);
1793 bool uiLayoutGetRedAlert(uiLayout *layout);
1794 int uiLayoutGetAlignment(uiLayout *layout);
1795 bool uiLayoutGetKeepAspect(uiLayout *layout);
1796 int uiLayoutGetWidth(uiLayout *layout);
1797 float uiLayoutGetScaleX(uiLayout *layout);
1798 float uiLayoutGetScaleY(uiLayout *layout);
1799 float uiLayoutGetUnitsX(uiLayout *layout);
1800 float uiLayoutGetUnitsY(uiLayout *layout);
1801 int uiLayoutGetEmboss(uiLayout *layout);
1802 bool uiLayoutGetPropSep(uiLayout *layout);
1803 bool uiLayoutGetPropDecorate(uiLayout *layout);
1804
1805 /* layout specifiers */
1806 uiLayout *uiLayoutRow(uiLayout *layout, bool align);
1807 uiLayout *uiLayoutColumn(uiLayout *layout, bool align);
1808 uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, bool align);
1809 uiLayout *uiLayoutGridFlow(uiLayout *layout,
1810                            bool row_major,
1811                            int columns_len,
1812                            bool even_columns,
1813                            bool even_rows,
1814                            bool align);
1815 uiLayout *uiLayoutBox(uiLayout *layout);
1816 uiLayout *uiLayoutListBox(uiLayout *layout,
1817                           struct uiList *ui_list,
1818                           struct PointerRNA *ptr,
1819                           struct PropertyRNA *prop,
1820                           struct PointerRNA *actptr,
1821                           struct PropertyRNA *actprop);
1822 uiLayout *uiLayoutAbsolute(uiLayout *layout, bool align);
1823 uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, bool align);
1824 uiLayout *uiLayoutOverlap(uiLayout *layout);
1825 uiBlock *uiLayoutAbsoluteBlock(uiLayout *layout);
1826 uiLayout *uiLayoutRadial(uiLayout *layout);
1827
1828 /* templates */
1829 void uiTemplateHeader(uiLayout *layout, struct bContext *C);
1830 void uiTemplateID(uiLayout *layout,
1831                   struct bContext *C,
1832                   struct PointerRNA *ptr,
1833                   const char *propname,
1834                   const char *newop,
1835                   const char *openop,
1836                   const char *unlinkop,
1837                   int filter,
1838                   const bool live_icon);
1839 void uiTemplateIDBrowse(uiLayout *layout,
1840                         struct bContext *C,
1841                         struct PointerRNA *ptr,
1842                         const char *propname,
1843                         const char *newop,
1844                         const char *openop,
1845                         const char *unlinkop,
1846                         int filter);
1847 void uiTemplateIDPreview(uiLayout *layout,
1848                          struct bContext *C,
1849                          struct PointerRNA *ptr,
1850                          const char *propname,
1851                          const char *newop,
1852                          const char *openop,
1853                          const char *unlinkop,
1854                          int rows,
1855                          int cols,
1856                          int filter,
1857                          const bool hide_buttons);
1858 void uiTemplateIDTabs(uiLayout *layout,
1859                       struct bContext *C,
1860                       PointerRNA *ptr,
1861                       const char *propname,
1862                       const char *newop,
1863                       const char *menu,
1864                       int filter);
1865 void uiTemplateAnyID(uiLayout *layout,
1866                      struct PointerRNA *ptr,
1867                      const char *propname,
1868                      const char *proptypename,
1869                      const char *text);
1870 void uiTemplateSearch(uiLayout *layout,
1871                       struct bContext *C,
1872                       struct PointerRNA *ptr,
1873                       const char *propname,
1874                       struct PointerRNA *searchptr,
1875                       const char *searchpropname,
1876                       const char *newop,
1877                       const char *unlinkop);
1878 void uiTemplateSearchPreview(uiLayout *layout,
1879                              struct bContext *C,
1880                              struct PointerRNA *ptr,
1881                              const char *propname,
1882                              struct PointerRNA *searchptr,
1883                              const char *searchpropname,
1884                              const char *newop,
1885                              const char *unlinkop,
1886                              const int rows,
1887                              const int cols);
1888 void uiTemplatePathBuilder(uiLayout *layout,
1889                            struct PointerRNA *ptr,
1890                            const char *propname,
1891                            struct PointerRNA *root_ptr,
1892                            const char *text);
1893 uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
1894 uiLayout *uiTemplateGpencilModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
1895 void uiTemplateGpencilColorPreview(uiLayout *layout,
1896                                    struct bContext *C,
1897                                    struct PointerRNA *ptr,
1898                                    const char *propname,
1899                                    int rows,
1900                                    int cols,
1901                                    float scale,
1902                                    int filter);
1903
1904 uiLayout *uiTemplateShaderFx(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
1905
1906 void uiTemplateOperatorRedoProperties(uiLayout *layout, const struct bContext *C);
1907
1908 uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
1909 void uiTemplatePreview(uiLayout *layout,
1910                        struct bContext *C,
1911                        struct ID *id,
1912                        bool show_buttons,
1913                        struct ID *parent,
1914                        struct MTex *slot,
1915                        const char *preview_id);
1916 void uiTemplateColorRamp(uiLayout *layout,
1917                          struct PointerRNA *ptr,
1918                          const char *propname,
1919                          bool expand);
1920 void uiTemplateIcon(uiLayout *layout, int icon_value, float icon_scale);
1921 void uiTemplateIconView(uiLayout *layout,
1922                         struct PointerRNA *ptr,
1923                         const char *propname,
1924                         bool show_labels,
1925                         float icon_scale,
1926                         float icon_scale_popup);
1927 void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1928 void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1929 void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1930 void uiTemplateCurveMapping(uiLayout *layout,
1931                             struct PointerRNA *ptr,
1932                             const char *propname,
1933                             int type,
1934                             bool levels,
1935                             bool brush,
1936                             bool neg_slope,
1937                             bool tone);
1938 void uiTemplateColorPicker(uiLayout *layout,
1939                            struct PointerRNA *ptr,
1940                            const char *propname,
1941                            bool value_slider,
1942                            bool lock,
1943                            bool lock_luminosity,
1944                            bool cubic);
1945 void uiTemplatePalette(uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool color);
1946 void uiTemplateCryptoPicker(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1947 void uiTemplateLayers(uiLayout *layout,
1948                       struct PointerRNA *ptr,
1949                       const char *propname,
1950                       PointerRNA *used_ptr,
1951                       const char *used_propname,
1952                       int active_layer);
1953 void uiTemplateImage(uiLayout *layout,
1954                      struct bContext *C,
1955                      struct PointerRNA *ptr,
1956                      const char *propname,
1957                      struct PointerRNA *userptr,
1958                      bool compact,
1959                      bool multiview);
1960 void uiTemplateImageSettings(uiLayout *layout, struct PointerRNA *imfptr, bool color_management);
1961 void uiTemplateImageStereo3d(uiLayout *layout, struct PointerRNA *stereo3d_format_ptr);
1962 void uiTemplateImageViews(uiLayout *layout, struct PointerRNA *imaptr);
1963 void uiTemplateImageFormatViews(uiLayout *layout, PointerRNA *imfptr, PointerRNA *ptr);
1964 void uiTemplateImageLayers(uiLayout *layout,
1965                            struct bContext *C,
1966                            struct Image *ima,
1967                            struct ImageUser *iuser);
1968 void uiTemplateImageInfo(uiLayout *layout,
1969                          struct bContext *C,
1970                          struct Image *ima,
1971                          struct ImageUser *iuser);
1972 void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C);
1973 void UI_but_func_operator_search(uiBut *but);
1974 void uiTemplateOperatorSearch(uiLayout *layout);
1975 eAutoPropButsReturn uiTemplateOperatorPropertyButs(const struct bContext *C,
1976                                                    uiLayout *layout,
1977                                                    struct wmOperator *op,
1978                                                    const eButLabelAlign label_align,
1979                                                    const short flag);
1980 void uiTemplateHeader3D_mode(uiLayout *layout, struct bContext *C);
1981 void uiTemplateHeader3D(uiLayout *layout, struct bContext *C);
1982 void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C);
1983 void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C);
1984 void uiTemplateInputStatus(uiLayout *layout, struct bContext *C);
1985 void uiTemplateKeymapItemProperties(uiLayout *layout, struct PointerRNA *ptr);
1986 void uiTemplateComponentMenu(uiLayout *layout,
1987                              struct PointerRNA *ptr,
1988                              const char *propname,
1989                              const char *name);
1990 void uiTemplateNodeSocket(uiLayout *layout, struct bContext *C, float *color);
1991 void uiTemplateCacheFile(uiLayout *layout,
1992                          struct bContext *C,
1993                          struct PointerRNA *ptr,
1994                          const char *propname);
1995
1996 struct ColorBand *UI_block_get_colorband_from_template_menu(struct uiBlock *block);
1997
1998 /* Default UIList class name, keep in sync with its declaration in bl_ui/__init__.py */
1999 #define UI_UL_DEFAULT_CLASS_NAME "UI_UL_list"
2000 void uiTemplateList(uiLayout *layout,
2001                     struct bContext *C,
2002                     const char *listtype_name,
2003                     const char *list_id,
2004                     struct PointerRNA *dataptr,
2005                     const char *propname,
2006                     struct PointerRNA *active_dataptr,
2007                     const char *active_propname,
2008                     const char *item_dyntip_propname,
2009                     int rows,
2010                     int maxrows,
2011                     int layout_type,
2012                     int columns,
2013                     bool sort_reverse,
2014                     bool sort_lock);
2015 void uiTemplateNodeLink(uiLayout *layout,
2016                         struct bNodeTree *ntree,
2017                         struct bNode *node,
2018                         struct bNodeSocket *input);
2019 void uiTemplateNodeView(uiLayout *layout,
2020                         struct bContext *C,
2021                         struct bNodeTree *ntree,
2022                         struct bNode *node,
2023                         struct bNodeSocket *input);
2024 void uiTemplateTextureUser(uiLayout *layout, struct bContext *C);
2025 void uiTemplateTextureShow(uiLayout *layout,
2026                            struct bContext *C,
2027                            struct PointerRNA *ptr,
2028                            struct PropertyRNA *prop);
2029
2030 void uiTemplateMovieClip(struct uiLayout *layout,
2031                          struct bContext *C,
2032                          struct PointerRNA *ptr,
2033                          const char *propname,
2034                          bool compact);
2035 void uiTemplateTrack(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname);
2036 void uiTemplateMarker(struct uiLayout *layout,
2037                       struct PointerRNA *ptr,
2038                       const char *propname,
2039                       PointerRNA *userptr,
2040                       PointerRNA *trackptr,
2041                       bool compact);
2042 void uiTemplateMovieclipInformation(struct uiLayout *layout,
2043                                     struct PointerRNA *ptr,
2044                                     const char *propname,
2045                                     struct PointerRNA *userptr);
2046
2047 void uiTemplateColorspaceSettings(struct uiLayout *layout,
2048                                   struct PointerRNA *ptr,
2049                                   const char *propname);
2050 void uiTemplateColormanagedViewSettings(struct uiLayout *layout,
2051                                         struct bContext *C,
2052                                         struct PointerRNA *ptr,
2053                                         const char *propname);
2054
2055 int uiTemplateRecentFiles(struct uiLayout *layout, int rows);
2056
2057 /* items */
2058 void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname);
2059 void uiItemEnumO_ptr(uiLayout *layout,
2060                      struct wmOperatorType *ot,
2061                      const char *name,
2062                      int icon,
2063                      const char *propname,
2064                      int value);
2065 void uiItemEnumO(uiLayout *layout,
2066                  const char *opname,
2067                  const char *name,
2068                  int icon,
2069                  const char *propname,
2070                  int value);
2071 void uiItemEnumO_value(uiLayout *layout,
2072                        const char *name,
2073                        int icon,
2074                        const char *opname,
2075                        const char *propname,
2076                        int value);
2077 void uiItemEnumO_string(uiLayout *layout,
2078                         const char *name,
2079                         int icon,
2080                         const char *opname,
2081                         const char *propname,
2082                         const char *value);
2083 void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname);
2084 void uiItemBooleanO(uiLayout *layout,
2085                     const char *name,
2086                     int icon,
2087                     const char *opname,
2088                     const char *propname,
2089                     int value);
2090 void uiItemIntO(uiLayout *layout,
2091                 const char *name,
2092                 int icon,
2093                 const char *opname,
2094                 const char *propname,
2095                 int value);
2096 void uiItemFloatO(uiLayout *layout,
2097                   const char *name,
2098                   int icon,
2099                   const char *opname,
2100                   const char *propname,
2101                   float value);
2102 void uiItemStringO(uiLayout *layout,
2103                    const char *name,
2104                    int icon,
2105                    const char *opname,
2106                    const char *propname,
2107                    const char *value);
2108
2109 void uiItemFullO_ptr(uiLayout *layout,
2110                      struct wmOperatorType *ot,
2111                      const char *name,
2112                      int icon,
2113                      struct IDProperty *properties,
2114                      int context,
2115                      int flag,
2116                      PointerRNA *r_opptr);
2117 void uiItemFullO(uiLayout *layout,
2118                  const char *idname,
2119                  const char *name,
2120                  int icon,
2121                  struct IDProperty *properties,
2122                  int context,
2123                  int flag,
2124                  PointerRNA *r_opptr);
2125 void uiItemFullOMenuHold_ptr(uiLayout *layout,
2126                              struct wmOperatorType *ot,
2127                              const char *name,
2128                              int icon,
2129                              struct IDProperty *properties,
2130                              int context,
2131                              int flag,
2132                              const char *menu_id, /* extra menu arg. */
2133                              PointerRNA *r_opptr);
2134
2135 void uiItemR(uiLayout *layout,
2136              struct PointerRNA *ptr,
2137              const char *propname,
2138              int flag,
2139              const char *name,
2140              int icon);
2141 void uiItemFullR(uiLayout *layout,
2142                  struct PointerRNA *ptr,
2143                  struct PropertyRNA *prop,
2144                  int index,
2145                  int value,
2146                  int flag,
2147                  const char *name,
2148                  int icon);
2149 void uiItemFullR_with_popover(uiLayout *layout,
2150                               struct PointerRNA *ptr,
2151                               struct PropertyRNA *prop,
2152                               int index,
2153                               int value,
2154                               int flag,
2155                               const char *name,
2156                               int icon,
2157                               const char *panel_type);
2158 void uiItemFullR_with_menu(uiLayout *layout,
2159                            struct PointerRNA *ptr,
2160                            struct PropertyRNA *prop,
2161                            int index,
2162                            int value,
2163                            int flag,
2164                            const char *name,
2165                            int icon,
2166                            const char *menu_type);
2167 void uiItemEnumR_prop(uiLayout *layout,
2168                       const char *name,
2169                       int icon,
2170                       struct PointerRNA *ptr,
2171                       PropertyRNA *prop,
2172                       int value);
2173 void uiItemEnumR(uiLayout *layout,
2174                  const char *name,
2175                  int icon,
2176                  struct PointerRNA *ptr,
2177                  const char *propname,
2178                  int value);
2179 void uiItemEnumR_string_prop(uiLayout *layout,
2180                              struct PointerRNA *ptr,
2181                              PropertyRNA *prop,
2182                              const char *value,
2183                              const char *name,
2184                              int icon);
2185 void uiItemEnumR_string(uiLayout *layout,
2186                         struct PointerRNA *ptr,
2187                         const char *propname,
2188                         const char *value,
2189                         const char *name,
2190                         int icon);
2191 void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
2192 void uiItemPointerR_prop(uiLayout *layout,
2193                          struct PointerRNA *ptr,
2194                          PropertyRNA *prop,
2195                          struct PointerRNA *searchptr,
2196                          PropertyRNA *searchprop,
2197                          const char *name,
2198                          int icon);
2199 void uiItemPointerR(uiLayout *layout,
2200                     struct PointerRNA *ptr,
2201                     const char *propname,
2202                     struct PointerRNA *searchptr,
2203                     const char *searchpropname,
2204                     const char *name,
2205                     int icon);
2206 void uiItemsFullEnumO(uiLayout *layout,
2207                       const char *opname,
2208                       const char *propname,
2209                       struct IDProperty *properties,
2210                       int context,
2211                       int flag);
2212 void uiItemsFullEnumO_items(uiLayout *layout,
2213                             struct wmOperatorType *ot,
2214                             PointerRNA ptr,
2215                             PropertyRNA *prop,
2216                             struct IDProperty *properties,
2217                             int context,
2218                             int flag,
2219                             const EnumPropertyItem *item_array,
2220                             int totitem);
2221
2222 void uiItemL(uiLayout *layout, const char *name, int icon); /* label */
2223 /* label icon for dragging */
2224 void uiItemLDrag(uiLayout *layout, struct PointerRNA *ptr, const char *name, int icon);
2225 /* menu */
2226 void uiItemM(uiLayout *layout, const char *menuname, const char *name, int icon);
2227 /* menu contents */
2228 void uiItemMContents(uiLayout *layout, const char *menuname);
2229 /* value */
2230 void uiItemV(uiLayout *layout, const char *name, int icon, int argval);
2231 /* separator */
2232 void uiItemS(uiLayout *layout);
2233 void uiItemS_ex(uiLayout *layout, float factor);
2234 /* Special separator. */
2235 void uiItemSpacer(uiLayout *layout);
2236
2237 void uiItemPopoverPanel_ptr(
2238     uiLayout *layout, struct bContext *C, struct PanelType *pt, const char *name, int icon);
2239 void uiItemPopoverPanel(
2240     uiLayout *layout, struct bContext *C, const char *panelname, const char *name, int icon);
2241 void uiItemPopoverPanelFromGroup(uiLayout *layout,
2242                                  struct bContext *C,
2243                                  int space_id,
2244                                  int region_id,
2245                                  const char *context,
2246                                  const char *category);
2247
2248 void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg);
2249 void uiItemMenuFN(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *argN);
2250 void uiItemMenuEnumO_ptr(uiLayout *layout,
2251                          struct bContext *C,
2252                          struct wmOperatorType *ot,
2253                          const char *propname,
2254                          const char *name,
2255                          int icon);
2256 void uiItemMenuEnumO(uiLayout *layout,
2257                      struct bContext *C,
2258                      const char *opname,
2259                      const char *propname,
2260                      const char *name,
2261                      int icon);
2262 void uiItemMenuEnumR_prop(
2263     uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, const char *name, int icon);
2264 void uiItemMenuEnumR(
2265     uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, int icon);
2266 void uiItemTabsEnumR_prop(uiLayout *layout,
2267                           struct bContext *C,
2268                           struct PointerRNA *ptr,
2269                           PropertyRNA *prop,
2270                           bool icon_only);
2271
2272 /* UI Operators */
2273 typedef struct uiDragColorHandle {
2274   float color[3];
2275   bool gamma_corrected;
2276 } uiDragColorHandle;
2277
2278 void ED_operatortypes_ui(void);
2279 void ED_keymap_ui(struct wmKeyConfig *keyconf);
2280
2281 void UI_drop_color_copy(struct wmDrag *drag, struct wmDropBox *drop);
2282 bool UI_drop_color_poll(struct bContext *C,
2283                         struct wmDrag *drag,
2284                         const struct wmEvent *event,
2285                         const char **tooltip);
2286
2287 bool UI_context_copy_to_selected_list(struct bContext *C,
2288                                       struct PointerRNA *ptr,
2289                                       struct PropertyRNA *prop,
2290                                       struct ListBase *r_lb,
2291                                       bool *r_use_path_from_id,
2292                                       char **r_path);
2293
2294 /* Helpers for Operators */
2295 uiBut *UI_context_active_but_get(const struct bContext *C);
2296 uiBut *UI_context_active_but_prop_get(const struct bContext *C,
2297                                       struct PointerRNA *r_ptr,
2298                                       struct PropertyRNA **r_prop,
2299                                       int *r_index);
2300 void UI_context_active_but_prop_handle(struct bContext *C);
2301 struct wmOperator *UI_context_active_operator_get(const struct bContext *C);
2302 void UI_context_update_anim_flag(const struct bContext *C);
2303 void UI_context_active_but_prop_get_filebrowser(const struct bContext *C,
2304                                                 struct PointerRNA *r_ptr,
2305                                                 struct PropertyRNA **r_prop,
2306                                                 bool *r_is_undo);
2307 void UI_context_active_but_prop_get_templateID(struct bContext *C,
2308                                                struct PointerRNA *r_ptr,
2309                                                struct PropertyRNA **r_prop);
2310 struct ID *UI_context_active_but_get_tab_ID(struct bContext *C);
2311
2312 uiBut *UI_region_active_but_get(struct ARegion *ar);
2313 uiBut *UI_region_but_find_rect_over(const struct ARegion *ar, const struct rcti *isect);
2314
2315 /* uiFontStyle.align */
2316 typedef enum eFontStyle_Align {
2317   UI_STYLE_TEXT_LEFT = 0,
2318   UI_STYLE_TEXT_CENTER = 1,
2319   UI_STYLE_TEXT_RIGHT = 2,
2320 } eFontStyle_Align;
2321
2322 struct uiFontStyleDraw_Params {
2323   eFontStyle_Align align;
2324   uint word_wrap : 1;
2325 };
2326
2327 /* Styled text draw */
2328 void UI_fontstyle_set(const struct uiFontStyle *fs);
2329 void UI_fontstyle_draw_ex(const struct uiFontStyle *fs,
2330                           const struct rcti *rect,
2331                           const char *str,
2332                           const uchar col[4],
2333                           const struct uiFontStyleDraw_Params *fs_params,
2334                           size_t len,
2335                           float *r_xofs,
2336                           float *r_yofs);
2337 void UI_fontstyle_draw(const struct uiFontStyle *fs,
2338                        const struct rcti *rect,
2339                        const char *str,
2340                        const uchar col[4],
2341                        const struct uiFontStyleDraw_Params *fs_params);
2342 void UI_fontstyle_draw_rotated(const struct uiFontStyle *fs,
2343                                const struct rcti *rect,
2344                                const char *str,
2345                                const uchar col[4]);
2346 void UI_fontstyle_draw_simple(
2347     const struct uiFontStyle *fs, float x, float y, const char *str, const uchar col[4]);
2348 void UI_fontstyle_draw_simple_backdrop(const struct uiFontStyle *fs,
2349                                        float x,
2350                                        float y,
2351                                        const char *str,
2352                                        const float col_fg[4],
2353                                        const float col_bg[4]);
2354
2355 int UI_fontstyle_string_width(const struct uiFontStyle *fs, const char *str);
2356 int UI_fontstyle_height_max(const struct uiFontStyle *fs);
2357
2358 void UI_draw_icon_tri(float x, float y, char dir, const float[4]);
2359
2360 struct uiStyle *UI_style_get(void);     /* use for fonts etc */
2361 struct uiStyle *UI_style_get_dpi(void); /* DPI scaled settings for drawing */
2362
2363 /* linker workaround ack! */
2364 void UI_template_fix_linking(void);
2365
2366 /* UI_OT_editsource helpers */
2367 bool UI_editsource_enable_check(void);
2368 void UI_editsource_active_but_test(uiBut *but);
2369
2370 /* UI_butstore_ helpers */
2371 typedef struct uiButStore uiButStore;
2372 typedef struct uiButStoreElem uiButStoreElem;
2373
2374 uiButStore *UI_butstore_create(uiBlock *block);
2375 void UI_butstore_clear(uiBlock *block);
2376 void UI_butstore_update(uiBlock *block);
2377 void UI_butstore_free(uiBlock *block, uiButStore *bs);
2378 bool UI_butstore_is_valid(uiButStore *bs);
2379 bool UI_butstore_is_registered(uiBlock *block, uiBut *but);
2380 void UI_butstore_register(uiButStore *bs_handle, uiBut **but_p);
2381 bool UI_butstore_register_update(uiBlock *block, uiBut *but_dst, const uiBut *but_src);
2382 void UI_butstore_unregister(uiButStore *bs_handle, uiBut **but_p);
2383
2384 /* ui_interface_region_tooltip.c */
2385 struct ARegion *UI_tooltip_create_from_button(struct bContext *C,
2386                                               struct ARegion *butregion,
2387                                               uiBut *but,
2388                                               bool is_label);
2389 struct ARegion *UI_tooltip_create_from_gizmo(struct bContext *C, struct wmGizmo *gz);
2390 void UI_tooltip_free(struct bContext *C, struct bScreen *sc, struct ARegion *ar);
2391
2392 /* How long before a tool-tip shows. */
2393 #define UI_TOOLTIP_DELAY 0.5
2394 #define UI_TOOLTIP_DELAY_LABEL 0.2
2395
2396 /* Float precision helpers */
2397 #define UI_PRECISION_FLOAT_MAX 6
2398 /* For float buttons the 'step' (or a1), is scaled */
2399 #define UI_PRECISION_FLOAT_SCALE 0.01f
2400
2401 /* Typical UI text */
2402 #define UI_FSTYLE_WIDGET (const uiFontStyle *)&(UI_style_get()->widget)
2403
2404 int UI_calc_float_precision(int prec, double value);
2405
2406 /* widget batched drawing */
2407 void UI_widgetbase_draw_cache_begin(void);
2408 void UI_widgetbase_draw_cache_flush(void);
2409 void UI_widgetbase_draw_cache_end(void);
2410
2411 /* Use for resetting the theme. */
2412 void UI_theme_init_default(void);
2413 void UI_style_init_default(void);
2414
2415 /* Special drawing for toolbar, mainly workarounds for inflexible icon sizing. */
2416 #define USE_UI_TOOLBAR_HACK
2417
2418 /* Support click-drag motion which presses the button and closes a popover (like a menu). */
2419 #define USE_UI_POPOVER_ONCE
2420
2421 #endif /* __UI_INTERFACE_H__ */