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