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