doxygen: add newline after \file
[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 uneditable */
183         UI_BUT_DISABLED        = 1 << 11,
184         UI_BUT_COLOR_LOCK      = 1 << 12,
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         /** used to flag if color hsv-circle should keep luminance */
197         UI_BUT_VEC_SIZE_LOCK   = 1 << 22,
198         /** cubic saturation for the color wheel */
199         UI_BUT_COLOR_CUBIC     = 1 << 23,
200         /** This but is "inside" a list item (currently used to change theme colors). */
201         UI_BUT_LIST_ITEM       = 1 << 24,
202         /** edit this button as well as the active button (not just dragging) */
203         UI_BUT_DRAG_MULTI      = 1 << 25,
204
205         /** #uiBut.str contains #UI_SEP_CHAR, used for key shortcuts */
206         UI_BUT_HAS_SEP_CHAR    = 1 << 27,
207         /** Don't run updates while dragging (needed in rare cases). */
208         UI_BUT_UPDATE_DELAY    = 1 << 28,
209         /** When widget is in textedit mode, update value on each char stroke */
210         UI_BUT_TEXTEDIT_UPDATE = 1 << 29,
211         /** Show 'x' icon to clear/unlink value of text or search button. */
212         UI_BUT_VALUE_CLEAR     = 1 << 30,
213
214         /** RNA property of the button is overridden from linked reference data. */
215         UI_BUT_OVERRIDEN       = 1u << 31u,
216 };
217
218 #define UI_PANEL_WIDTH          340
219 #define UI_COMPACT_PANEL_WIDTH  160
220 #define UI_NAVIGATION_REGION_WIDTH UI_COMPACT_PANEL_WIDTH
221 #define UI_NARROW_NAVIGATION_REGION_WIDTH 100
222
223 #define UI_PANEL_CATEGORY_MARGIN_WIDTH (U.widget_unit * 1.0f)
224
225 /* but->drawflag - these flags should only affect how the button is drawn. */
226 /* Note: currently, these flags _are not passed_ to the widget's state() or draw() functions
227  *       (except for the 'align' ones)!
228  */
229 enum {
230         /** Text and icon alignment (by default, they are centered). */
231         UI_BUT_TEXT_LEFT         = 1 << 1,
232         UI_BUT_ICON_LEFT         = 1 << 2,
233         UI_BUT_TEXT_RIGHT        = 1 << 3,
234         /** Prevent the button to show any tooltip. */
235         UI_BUT_NO_TOOLTIP        = 1 << 4,
236
237         /* Button align flag, for drawing groups together.
238          * Used in 'uiBlock.flag', take care! */
239         UI_BUT_ALIGN_TOP         = 1 << 14,
240         UI_BUT_ALIGN_LEFT        = 1 << 15,
241         UI_BUT_ALIGN_RIGHT       = 1 << 16,
242         UI_BUT_ALIGN_DOWN        = 1 << 17,
243         UI_BUT_ALIGN             = UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_LEFT | UI_BUT_ALIGN_RIGHT | UI_BUT_ALIGN_DOWN,
244         /* end bits shared with 'uiBlock.flag' */
245
246         /**
247          * Warning - HACK!
248          * Needed for buttons which are not TOP/LEFT aligned,
249          * but have some top/left corner stitched to some other TOP/LEFT-aligned button,
250          * because of 'corrective' hack in widget_roundbox_set()... */
251         UI_BUT_ALIGN_STITCH_TOP  = 1 << 18,
252         UI_BUT_ALIGN_STITCH_LEFT = 1 << 19,
253         UI_BUT_ALIGN_ALL         = UI_BUT_ALIGN | UI_BUT_ALIGN_STITCH_TOP | UI_BUT_ALIGN_STITCH_LEFT,
254
255         /** This but is "inside" a box item (currently used to change theme colors). */
256         UI_BUT_BOX_ITEM          = 1 << 20,
257
258         /** Active left part of number button */
259         UI_BUT_ACTIVE_LEFT       = 1 << 21,
260         /** Active right part of number button */
261         UI_BUT_ACTIVE_RIGHT      = 1 << 22,
262
263         /* (also used by search buttons to enforce shortcut display for their items). */
264         /** Button has shortcut text. */
265         UI_BUT_HAS_SHORTCUT      = 1 << 23,
266
267         /** Reverse order of consecutive off/on icons */
268         UI_BUT_ICON_REVERSE      = 1 << 24,
269
270         /** Value is animated, but the current value differs from the animated one. */
271         UI_BUT_ANIMATED_CHANGED  = 1 << 25,
272 };
273
274 /* scale fixed button widths by this to account for DPI */
275
276 #define UI_DPI_FAC (U.dpi_fac)
277 /* 16 to copy ICON_DEFAULT_HEIGHT */
278 #define UI_DPI_ICON_SIZE ((float)16 * UI_DPI_FAC)
279
280 /* Button types, bits stored in 1 value... and a short even!
281  * - bits 0-4:  bitnr (0-31)
282  * - bits 5-7:  pointer type
283  * - bit  8:    for 'bit'
284  * - bit  9-15: button type (now 6 bits, 64 types)
285  * */
286 typedef enum {
287         UI_BUT_POIN_CHAR = 32,
288         UI_BUT_POIN_SHORT = 64,
289         UI_BUT_POIN_INT = 96,
290         UI_BUT_POIN_FLOAT = 128,
291 /*      UI_BUT_POIN_FUNCTION = 192, */ /*UNUSED*/
292         UI_BUT_POIN_BIT = 256  /* OR'd with a bit index*/
293 } eButPointerType;
294
295 /* requires (but->poin != NULL) */
296 #define UI_BUT_POIN_TYPES (UI_BUT_POIN_FLOAT | UI_BUT_POIN_SHORT | UI_BUT_POIN_CHAR)
297
298 /* assigned to but->type, OR'd with the flags above when passing args */
299 typedef enum {
300         UI_BTYPE_BUT                    = 1 << 9,
301         UI_BTYPE_ROW                    = 2 << 9,
302         UI_BTYPE_TEXT                   = 3 << 9,
303         /** dropdown list */
304         UI_BTYPE_MENU                   = 4 << 9,
305         UI_BTYPE_BUT_MENU               = 5 << 9,
306         /** number button */
307         UI_BTYPE_NUM                    = 6 << 9,
308         /** number slider */
309         UI_BTYPE_NUM_SLIDER             = 7 << 9,
310         UI_BTYPE_TOGGLE                 = 8 << 9,
311         UI_BTYPE_TOGGLE_N               = 9 << 9,
312         UI_BTYPE_ICON_TOGGLE            = 10 << 9,
313         UI_BTYPE_ICON_TOGGLE_N          = 11 << 9,
314         /** same as regular toggle, but no on/off state displayed */
315         UI_BTYPE_BUT_TOGGLE             = 12 << 9,
316         /** similar to toggle, display a 'tick' */
317         UI_BTYPE_CHECKBOX               = 13 << 9,
318         UI_BTYPE_CHECKBOX_N             = 14 << 9,
319         UI_BTYPE_COLOR                  = 15 << 9,
320         UI_BTYPE_TAB                    = 16 << 9,
321         UI_BTYPE_POPOVER                = 17 << 9,
322         UI_BTYPE_SCROLL                 = 18 << 9,
323         UI_BTYPE_BLOCK                  = 19 << 9,
324         UI_BTYPE_LABEL                  = 20 << 9,
325         UI_BTYPE_KEY_EVENT              = 24 << 9,
326         UI_BTYPE_HSVCUBE                = 26 << 9,
327         /** menu (often used in headers), **_MENU /w different draw-type */
328         UI_BTYPE_PULLDOWN               = 27 << 9,
329         UI_BTYPE_ROUNDBOX               = 28 << 9,
330         UI_BTYPE_COLORBAND              = 30 << 9,
331         /** sphere widget (used to input a unit-vector, aka normal) */
332         UI_BTYPE_UNITVEC                = 31 << 9,
333         UI_BTYPE_CURVE                  = 32 << 9,
334         UI_BTYPE_LISTBOX                = 36 << 9,
335         UI_BTYPE_LISTROW                = 37 << 9,
336         UI_BTYPE_HSVCIRCLE              = 38 << 9,
337         UI_BTYPE_TRACK_PREVIEW          = 40 << 9,
338
339         /** Buttons with value >= #UI_BTYPE_SEARCH_MENU don't get undo pushes. */
340         UI_BTYPE_SEARCH_MENU            = 41 << 9,
341         UI_BTYPE_EXTRA                  = 42 << 9,
342         UI_BTYPE_HOTKEY_EVENT           = 46 << 9,
343         /** Non-interactive image, used for splash screen */
344         UI_BTYPE_IMAGE                  = 47 << 9,
345         UI_BTYPE_HISTOGRAM              = 48 << 9,
346         UI_BTYPE_WAVEFORM               = 49 << 9,
347         UI_BTYPE_VECTORSCOPE            = 50 << 9,
348         UI_BTYPE_PROGRESS_BAR           = 51 << 9,
349         UI_BTYPE_NODE_SOCKET            = 53 << 9,
350         UI_BTYPE_SEPR                   = 54 << 9,
351         UI_BTYPE_SEPR_LINE              = 55 << 9,
352         /** Dynamically fill available space. */
353         UI_BTYPE_SEPR_SPACER            = 56 << 9,
354         /** Resize handle (resize uilist). */
355         UI_BTYPE_GRIP                   = 57 << 9,
356 } eButType;
357
358 #define BUTTYPE     (63 << 9)
359
360 /** Gradient types, for color picker #UI_BTYPE_HSVCUBE etc. */
361 enum {
362         UI_GRAD_SV =      0,
363         UI_GRAD_HV =      1,
364         UI_GRAD_HS =      2,
365         UI_GRAD_H =       3,
366         UI_GRAD_S =       4,
367         UI_GRAD_V =       5,
368
369         UI_GRAD_V_ALT =   9,
370         UI_GRAD_L_ALT =   10,
371 };
372
373 #define UI_PALETTE_COLOR 20
374
375 /* Drawing
376  *
377  * Functions to draw various shapes, taking theme settings into account.
378  * Used for code that draws its own UI style elements. */
379
380 void UI_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3, const float color[4]);
381 void UI_draw_anti_fan(float tri_array[][2], unsigned int length, const float color[4]);
382
383 void UI_draw_roundbox_corner_set(int type);
384 void UI_draw_roundbox_aa(bool filled, float minx, float miny, float maxx, float maxy, float rad, const float color[4]);
385 void UI_draw_roundbox_4fv(bool filled, float minx, float miny, float maxx, float maxy, float rad, const float col[4]);
386 void UI_draw_roundbox_3ubAlpha(bool filled, float minx, float miny, float maxx, float maxy, float rad, const unsigned char col[3], unsigned char alpha);
387 void UI_draw_roundbox_3fvAlpha(bool filled, float minx, float miny, float maxx, float maxy, float rad, const float col[3], float alpha);
388 void UI_draw_roundbox_shade_x(bool filled, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown, const float col[4]);
389
390 #if 0 /* unused */
391 int  UI_draw_roundbox_corner_get(void);
392 void UI_draw_roundbox_shade_y(bool filled, float minx, float miny, float maxx, float maxy, float rad, float shadeleft, float shaderight, const float col[4]);
393 #endif
394
395 void UI_draw_box_shadow(unsigned char alpha, float minx, float miny, float maxx, float maxy);
396 void UI_draw_text_underline(int pos_x, int pos_y, int len, int height, const float color[4]);
397
398 void UI_draw_safe_areas(uint pos, float x1, float x2, float y1, float y2,
399         const float title_aspect[2], const float action_aspect[2]);
400
401 /** State for scrolldrawing. */
402 enum {
403         UI_SCROLL_PRESSED =       1 << 0,
404         UI_SCROLL_ARROWS =        1 << 1,
405         UI_SCROLL_NO_OUTLINE =    1 << 2,
406 };
407 void UI_draw_widget_scroll(struct uiWidgetColors *wcol, const struct rcti *rect, const struct rcti *slider, int state);
408
409 /* Shortening string helper. */
410 float UI_text_clip_middle_ex(
411         const struct uiFontStyle *fstyle, char *str, float okwidth, const float minwidth,
412         const size_t max_len, const char rpart_sep);
413
414 /**
415  * Callbacks
416  *
417  * UI_block_func_handle_set/ButmFunc are for handling events through a callback.
418  * HandleFunc gets the retval passed on, and ButmFunc gets a2. The latter is
419  * mostly for compatibility with older code.
420  *
421  * - #UI_but_func_complete_set is for tab completion.
422  *
423  * - #uiButSearchFunc is for name buttons, showing a popup with matches
424  *
425  * - #UI_block_func_set and UI_but_func_set are callbacks run when a button is used,
426  *   in case events, operators or RNA are not sufficient to handle the button.
427  *
428  * - #UI_but_funcN_set will free the argument with MEM_freeN. */
429
430 typedef struct uiSearchItems uiSearchItems;
431
432 typedef void (*uiButHandleFunc)(struct bContext *C, void *arg1, void *arg2);
433 typedef void (*uiButHandleRenameFunc)(struct bContext *C, void *arg, char *origstr);
434 typedef void (*uiButHandleNFunc)(struct bContext *C, void *argN, void *arg2);
435 typedef void (*uiButHandleHoldFunc)(struct bContext *C, struct ARegion *butregion, uiBut *but);
436 typedef int (*uiButCompleteFunc)(struct bContext *C, char *str, void *arg);
437 typedef struct ARegion *(*uiButSearchCreateFunc)(struct bContext *C, struct ARegion *butregion, uiBut *but);
438 typedef void (*uiButSearchFunc)(const struct bContext *C, void *arg, const char *str, uiSearchItems *items);
439 /* Must return allocated string. */
440 typedef char *(*uiButToolTipFunc)(struct bContext *C, void *argN, const char *tip);
441
442 typedef void (*uiBlockHandleFunc)(struct bContext *C, void *arg, int event);
443
444 /* Menu Callbacks */
445
446 typedef void (*uiMenuCreateFunc)(struct bContext *C, struct uiLayout *layout, void *arg1);
447 typedef void (*uiMenuHandleFunc)(struct bContext *C, void *arg, int event);
448 /**
449  * Used for cycling menu values without opening the menu (Ctrl-Wheel).
450  * \param direction: forward or backwards [1 / -1].
451  * \param arg1: uiBut.poin (as with #uiMenuCreateFunc).
452  * \return true when the button was changed.
453  */
454 typedef bool (*uiMenuStepFunc)(struct bContext *C, int direction, void *arg1);
455
456
457 /* interface_query.c */
458 bool UI_but_has_tooltip_label(const uiBut *but);
459 bool UI_but_is_tool(const uiBut *but);
460 #define UI_but_is_decorator(but) \
461         ((but)->func == ui_but_anim_decorate_cb)
462
463 bool UI_block_is_empty(const uiBlock *block);
464
465
466 /* interface_region_menu_popup.c */
467 /**
468  * Popup Menus
469  *
470  * Functions used to create popup menus. For more extended menus the
471  * UI_popup_menu_begin/End functions can be used to define own items with
472  * the uiItem functions in between. If it is a simple confirmation menu
473  * or similar, popups can be created with a single function call.
474  */
475 typedef struct uiPopupMenu uiPopupMenu;
476
477 uiPopupMenu *UI_popup_menu_begin(
478         struct bContext *C, const char *title, int icon) ATTR_NONNULL();
479 uiPopupMenu *UI_popup_menu_begin_ex(
480         struct bContext *C, const char *title, const char *block_name,
481         int icon) ATTR_NONNULL();
482 void UI_popup_menu_end(struct bContext *C, struct uiPopupMenu *head);
483 bool UI_popup_menu_end_or_cancel(struct bContext *C, struct uiPopupMenu *head);
484 struct uiLayout *UI_popup_menu_layout(uiPopupMenu *head);
485
486 void UI_popup_menu_reports(struct bContext *C, struct ReportList *reports) ATTR_NONNULL();
487 int UI_popup_menu_invoke(struct bContext *C, const char *idname, struct ReportList *reports) ATTR_NONNULL(1, 2);
488
489 void UI_popup_menu_retval_set(const uiBlock *block, const int retval, const bool enable);
490 void UI_popup_menu_but_set(uiPopupMenu *pup, struct ARegion *butregion, uiBut *but);
491
492 /* interface_region_popover.c */
493
494 typedef struct uiPopover uiPopover;
495
496 int UI_popover_panel_invoke(
497         struct bContext *C, const char *idname,
498         bool keep_open, struct ReportList *reports);
499
500 uiPopover *UI_popover_begin(struct bContext *C, int menu_width) ATTR_NONNULL(1);
501 void UI_popover_end(struct bContext *C, struct uiPopover *head, struct wmKeyMap *keymap);
502 struct uiLayout *UI_popover_layout(uiPopover *head);
503 void UI_popover_once_clear(uiPopover *pup);
504
505 /* interface_region_menu_pie.c */
506 /* Pie menus */
507 typedef struct uiPieMenu uiPieMenu;
508
509 int UI_pie_menu_invoke(struct bContext *C, const char *idname, const struct wmEvent *event);
510 int UI_pie_menu_invoke_from_operator_enum(
511         struct bContext *C, const char *title, const char *opname,
512         const char *propname, const struct wmEvent *event);
513 int UI_pie_menu_invoke_from_rna_enum(
514         struct bContext *C, const char *title,
515         const char *path, const struct wmEvent *event);
516
517 struct uiPieMenu *UI_pie_menu_begin(
518         struct bContext *C, const char *title, int icon,
519         const struct wmEvent *event) ATTR_NONNULL();
520 void UI_pie_menu_end(struct bContext *C, uiPieMenu *pie);
521 struct uiLayout *UI_pie_menu_layout(struct uiPieMenu *pie);
522
523 /* interface_region_menu_popup.c */
524
525 /* Popup Blocks
526  *
527  * Functions used to create popup blocks. These are like popup menus
528  * but allow using all button types and creating an own layout. */
529 typedef uiBlock * (*uiBlockCreateFunc)(struct bContext *C, struct ARegion *ar, void *arg1);
530 typedef void (*uiBlockCancelFunc)(struct bContext *C, void *arg1);
531
532 void UI_popup_block_invoke(struct bContext *C, uiBlockCreateFunc func, void *arg);
533 void UI_popup_block_invoke_ex(struct bContext *C, uiBlockCreateFunc func, void *arg, const char *opname, int opcontext);
534 void UI_popup_block_ex(struct bContext *C, uiBlockCreateFunc func, uiBlockHandleFunc popup_func, uiBlockCancelFunc cancel_func, void *arg, struct wmOperator *op);
535 #if 0  /* UNUSED */
536 void uiPupBlockOperator(struct bContext *C, uiBlockCreateFunc func, struct wmOperator *op, int opcontext);
537 #endif
538
539 void UI_popup_block_close(struct bContext *C, struct wmWindow *win, uiBlock *block);
540
541 bool UI_popup_block_name_exists(struct bContext *C, const char *name);
542
543 /* Blocks
544  *
545  * Functions for creating, drawing and freeing blocks. A Block is a
546  * container of buttons and used for various purposes.
547  *
548  * Begin/Define Buttons/End/Draw is the typical order in which these
549  * function should be called, though for popup blocks Draw is left out.
550  * Freeing blocks is done by the screen/ module automatically.
551  *
552  * */
553
554 uiBlock *UI_block_begin(const struct bContext *C, struct ARegion *region, const char *name, short dt);
555 void UI_block_end_ex(const struct bContext *C, uiBlock *block, const int xy[2], int r_xy[2]);
556 void UI_block_end(const struct bContext *C, uiBlock *block);
557 void UI_block_draw(const struct bContext *C, struct uiBlock *block);
558 void UI_blocklist_update_window_matrix(const struct bContext *C, const struct ListBase *lb);
559 void UI_blocklist_draw(const struct bContext *C, const struct ListBase *lb);
560 void UI_block_update_from_old(const struct bContext *C, struct uiBlock *block);
561
562 enum {
563         UI_BLOCK_THEME_STYLE_REGULAR = 0,
564         UI_BLOCK_THEME_STYLE_POPUP = 1,
565 };
566 void UI_block_theme_style_set(uiBlock *block, char theme_style);
567 void UI_block_emboss_set(uiBlock *block, char dt);
568
569 void UI_block_free(const struct bContext *C, uiBlock *block);
570 void UI_blocklist_free(const struct bContext *C, struct ListBase *lb);
571 void UI_blocklist_free_inactive(const struct bContext *C, struct ListBase *lb);
572 void UI_screen_free_active_but(const struct bContext *C, struct bScreen *screen);
573
574 void UI_block_region_set(uiBlock *block, struct ARegion *region);
575
576 void UI_block_lock_set(uiBlock *block, bool val, const char *lockstr);
577 void UI_block_lock_clear(uiBlock *block);
578
579 /* automatic aligning, horiz or verical */
580 void UI_block_align_begin(uiBlock *block);
581 void UI_block_align_end(uiBlock *block);
582
583 /* block bounds/position calculation */
584 typedef enum {
585         UI_BLOCK_BOUNDS_NONE = 0,
586         UI_BLOCK_BOUNDS = 1,
587         UI_BLOCK_BOUNDS_TEXT,
588         UI_BLOCK_BOUNDS_POPUP_MOUSE,
589         UI_BLOCK_BOUNDS_POPUP_MENU,
590         UI_BLOCK_BOUNDS_POPUP_CENTER,
591         UI_BLOCK_BOUNDS_PIE_CENTER,
592 } eBlockBoundsCalc;
593
594 void UI_block_bounds_set_normal(struct uiBlock *block, int addval);
595 void UI_block_bounds_set_text(uiBlock *block, int addval);
596 void UI_block_bounds_set_popup(uiBlock *block, int addval, int mx, int my);
597 void UI_block_bounds_set_menu(uiBlock *block, int addvall, int mx, int my);
598 void UI_block_bounds_set_centered(uiBlock *block, int addval);
599 void UI_block_bounds_set_explicit(uiBlock *block, int minx, int miny, int maxx, int maxy);
600
601 int     UI_blocklist_min_y_get(struct ListBase *lb);
602
603 void    UI_block_direction_set(uiBlock *block, char direction);
604 void    UI_block_order_flip(uiBlock *block);
605 void    UI_block_flag_enable(uiBlock *block, int flag);
606 void    UI_block_flag_disable(uiBlock *block, int flag);
607 void    UI_block_translate(uiBlock *block, int x, int y);
608
609 int     UI_but_return_value_get(uiBut *but);
610
611 void    UI_but_drag_set_id(uiBut *but, struct ID *id);
612 void    UI_but_drag_set_rna(uiBut *but, struct PointerRNA *ptr);
613 void    UI_but_drag_set_path(uiBut *but, const char *path, const bool use_free);
614 void    UI_but_drag_set_name(uiBut *but, const char *name);
615 void    UI_but_drag_set_value(uiBut *but);
616 void    UI_but_drag_set_image(
617         uiBut *but, const char *path, int icon, struct ImBuf *ima, float scale, const bool use_free);
618
619 bool    UI_but_active_drop_name(struct bContext *C);
620 bool    UI_but_active_drop_color(struct bContext *C);
621
622 void    UI_but_flag_enable(uiBut *but, int flag);
623 void    UI_but_flag_disable(uiBut *but, int flag);
624 bool    UI_but_flag_is_set(uiBut *but, int flag);
625
626 void    UI_but_drawflag_enable(uiBut *but, int flag);
627 void    UI_but_drawflag_disable(uiBut *but, int flag);
628
629 void    UI_but_type_set_menu_from_pulldown(uiBut *but);
630
631 /* special button case, only draw it when used actively, for outliner etc */
632 bool    UI_but_active_only(const struct bContext *C, struct ARegion *ar, uiBlock *block, uiBut *but);
633
634 void    UI_but_execute(const struct bContext *C, uiBut *but);
635
636 bool UI_but_online_manual_id(
637         const uiBut *but,
638         char *r_str, size_t maxlength)
639         ATTR_WARN_UNUSED_RESULT;
640 bool UI_but_online_manual_id_from_active(
641         const struct bContext *C,
642         char *r_str, size_t maxlength)
643         ATTR_WARN_UNUSED_RESULT;
644
645 /* Buttons
646  *
647  * Functions to define various types of buttons in a block. Postfixes:
648  * - F: float
649  * - I: int
650  * - S: short
651  * - C: char
652  * - R: RNA
653  * - O: operator */
654
655 uiBut *uiDefBut(
656         uiBlock *block,
657         int type, int retval, const char *str,
658         int x1, int y1,
659         short x2, short y2,
660         void *poin,
661         float min, float max,
662         float a1, float a2, const char *tip);
663 uiBut *uiDefButF(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, float *poin, float min, float max, float a1, float a2, const char *tip);
664 uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, const char *str, int x, int y, short width, short height, float *poin, float min, float max, float a1, float a2, const char *tip);
665 uiBut *uiDefButI(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, int *poin, float min, float max, float a1, float a2, const char *tip);
666 uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, const char *str, int x, int y, short width, short height, int *poin, float min, float max, float a1, float a2, const char *tip);
667 uiBut *uiDefButS(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, short *poin, float min, float max, float a1, float a2, const char *tip);
668 uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, const char *str, int x, int y, short width, short height, short *poin, float min, float max, float a1, float a2, const char *tip);
669 uiBut *uiDefButC(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, char *poin, float min, float max, float a1, float a2, const char *tip);
670 uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, const char *str, int x, int y, short width, short height, char *poin, float min, float max, float a1, float a2, const char *tip);
671 uiBut *uiDefButR(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip);
672 uiBut *uiDefButR_prop(uiBlock *block, int type, int retval, const char *str, int x, int y, short width, short height, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, float min, float max, float a1, float a2, const char *tip);
673 uiBut *uiDefButO(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x, int y, short width, short height, const char *tip);
674 uiBut *uiDefButO_ptr(uiBlock *block, int type, struct wmOperatorType *ot, int opcontext, const char *str, int x, int y, short width, short height, const char *tip);
675
676 uiBut *uiDefIconBut(
677         uiBlock *block,
678         int type, int retval, int icon,
679         int x1, int y1,
680         short x2, short y2,
681         void *poin,
682         float min, float max,
683         float a1, float a2,  const char *tip);
684 uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, int x, int y, short width, short height, float *poin, float min, float max, float a1, float a2, const char *tip);
685 uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, int x, int y, short width, short height, float *poin, float min, float max, float a1, float a2, const char *tip);
686 uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, int x, int y, short width, short height, int *poin, float min, float max, float a1, float a2, const char *tip);
687 uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, int x, int y, short width, short height, int *poin, float min, float max, float a1, float a2, const char *tip);
688 uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, int x, int y, short width, short height, short *poin, float min, float max, float a1, float a2, const char *tip);
689 uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, int x, int y, short width, short height, short *poin, float min, float max, float a1, float a2, const char *tip);
690 uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, int x, int y, short width, short height, char *poin, float min, float max, float a1, float a2, const char *tip);
691 uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, int x, int y, short width, short height, char *poin, float min, float max, float a1, float a2, const char *tip);
692 uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, int x, int y, short width, short height, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip);
693 uiBut *uiDefIconButR_prop(uiBlock *block, int type, int retval, int icon, int x, int y, short width, short height, struct PointerRNA *ptr, PropertyRNA *prop, int index, float min, float max, float a1, float a2, const char *tip);
694 uiBut *uiDefIconButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, int x, int y, short width, short height, const char *tip);
695 uiBut *uiDefIconButO_ptr(uiBlock *block, int type, struct wmOperatorType *ot, int opcontext, int icon, int x, int y, short width, short height, const char *tip);
696
697 uiBut *uiDefIconTextBut(
698         uiBlock *block,
699         int type, int retval, int icon, const char *str,
700         int x1, int y1,
701         short x2, short y2,
702         void *poin,
703         float min, float max,
704         float a1, float a2, const char *tip);
705 uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, const char *str, int x, int y, short width, short height, float *poin, float min, float max, float a1, float a2, const char *tip);
706 uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x, int y, short width, short height, float *poin, float min, float max, float a1, float a2, const char *tip);
707 uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, const char *str, int x, int y, short width, short height, int *poin, float min, float max, float a1, float a2, const char *tip);
708 uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x, int y, short width, short height, int *poin, float min, float max, float a1, float a2, const char *tip);
709 uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, const char *str, int x, int y, short width, short height, short *poin, float min, float max, float a1, float a2, const char *tip);
710 uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x, int y, short width, short height, short *poin, float min, float max, float a1, float a2, const char *tip);
711 uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, const char *str, int x, int y, short width, short height, char *poin, float min, float max, float a1, float a2, const char *tip);
712 uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x, int y, short width, short height, char *poin, float min, float max, float a1, float a2, const char *tip);
713 uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, const char *str, int x, int y, short width, short height, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip);
714 uiBut *uiDefIconTextButR_prop(uiBlock *block, int type, int retval, int icon, const char *str, int x, int y, short width, short height, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, float min, float max, float a1, float a2, const char *tip);
715 uiBut *uiDefIconTextButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, const char *str, int x, int y, short width, short height, const char *tip);
716 uiBut *uiDefIconTextButO_ptr(uiBlock *block, int type, struct wmOperatorType *ot, int opcontext, int icon, const char *str, int x, int y, short width, short height, const char *tip);
717
718 /* for passing inputs to ButO buttons */
719 struct PointerRNA *UI_but_operator_ptr_get(uiBut *but);
720
721 void UI_but_unit_type_set(uiBut *but, const int unit_type);
722 int UI_but_unit_type_get(const uiBut *but);
723
724 enum {
725         BUT_GET_RNAPROP_IDENTIFIER = 1,
726         BUT_GET_RNASTRUCT_IDENTIFIER,
727         BUT_GET_RNAENUM_IDENTIFIER,
728         BUT_GET_LABEL,
729         BUT_GET_RNA_LABEL,
730         BUT_GET_RNAENUM_LABEL,
731         BUT_GET_RNA_LABEL_CONTEXT, /* Context specified in CTX_XXX_ macros are just unreachable! */
732         BUT_GET_TIP,
733         BUT_GET_RNA_TIP,
734         BUT_GET_RNAENUM_TIP,
735         BUT_GET_OP_KEYMAP,
736         BUT_GET_PROP_KEYMAP,
737 };
738
739 typedef struct uiStringInfo {
740         int type;
741         char *strinfo;
742 } uiStringInfo;
743
744 /* Note: Expects pointers to uiStringInfo structs as parameters.
745  *       Will fill them with translated strings, when possible.
746  *       Strings in uiStringInfo must be MEM_freeN'ed by caller. */
747 void UI_but_string_info_get(struct bContext *C, uiBut *but, ...) ATTR_SENTINEL(0);
748
749 /* Edit i18n stuff. */
750 /* Name of the main py op from i18n addon. */
751 #define EDTSRC_I18N_OP_NAME "UI_OT_edittranslation"
752
753 /**
754  * Special Buttons
755  *
756  * Buttons with a more specific purpose:
757  * - MenuBut: buttons that popup a menu (in headers usually).
758  * - PulldownBut: like MenuBut, but creating a uiBlock (for compatibility).
759  * - BlockBut: buttons that popup a block with more buttons.
760  * - KeyevtBut: buttons that can be used to turn key events into values.
761  * - PickerButtons: buttons like the color picker (for code sharing).
762  * - AutoButR: RNA property button with type automatically defined.
763  */
764 enum {
765         UI_ID_RENAME =        1 << 0,
766         UI_ID_BROWSE =        1 << 1,
767         UI_ID_ADD_NEW =       1 << 2,
768         UI_ID_ALONE =         1 << 4,
769         UI_ID_OPEN =          1 << 3,
770         UI_ID_DELETE =        1 << 5,
771         UI_ID_LOCAL =         1 << 6,
772         UI_ID_AUTO_NAME =     1 << 7,
773         UI_ID_FAKE_USER =     1 << 8,
774         UI_ID_PIN =           1 << 9,
775         UI_ID_PREVIEWS =      1 << 10,
776         UI_ID_OVERRIDE =      1 << 11,
777         UI_ID_FULL = UI_ID_RENAME | UI_ID_BROWSE | UI_ID_ADD_NEW | UI_ID_OPEN | UI_ID_ALONE | UI_ID_DELETE | UI_ID_LOCAL,
778 };
779
780 /**
781  * Ways to limit what is displayed in ID-search popup.
782  * \note We may want to add LOCAL, LIBRARY ... as needed.
783  */
784 enum {
785         UI_TEMPLATE_ID_FILTER_ALL = 0,
786         UI_TEMPLATE_ID_FILTER_AVAILABLE = 1,
787 };
788
789 int UI_icon_from_id(struct ID *id);
790 int UI_icon_from_report_type(int type);
791
792 int UI_icon_from_event_type(short event_type, short event_value);
793 int UI_icon_from_keymap_item(const struct wmKeyMapItem *kmi, int r_icon_mod[4]);
794
795 uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip);
796 uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip);
797 uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, const char *str, int x, int y, short width, short height, const char *tip);
798 uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, int x, int y, short width, short height, const char *tip);
799
800 uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *func_arg1, const char *str, int x, int y, short width, short height, const char *tip);
801 uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, const char *str, int x, int y, short width, short height, const char *tip);
802
803 uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int retval, int icon, int x, int y, short width, short height, const char *tip);
804 uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, const char *str, int x, int y, short width, short height, const char *tip);
805
806 uiBut *uiDefKeyevtButS(uiBlock *block, int retval, const char *str, int x, int y, short width, short height, short *spoin, const char *tip);
807 uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, const char *str, int x, int y, short width, short height, short *keypoin, short *modkeypoin, const char *tip);
808
809 uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, int x, int y, short width, short height, float a1, float a2, const char *tip);
810 uiBut *uiDefSearchButO_ptr(
811         uiBlock *block, struct wmOperatorType *ot, struct IDProperty *properties,
812         void *arg, int retval, int icon, int maxlen, int x, int y,
813         short width, short height, float a1, float a2, const char *tip);
814
815
816 /* For uiDefAutoButsRNA */
817 typedef enum {
818         /* Keep current layout for aligning label with property button. */
819         UI_BUT_LABEL_ALIGN_NONE,
820         /* Align label and property button vertically. */
821         UI_BUT_LABEL_ALIGN_COLUMN,
822         /* Split layout into a column for the label and one for property button. */
823         UI_BUT_LABEL_ALIGN_SPLIT_COLUMN,
824 } eButLabelAlign;
825
826 /* Return info for uiDefAutoButsRNA */
827 typedef enum {
828         /* Returns when no buttons were added */
829         UI_PROP_BUTS_NONE_ADDED       = 1 << 0,
830         /* Returned when any property failed the custom check callback (check_prop) */
831         UI_PROP_BUTS_ANY_FAILED_CHECK = 1 << 1,
832 } eAutoPropButsReturn;
833
834 uiBut *uiDefAutoButR(uiBlock *block, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, const char *name, int icon, int x1, int y1, int x2, int y2);
835 eAutoPropButsReturn uiDefAutoButsRNA(
836         uiLayout *layout, struct PointerRNA *ptr,
837         bool (*check_prop)(struct PointerRNA *ptr, struct PropertyRNA *prop, void *user_data), void *user_data,
838         eButLabelAlign label_align, const bool compact);
839
840 /* use inside searchfunc to add items */
841 bool    UI_search_item_add(uiSearchItems *items, const char *name, void *poin, int iconid);
842 /* bfunc gets search item *poin as arg2, or if NULL the old string */
843 void    UI_but_func_search_set(
844         uiBut *but, uiButSearchCreateFunc cfunc, uiButSearchFunc sfunc,
845         void *arg1, uiButHandleFunc bfunc, void *active);
846 /* height in pixels, it's using hardcoded values still */
847 int     UI_searchbox_size_y(void);
848 int     UI_searchbox_size_x(void);
849 /* check if a string is in an existing search box */
850 int     UI_search_items_find_index(uiSearchItems *items, const char *name);
851
852 void    UI_block_func_handle_set(uiBlock *block, uiBlockHandleFunc func, void *arg);
853 void    UI_block_func_butmenu_set(uiBlock *block, uiMenuHandleFunc func, void *arg);
854 void    UI_block_func_set(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2);
855 void    UI_block_funcN_set(uiBlock *block, uiButHandleNFunc funcN, void *argN, void *arg2);
856
857 void    UI_but_func_rename_set(uiBut *but, uiButHandleRenameFunc func, void *arg1);
858 void    UI_but_func_set(uiBut *but, uiButHandleFunc func, void *arg1, void *arg2);
859 void    UI_but_funcN_set(uiBut *but, uiButHandleNFunc funcN, void *argN, void *arg2);
860
861 void    UI_but_func_complete_set(uiBut *but, uiButCompleteFunc func, void *arg);
862
863 void    UI_but_func_drawextra_set(
864         uiBlock *block,
865         void (*func)(const struct bContext *C, void *, void *, void *, struct rcti *rect),
866         void *arg1, void *arg2);
867
868 void    UI_but_func_menu_step_set(uiBut *but, uiMenuStepFunc func);
869
870 void    UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *argN);
871 void    UI_but_tooltip_refresh(struct bContext *C, uiBut *but);
872 void    UI_but_tooltip_timer_remove(struct bContext *C, uiBut *but);
873
874 bool UI_textbutton_activate_rna(
875         const struct bContext *C, struct ARegion *ar,
876         const void *rna_poin_data, const char *rna_prop_id);
877 bool UI_textbutton_activate_but(const struct bContext *C, uiBut *but);
878
879 void UI_but_focus_on_enter_event(struct wmWindow *win, uiBut *but);
880
881 void UI_but_func_hold_set(uiBut *but, uiButHandleHoldFunc func, void *argN);
882
883 /* Autocomplete
884  *
885  * Tab complete helper functions, for use in uiButCompleteFunc callbacks.
886  * Call begin once, then multiple times do_name with all possibilities,
887  * and finally end to finish and get the completed name. */
888
889 typedef struct AutoComplete AutoComplete;
890
891 #define AUTOCOMPLETE_NO_MATCH 0
892 #define AUTOCOMPLETE_FULL_MATCH 1
893 #define AUTOCOMPLETE_PARTIAL_MATCH 2
894
895 AutoComplete *UI_autocomplete_begin(const char *startname, size_t maxlen);
896 void UI_autocomplete_update_name(AutoComplete *autocpl, const char *name);
897 int UI_autocomplete_end(AutoComplete *autocpl, char *autoname);
898
899 /* Panels
900  *
901  * Functions for creating, freeing and drawing panels. The API here
902  * could use a good cleanup, though how they will function in 2.5 is
903  * not clear yet so we postpone that. */
904
905 void UI_panels_begin(const struct bContext *C, struct ARegion *ar);
906 void UI_panels_end(const struct bContext *C, struct ARegion *ar, int *x, int *y);
907 void UI_panels_draw(const struct bContext *C, struct ARegion *ar);
908
909 struct Panel *UI_panel_find_by_type(struct ListBase *lb, struct PanelType *pt);
910 struct Panel *UI_panel_begin(
911         struct ScrArea *sa, struct ARegion *ar, struct ListBase *lb,
912         uiBlock *block, struct PanelType *pt, struct Panel *pa,
913         bool *r_open);
914 void UI_panel_end(uiBlock *block, int width, int height);
915 void UI_panels_scale(struct ARegion *ar, float new_width);
916 void UI_panel_label_offset(struct uiBlock *block, int *x, int *y);
917 int UI_panel_size_y(const struct Panel *pa);
918
919 bool                       UI_panel_category_is_visible(struct ARegion *ar);
920 void                       UI_panel_category_add(struct ARegion *ar, const char *name);
921 struct PanelCategoryDyn   *UI_panel_category_find(struct ARegion *ar, const char *idname);
922 struct PanelCategoryStack *UI_panel_category_active_find(struct ARegion *ar, const char *idname);
923 const char                *UI_panel_category_active_get(struct ARegion *ar, bool set_fallback);
924 void                       UI_panel_category_active_set(struct ARegion *ar, const char *idname);
925 struct PanelCategoryDyn   *UI_panel_category_find_mouse_over_ex(struct ARegion *ar, const int x, const int y);
926 struct PanelCategoryDyn   *UI_panel_category_find_mouse_over(struct ARegion *ar, const struct wmEvent *event);
927 void                       UI_panel_category_clear_all(struct ARegion *ar);
928 void                       UI_panel_category_draw_all(struct ARegion *ar, const char *category_id_active);
929
930 struct PanelType *UI_paneltype_find(int space_id, int region_id, const char *idname);
931
932 /* Handlers
933  *
934  * Handlers that can be registered in regions, areas and windows for
935  * handling WM events. Mostly this is done automatic by modules such
936  * as screen/ if ED_KEYMAP_UI is set, or internally in popup functions. */
937
938 void UI_region_handlers_add(struct ListBase *handlers);
939 void UI_popup_handlers_add(struct bContext *C, struct ListBase *handlers, uiPopupBlockHandle *popup, const char flag);
940 void UI_popup_handlers_remove(struct ListBase *handlers, uiPopupBlockHandle *popup);
941 void UI_popup_handlers_remove_all(struct bContext *C, struct ListBase *handlers);
942
943 /* Module
944  *
945  * init and exit should be called before using this module. init_userdef must
946  * be used to reinitialize some internal state if user preferences change. */
947
948 void UI_init(void);
949 void UI_init_userdef(struct Main *bmain);
950 void UI_reinit_font(void);
951 void UI_exit(void);
952
953 /* Layout
954  *
955  * More automated layout of buttons. Has three levels:
956  * - Layout: contains a number templates, within a bounded width or height.
957  * - Template: predefined layouts for buttons with a number of slots, each
958  *   slot can contain multiple items.
959  * - Item: item to put in a template slot, being either an RNA property,
960  *   operator, label or menu. Also regular buttons can be used when setting
961  *   uiBlockCurLayout. */
962
963 /* layout */
964 enum {
965         UI_LAYOUT_HORIZONTAL =    0,
966         UI_LAYOUT_VERTICAL =      1,
967 };
968
969 enum {
970         UI_LAYOUT_PANEL =         0,
971         UI_LAYOUT_HEADER =        1,
972         UI_LAYOUT_MENU =          2,
973         UI_LAYOUT_TOOLBAR =       3,
974         UI_LAYOUT_PIEMENU =       4,
975         UI_LAYOUT_VERT_BAR =      5,
976 };
977
978 #define UI_UNIT_X               ((void)0, U.widget_unit)
979 #define UI_UNIT_Y               ((void)0, U.widget_unit)
980
981 enum {
982         UI_LAYOUT_ALIGN_EXPAND =  0,
983         UI_LAYOUT_ALIGN_LEFT =    1,
984         UI_LAYOUT_ALIGN_CENTER =  2,
985         UI_LAYOUT_ALIGN_RIGHT =   3,
986 };
987
988 enum {
989         UI_ITEM_O_RETURN_PROPS =  1 << 0,
990         UI_ITEM_R_EXPAND =        1 << 1,
991         UI_ITEM_R_SLIDER =        1 << 2,
992         UI_ITEM_R_TOGGLE =        1 << 3,
993         UI_ITEM_R_ICON_ONLY =     1 << 4,
994         UI_ITEM_R_EVENT =         1 << 5,
995         UI_ITEM_R_FULL_EVENT =    1 << 6,
996         UI_ITEM_R_NO_BG =         1 << 7,
997         UI_ITEM_R_IMMEDIATE =     1 << 8,
998         UI_ITEM_O_DEPRESS =       1 << 9,
999         UI_ITEM_R_COMPACT =       1 << 10,
1000 };
1001
1002 #define UI_HEADER_OFFSET ((void)0, 0.4f * UI_UNIT_X)
1003
1004 /* uiLayoutOperatorButs flags */
1005 enum {
1006         UI_TEMPLATE_OP_PROPS_SHOW_TITLE       = 1 << 0,
1007         UI_TEMPLATE_OP_PROPS_SHOW_EMPTY       = 1 << 1,
1008         UI_TEMPLATE_OP_PROPS_COMPACT          = 1 << 2,
1009         UI_TEMPLATE_OP_PROPS_HIDE_ADVANCED    = 1 << 3,
1010 };
1011
1012 /* used for transp checkers */
1013 #define UI_ALPHA_CHECKER_DARK 100
1014 #define UI_ALPHA_CHECKER_LIGHT 160
1015
1016 /* flags to set which corners will become rounded:
1017  *
1018  * 1------2
1019  * |      |
1020  * 8------4 */
1021
1022 enum {
1023         UI_CNR_TOP_LEFT     = 1 << 0,
1024         UI_CNR_TOP_RIGHT    = 1 << 1,
1025         UI_CNR_BOTTOM_RIGHT = 1 << 2,
1026         UI_CNR_BOTTOM_LEFT  = 1 << 3,
1027         /* just for convenience */
1028         UI_CNR_NONE         = 0,
1029         UI_CNR_ALL          = (UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT),
1030 };
1031
1032 uiLayout *UI_block_layout(uiBlock *block, int dir, int type, int x, int y, int size, int em, int padding, struct uiStyle *style);
1033 void UI_block_layout_set_current(uiBlock *block, uiLayout *layout);
1034 void UI_block_layout_resolve(uiBlock *block, int *x, int *y);
1035
1036 void UI_region_message_subscribe(struct ARegion *ar, struct wmMsgBus *mbus);
1037
1038 uiBlock *uiLayoutGetBlock(uiLayout *layout);
1039
1040 void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
1041 void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct PointerRNA *ptr);
1042 void uiLayoutContextCopy(uiLayout *layout, struct bContextStore *context);
1043 struct MenuType *UI_but_menutype_get(uiBut *but);
1044 struct PanelType *UI_but_paneltype_get(uiBut *but);
1045 void UI_menutype_draw(struct bContext *C, struct MenuType *mt, struct uiLayout *layout);
1046 void UI_paneltype_draw(struct bContext *C, struct PanelType *pt, struct uiLayout *layout);
1047
1048 /* Only for convenience. */
1049 void uiLayoutSetContextFromBut(uiLayout *layout, uiBut *but);
1050
1051 void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext);
1052 void uiLayoutSetActive(uiLayout *layout, bool active);
1053 void uiLayoutSetEnabled(uiLayout *layout, bool enabled);
1054 void uiLayoutSetRedAlert(uiLayout *layout, bool redalert);
1055 void uiLayoutSetAlignment(uiLayout *layout, char alignment);
1056 void uiLayoutSetKeepAspect(uiLayout *layout, bool keepaspect);
1057 void uiLayoutSetScaleX(uiLayout *layout, float scale);
1058 void uiLayoutSetScaleY(uiLayout *layout, float scale);
1059 void uiLayoutSetUnitsX(uiLayout *layout, float unit);
1060 void uiLayoutSetUnitsY(uiLayout *layout, float unit);
1061 void uiLayoutSetEmboss(uiLayout *layout, char emboss);
1062 void uiLayoutSetPropSep(uiLayout *layout, bool is_sep);
1063 void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep);
1064 int uiLayoutGetLocalDir(const uiLayout *layout);
1065
1066 int uiLayoutGetOperatorContext(uiLayout *layout);
1067 bool uiLayoutGetActive(uiLayout *layout);
1068 bool uiLayoutGetEnabled(uiLayout *layout);
1069 bool uiLayoutGetRedAlert(uiLayout *layout);
1070 int uiLayoutGetAlignment(uiLayout *layout);
1071 bool uiLayoutGetKeepAspect(uiLayout *layout);
1072 int uiLayoutGetWidth(uiLayout *layout);
1073 float uiLayoutGetScaleX(uiLayout *layout);
1074 float uiLayoutGetScaleY(uiLayout *layout);
1075 float uiLayoutGetUnitsX(uiLayout *layout);
1076 float uiLayoutGetUnitsY(uiLayout *layout);
1077 int uiLayoutGetEmboss(uiLayout *layout);
1078 bool uiLayoutGetPropSep(uiLayout *layout);
1079 bool uiLayoutGetPropDecorate(uiLayout *layout);
1080
1081 /* layout specifiers */
1082 uiLayout *uiLayoutRow(uiLayout *layout, bool align);
1083 uiLayout *uiLayoutColumn(uiLayout *layout, bool align);
1084 uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, bool align);
1085 uiLayout *uiLayoutGridFlow(
1086         uiLayout *layout, bool row_major, int columns_len, bool even_columns, bool even_rows, bool align);
1087 uiLayout *uiLayoutBox(uiLayout *layout);
1088 uiLayout *uiLayoutListBox(
1089         uiLayout *layout, struct uiList *ui_list, struct PointerRNA *ptr, struct PropertyRNA *prop,
1090         struct PointerRNA *actptr, struct PropertyRNA *actprop);
1091 uiLayout *uiLayoutAbsolute(uiLayout *layout, bool align);
1092 uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, bool align);
1093 uiLayout *uiLayoutOverlap(uiLayout *layout);
1094 uiBlock *uiLayoutAbsoluteBlock(uiLayout *layout);
1095 uiLayout *uiLayoutRadial(uiLayout *layout);
1096
1097 /* templates */
1098 void uiTemplateHeader(uiLayout *layout, struct bContext *C);
1099 void uiTemplateID(
1100         uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
1101         const char *newop, const char *openop, const char *unlinkop,
1102         int filter, const bool live_icon);
1103 void uiTemplateIDBrowse(
1104         uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
1105         const char *newop, const char *openop, const char *unlinkop, int filter);
1106 void uiTemplateIDPreview(
1107         uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
1108         const char *newop, const char *openop, const char *unlinkop, int rows, int cols,
1109         int filter, const bool hide_buttons);
1110 void uiTemplateIDTabs(
1111         uiLayout *layout, struct bContext *C,
1112         PointerRNA *ptr, const char *propname,
1113         const char *newop, const char *menu,
1114         int filter);
1115 void uiTemplateAnyID(
1116         uiLayout *layout, struct PointerRNA *ptr, const char *propname,
1117         const char *proptypename, const char *text);
1118 void uiTemplateSearch(
1119         uiLayout *layout, struct bContext *C,
1120         struct PointerRNA *ptr, const char *propname,
1121         struct PointerRNA *searchptr, const char *searchpropname,
1122         const char *newop, const char *unlinkop);
1123 void uiTemplateSearchPreview(
1124         uiLayout *layout, struct bContext *C,
1125         struct PointerRNA *ptr, const char *propname,
1126         struct PointerRNA *searchptr, const char *searchpropname,
1127         const char *newop, const char *unlinkop,
1128         const int rows, const int cols);
1129 void uiTemplatePathBuilder(
1130         uiLayout *layout, struct PointerRNA *ptr, const char *propname,
1131         struct PointerRNA *root_ptr, const char *text);
1132 uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
1133 uiLayout *uiTemplateGpencilModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
1134 void uiTemplateGpencilColorPreview(
1135         uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
1136         int rows, int cols, float scale, int filter);
1137
1138 uiLayout *uiTemplateShaderFx(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
1139
1140 void uiTemplateOperatorRedoProperties(uiLayout *layout, const struct bContext *C);
1141
1142 uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
1143 void uiTemplatePreview(
1144         uiLayout *layout, struct bContext *C, struct ID *id, bool show_buttons, struct ID *parent,
1145         struct MTex *slot, const char *preview_id);
1146 void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool expand);
1147 void uiTemplateIcon(uiLayout *layout, int icon_value, float icon_scale);
1148 void uiTemplateIconView(
1149         uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool show_labels,
1150         float icon_scale, float icon_scale_popup);
1151 void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1152 void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1153 void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1154 void uiTemplateCurveMapping(
1155         uiLayout *layout, struct PointerRNA *ptr, const char *propname, int type,
1156         bool levels, bool brush, bool neg_slope, bool tone);
1157 void uiTemplateColorPicker(uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool value_slider, bool lock, bool lock_luminosity, bool cubic);
1158 void uiTemplatePalette(uiLayout *layout, struct PointerRNA *ptr, const char *propname, bool color);
1159 void uiTemplateCryptoPicker(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1160 void uiTemplateLayers(
1161         uiLayout *layout, struct PointerRNA *ptr, const char *propname,
1162         PointerRNA *used_ptr, const char *used_propname, int active_layer);
1163 void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *userptr, bool compact, bool multiview);
1164 void uiTemplateImageSettings(uiLayout *layout, struct PointerRNA *imfptr, bool color_management);
1165 void uiTemplateImageStereo3d(uiLayout *layout, struct PointerRNA *stereo3d_format_ptr);
1166 void uiTemplateImageViews(uiLayout *layout, struct PointerRNA *imaptr);
1167 void uiTemplateImageFormatViews(uiLayout *layout, PointerRNA *imfptr, PointerRNA *ptr);
1168 void uiTemplateImageLayers(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser);
1169 void uiTemplateImageInfo(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser);
1170 void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C);
1171 void UI_but_func_operator_search(uiBut *but);
1172 void uiTemplateOperatorSearch(uiLayout *layout);
1173 eAutoPropButsReturn uiTemplateOperatorPropertyButs(
1174         const struct bContext *C, uiLayout *layout, struct wmOperator *op,
1175         const eButLabelAlign label_align, const short flag);
1176 void uiTemplateHeader3D_mode(uiLayout *layout, struct bContext *C);
1177 void uiTemplateHeader3D(uiLayout *layout, struct bContext *C);
1178 void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C);
1179 void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C);
1180 void uiTemplateInputStatus(uiLayout *layout, struct bContext *C);
1181 void uiTemplateKeymapItemProperties(uiLayout *layout, struct PointerRNA *ptr);
1182 void uiTemplateComponentMenu(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name);
1183 void uiTemplateNodeSocket(uiLayout *layout, struct bContext *C, float *color);
1184 void uiTemplateCacheFile(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname);
1185
1186 /* Default UIList class name, keep in sync with its declaration in bl_ui/__init__.py */
1187 #define UI_UL_DEFAULT_CLASS_NAME "UI_UL_list"
1188 void uiTemplateList(
1189         uiLayout *layout, struct bContext *C, const char *listtype_name, const char *list_id,
1190         struct PointerRNA *dataptr, const char *propname, struct PointerRNA *active_dataptr,
1191         const char *active_propname, const char *item_dyntip_propname,
1192         int rows, int maxrows, int layout_type, int columns, bool sort_reverse, bool sort_lock);
1193 void uiTemplateNodeLink(uiLayout *layout, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
1194 void uiTemplateNodeView(uiLayout *layout, struct bContext *C, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
1195 void uiTemplateTextureUser(uiLayout *layout, struct bContext *C);
1196 void uiTemplateTextureShow(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop);
1197
1198 void uiTemplateMovieClip(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, bool compact);
1199 void uiTemplateTrack(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1200 void uiTemplateMarker(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, PointerRNA *userptr, PointerRNA *trackptr, bool compact);
1201 void uiTemplateMovieclipInformation(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *userptr);
1202
1203 void uiTemplateColorspaceSettings(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1204 void uiTemplateColormanagedViewSettings(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname);
1205
1206 int uiTemplateRecentFiles(struct uiLayout *layout, int rows);
1207
1208 /* items */
1209 void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname);
1210 void uiItemEnumO_ptr(uiLayout *layout, struct wmOperatorType *ot, const char *name, int icon, const char *propname, int value);
1211 void uiItemEnumO(uiLayout *layout, const char *opname, const char *name, int icon, const char *propname, int value);
1212 void uiItemEnumO_value(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value);
1213 void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value);
1214 void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname);
1215 void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value);
1216 void uiItemIntO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value);
1217 void uiItemFloatO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, float value);
1218 void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value);
1219
1220 void uiItemFullO_ptr(
1221         uiLayout *layout, struct wmOperatorType *ot, const char *name, int icon,
1222         struct IDProperty *properties, int context, int flag,
1223         PointerRNA *r_opptr);
1224 void uiItemFullO(
1225         uiLayout *layout, const char *idname, const char *name, int icon,
1226         struct IDProperty *properties, int context, int flag,
1227         PointerRNA *r_opptr);
1228 void uiItemFullOMenuHold_ptr(
1229         uiLayout *layout, struct wmOperatorType *ot, const char *name, int icon,
1230         struct IDProperty *properties, int context, int flag,
1231         const char *menu_id,  /* extra menu arg. */
1232         PointerRNA *r_opptr);
1233
1234 void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon);
1235 void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, const char *name, int icon);
1236 void uiItemEnumR_prop(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, PropertyRNA *prop, int value);
1237 void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, const char *propname, int value);
1238 void uiItemEnumR_string_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, const char *value, const char *name, int icon);
1239 void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon);
1240 void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
1241 void uiItemPointerR_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, struct PointerRNA *searchptr, PropertyRNA *searchprop, const char *name, int icon);
1242 void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon);
1243 void uiItemsFullEnumO(
1244         uiLayout *layout, const char *opname, const char *propname,
1245         struct IDProperty *properties, int context, int flag);
1246 void uiItemsFullEnumO_items(
1247         uiLayout *layout, struct wmOperatorType *ot, PointerRNA ptr, PropertyRNA *prop,
1248         struct IDProperty *properties, int context, int flag,
1249         const EnumPropertyItem *item_array, int totitem);
1250
1251 void uiItemL(uiLayout *layout, const char *name, int icon); /* label */
1252 /* label icon for dragging */
1253 void uiItemLDrag(uiLayout *layout, struct PointerRNA *ptr, const char *name, int icon);
1254 /* menu */
1255 void uiItemM(uiLayout *layout, const char *menuname, const char *name, int icon);
1256 /* menu contents */
1257 void uiItemMContents(uiLayout *layout, const char *menuname);
1258 /* value */
1259 void uiItemV(uiLayout *layout, const char *name, int icon, int argval);
1260 /* separator */
1261 void uiItemS(uiLayout *layout);
1262 void uiItemS_ex(uiLayout *layout, float factor);
1263 /* Special separator. */
1264 void uiItemSpacer(uiLayout *layout);
1265
1266 void uiItemPopoverPanel_ptr(
1267         uiLayout *layout, struct bContext *C,
1268         struct PanelType *pt,
1269         const char *name, int icon);
1270 void uiItemPopoverPanel(
1271         uiLayout *layout, struct bContext *C,
1272         const char *panelname,
1273         const char *name, int icon);
1274 void uiItemPopoverPanelFromGroup(
1275         uiLayout *layout, struct bContext *C,
1276         int space_id, int region_id,
1277         const char *context, const char *category);
1278
1279 void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg);
1280 void uiItemMenuFN(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *argN);
1281 void uiItemMenuEnumO_ptr(uiLayout *layout, struct bContext *C, struct wmOperatorType *ot, const char *propname, const char *name, int icon);
1282 void uiItemMenuEnumO(uiLayout *layout, struct bContext *C, const char *opname, const char *propname, const char *name, int icon);
1283 void uiItemMenuEnumR_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, const char *name, int icon);
1284 void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, int icon);
1285 void uiItemTabsEnumR_prop(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, PropertyRNA *prop, bool icon_only);
1286
1287 /* UI Operators */
1288 typedef struct uiDragColorHandle {
1289         float color[3];
1290         bool gamma_corrected;
1291 } uiDragColorHandle;
1292
1293 void ED_operatortypes_ui(void);
1294 void ED_keymap_ui(struct wmKeyConfig *keyconf);
1295
1296 void UI_drop_color_copy(struct wmDrag *drag, struct wmDropBox *drop);
1297 bool UI_drop_color_poll(struct bContext *C, struct wmDrag *drag, const struct wmEvent *event, const char **tooltip);
1298
1299 bool UI_context_copy_to_selected_list(
1300         struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop,
1301         struct ListBase *r_lb, bool *r_use_path_from_id, char **r_path);
1302
1303 /* Helpers for Operators */
1304 uiBut *UI_context_active_but_get(const struct bContext *C);
1305 uiBut *UI_context_active_but_prop_get(
1306         const struct bContext *C,
1307         struct PointerRNA *r_ptr, struct PropertyRNA **r_prop, int *r_index);
1308 void UI_context_active_but_prop_handle(struct bContext *C);
1309 struct wmOperator *UI_context_active_operator_get(const struct bContext *C);
1310 void UI_context_update_anim_flag(const struct bContext *C);
1311 void UI_context_active_but_prop_get_filebrowser(
1312         const struct bContext *C,
1313         struct PointerRNA *r_ptr, struct PropertyRNA **r_prop, bool *r_is_undo);
1314 void UI_context_active_but_prop_get_templateID(
1315         struct bContext *C,
1316         struct PointerRNA *r_ptr, struct PropertyRNA **r_prop);
1317 struct ID *UI_context_active_but_get_tab_ID(struct bContext *C);
1318
1319 uiBut *UI_region_active_but_get(struct ARegion *ar);
1320
1321 /* uiFontStyle.align */
1322 typedef enum eFontStyle_Align {
1323         UI_STYLE_TEXT_LEFT              = 0,
1324         UI_STYLE_TEXT_CENTER    = 1,
1325         UI_STYLE_TEXT_RIGHT             = 2,
1326 } eFontStyle_Align;
1327
1328 struct uiFontStyleDraw_Params {
1329         eFontStyle_Align align;
1330         uint word_wrap : 1;
1331 };
1332
1333 /* Styled text draw */
1334 void UI_fontstyle_set(const struct uiFontStyle *fs);
1335 void UI_fontstyle_draw_ex(
1336         const struct uiFontStyle *fs, const struct rcti *rect, const char *str,
1337         const uchar col[4], const struct uiFontStyleDraw_Params *fs_params,
1338         size_t len, float *r_xofs, float *r_yofs);
1339 void UI_fontstyle_draw(
1340         const struct uiFontStyle *fs, const struct rcti *rect, const char *str,
1341         const uchar col[4], const struct uiFontStyleDraw_Params *fs_params);
1342 void UI_fontstyle_draw_rotated(
1343         const struct uiFontStyle *fs, const struct rcti *rect, const char *str,
1344         const uchar col[4]);
1345 void UI_fontstyle_draw_simple(
1346         const struct uiFontStyle *fs, float x, float y, const char *str,
1347         const uchar col[4]);
1348 void UI_fontstyle_draw_simple_backdrop(
1349         const struct uiFontStyle *fs, float x, float y, const char *str,
1350         const float col_fg[4], const float col_bg[4]);
1351
1352 int UI_fontstyle_string_width(const struct uiFontStyle *fs, const char *str);
1353 int UI_fontstyle_height_max(const struct uiFontStyle *fs);
1354
1355 void UI_draw_icon_tri(float x, float y, char dir, const float[4]);
1356
1357 struct uiStyle *UI_style_get(void);             /* use for fonts etc */
1358 struct uiStyle *UI_style_get_dpi(void); /* DPI scaled settings for drawing */
1359
1360 /* linker workaround ack! */
1361 void UI_template_fix_linking(void);
1362
1363 /* UI_OT_editsource helpers */
1364 bool UI_editsource_enable_check(void);
1365 void UI_editsource_active_but_test(uiBut *but);
1366
1367 /* UI_butstore_ helpers */
1368 typedef struct uiButStore uiButStore;
1369 typedef struct uiButStoreElem uiButStoreElem;
1370
1371 uiButStore *UI_butstore_create(uiBlock *block);
1372 void UI_butstore_clear(uiBlock *block);
1373 void UI_butstore_update(uiBlock *block);
1374 void UI_butstore_free(uiBlock *block, uiButStore *bs);
1375 bool UI_butstore_is_valid(uiButStore *bs);
1376 bool UI_butstore_is_registered(uiBlock *block, uiBut *but);
1377 void UI_butstore_register(uiButStore *bs_handle, uiBut **but_p);
1378 bool UI_butstore_register_update(uiBlock *block, uiBut *but_dst, const uiBut *but_src);
1379 void UI_butstore_unregister(uiButStore *bs_handle, uiBut **but_p);
1380
1381 /* ui_interface_region_tooltip.c */
1382 struct ARegion *UI_tooltip_create_from_button(struct bContext *C, struct ARegion *butregion, uiBut *but, bool is_label);
1383 struct ARegion *UI_tooltip_create_from_gizmo(struct bContext *C, struct wmGizmo *gz);
1384 void UI_tooltip_free(struct bContext *C, struct bScreen *sc, struct ARegion *ar);
1385
1386 /* How long before a tool-tip shows. */
1387 #define UI_TOOLTIP_DELAY 0.5
1388 #define UI_TOOLTIP_DELAY_LABEL 0.2
1389
1390 /* Float precision helpers */
1391 #define UI_PRECISION_FLOAT_MAX 6
1392 /* For float buttons the 'step' (or a1), is scaled */
1393 #define UI_PRECISION_FLOAT_SCALE 0.01f
1394
1395 /* Typical UI text */
1396 #define UI_FSTYLE_WIDGET (const uiFontStyle *)&(UI_style_get()->widget)
1397
1398 int UI_calc_float_precision(int prec, double value);
1399
1400 /* widget batched drawing */
1401 void UI_widgetbase_draw_cache_begin(void);
1402 void UI_widgetbase_draw_cache_flush(void);
1403 void UI_widgetbase_draw_cache_end(void);
1404
1405 /* Special drawing for toolbar, mainly workarounds for inflexible icon sizing. */
1406 #define USE_UI_TOOLBAR_HACK
1407
1408 /* Support click-drag motion which presses the button and closes a popover (like a menu). */
1409 #define USE_UI_POPOVER_ONCE
1410
1411 #endif  /* __UI_INTERFACE_H__ */