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