57#define ANIMATION_TIME 0.30
58#define ANIMATION_INTERVAL 0.02
122 const char *context);
131 Panel **r_panel_animation,
132 bool *r_no_animation)
136 if (!(panel->type && panel->type->parent)) {
147 *r_panel_animation = panel;
158 if (panel->activedata) {
161 *r_panel_animation = panel;
165 *r_no_animation =
true;
169 *r_panel_animation = panel;
194 *r_panel_animation =
nullptr;
201 Panel *panel_animation =
nullptr;
202 bool no_animation =
false;
208 if (panel_animation) {
210 *r_panel_animation = panel_animation;
243 int max_sortorder = 0;
245 if (existing_panel->sortorder > max_sortorder) {
246 max_sortorder = existing_panel->sortorder;
259 const char *panel_idname,
267 if (panel_type ==
nullptr) {
268 printf(
"Panel type '%s' not found.\n", panel_idname);
312 if (C !=
nullptr && panel->activedata !=
nullptr) {
317 if (panel->runtime->custom_data_ptr !=
nullptr) {
318 MEM_delete(panel->runtime->custom_data_ptr);
333 Link *data_link =
nullptr;
334 if (data ==
nullptr) {
340 data_link =
static_cast<Link *
>(data->first);
352 if (data_link ==
nullptr) {
358 panel_idname_func(data_link, panel_idname);
359 if (!
STREQ(panel_idname, panel->type->idname)) {
363 data_link = data_link->
next;
379 if (drag_panel->
type ==
nullptr) {
387 char *context =
nullptr;
393 int list_panels_len = 0;
394 int start_index = -1;
399 if (panel == drag_panel) {
401 start_index = list_panels_len;
412 MEM_callocN(list_panels_len *
sizeof(*panel_sort), __func__));
418 sort_index->
panel = panel;
424 qsort(panel_sort, list_panels_len,
sizeof(*panel_sort),
compare_panel);
427 int move_to_index = 0;
428 for (; move_to_index < list_panels_len; move_to_index++) {
429 if (panel_sort[move_to_index].panel == drag_panel) {
436 if (move_to_index == start_index) {
447 drag_panel->
type->
reorder(C, drag_panel, move_to_index);
459 const bool open = (
flag & (1 << *flag_index));
465 *flag_index = *flag_index + 1;
485 short flag_index = 0;
517 *flag_index = *flag_index + 1;
534 if (panel_type ==
nullptr) {
541 short flag_index = 0;
543 if (panel->type->set_list_data_expand_flag) {
544 panel->type->set_list_data_expand_flag(C, panel, expand_flag);
674 const char *idname = pt->
idname;
677 if (
STREQLEN(panel->panelname, idname,
sizeof(panel->panelname))) {
689 const bool newpanel = (panel ==
nullptr);
720 for (panel_last =
static_cast<Panel *
>(lb->
first); panel_last; panel_last = panel_last->
next) {
733 panel_next->sortorder++;
743 block->
panel = panel;
769 button_group.
flag &= ~UI_BUTTON_GROUP_LOCK;
775 button_group.
flag &= ~UI_BUTTON_GROUP_PANEL_HEADER;
808 width =
max_ii(width, child_panel->sizex);
816 panel->
sizex = width;
817 panel->
sizey = height;
820 const int old_sizex = panel->
sizex, old_sizey = panel->
sizey;
825 panel->
sizex = width;
828 panel->
sizey = height;
832 if (panel->
sizex != old_sizex || panel->
sizey != old_sizey) {
868 but->rect.ymin += ofsy;
869 but->rect.ymax += ofsy;
887 if (!*filter_matches) {
896 bool search_filter_matches =
false;
898 return search_filter_matches;
906 const bool use_search_closed)
926 const bool use_search_closed)
960 for (
uiBut *but : button_group.buttons) {
968 BLI_assert(child_panel->runtime->block !=
nullptr);
1030#define PNL_ICON UI_UNIT_X
1046 const bool show_background,
1047 const bool region_search_filter_active,
1050 if (!show_background) {
1061 if (region_search_filter_active && !search_match) {
1070 const rcti *header_rect)
1072 const bool is_subpanel = panel->
type->
parent !=
nullptr;
1095 const rcti *header_rect,
1097 const bool show_pin,
1098 const bool show_background,
1099 const bool region_search_filter_active)
1101 const bool is_subpanel = panel->
type->
parent !=
nullptr;
1109 widget_rect.
xmin = header_rect->
xmin + (is_subpanel ? scaled_unit * 0.7f : 0);
1110 widget_rect.
xmax = header_rect->
xmax;
1111 widget_rect.
ymin = header_rect->
ymin;
1112 widget_rect.
ymax = header_rect->
ymax;
1114 uchar title_color[4];
1116 title_color[3] = 255;
1137 title_rect.
xmin = widget_rect.
xmin + (panel->
labelofs / aspect) + scaled_unit * 1.1f;
1138 title_rect.
xmax = widget_rect.
xmax;
1139 title_rect.
ymin = widget_rect.
ymin - 2.0f / aspect;
1140 title_rect.
ymax = widget_rect.
ymax;
1152 widget_rect.
ymin + 5.0f / aspect,
1164 if (!is_subpanel && show_background) {
1165 const int drag_widget_size = header_height * 0.7f;
1166 const int col_tint = 84;
1167 float color_high[4], color_dark[4];
1173 widget_rect.
ymin + (header_height - drag_widget_size) * 0.5f,
1188 widget_rect.
ymin + (header_height - drag_widget_size) * 0.5f);
1190 U.pixelsize, color_high, color_dark, drag_widget_size);
1201 float subpanel_backcolor[4])
1225 if (is_main_panel_end) {
1235 rctf panel_pixelspacef;
1244 const rcti *header_rect)
1247 const bool is_subpanel = panel->
type->
parent !=
nullptr;
1250 if (is_subpanel && !is_open) {
1262 if (is_open || !has_header) {
1263 float panel_backcolor[4];
1279 float subpanel_backcolor[4];
1285 if (!is_subpanel && has_header) {
1286 float panel_headercolor[4];
1294 box_rect.xmax = rect->
xmax;
1295 box_rect.ymin = header_rect->
ymin;
1296 box_rect.ymax = header_rect->
ymax;
1308 const bool show_pin,
1309 const bool show_background,
1310 const bool region_search_filter_active)
1315 const rcti header_rect = {
1334 region_search_filter_active);
1354 return region->overlap != 0;
1366#define TABS_PADDING_BETWEEN_FACTOR 4.0f
1367#define TABS_PADDING_TEXT_FACTOR 6.0f
1373 View2D *v2d = ®ion->v2d;
1377 float fstyle_points = fstyle->
points;
1380 ((
uiBlock *)region->uiblocks.first)->aspect;
1381 const float zoom = 1.0f / aspect;
1382 const int px =
U.pixelsize;
1394#ifdef USE_FLAT_INACTIVE
1395 bool is_active_prev =
false;
1401 int y_ofs = tab_v_pad;
1404 uchar theme_col_back[4];
1405 uchar theme_col_text[3];
1406 uchar theme_col_text_hi[3];
1409 uchar theme_col_tab_bg[4];
1410 float theme_col_tab_active[4];
1411 float theme_col_tab_inactive[4];
1412 float theme_col_tab_outline[4];
1423 is_alpha = (region->overlap && (theme_col_back[3] != 255));
1438 rcti *rct = &pc_dyn->rect;
1439 const char *category_id = pc_dyn->idname;
1440 const char *category_id_draw =
IFACE_(category_id);
1443 rct->
xmin = rct_xmin;
1444 rct->
xmax = rct_xmax;
1446 rct->
ymin = v2d->
mask.
ymax - (y_ofs + category_width + (tab_v_pad_text * 2));
1449 y_ofs += category_width + tab_v_pad + (tab_v_pad_text * 2);
1453 const int scroll =
clamp_i(region->category_scroll, 0, max_scroll);
1454 region->category_scroll = scroll;
1456 rcti *rct = &pc_dyn->rect;
1457 rct->
ymin += scroll;
1458 rct->
ymax += scroll;
1493 const rcti *rct = &pc_dyn->rect;
1502 const char *category_id = pc_dyn->idname;
1503 const char *category_id_draw =
IFACE_(category_id);
1505 const bool is_active =
STREQ(category_id, category_id_active);
1509#ifdef USE_FLAT_INACTIVE
1511 if (is_active ==
false && is_active_prev ==
false && pc_dyn->prev) {
1518 v2d->
mask.
xmax - (category_tabs_width / 5),
1520 is_left ? (v2d->
mask.
xmin + category_tabs_width) - (category_tabs_width / 5) :
1521 (v2d->
mask.
xmax - category_tabs_width) + (category_tabs_width / 5),
1522 rct->
ymax + (px * 3));
1526 is_active_prev = is_active;
1542 is_active ? theme_col_tab_active : theme_col_tab_inactive);
1562 const int text_v_ofs = (rct_xmax - rct_xmin) * 0.5f;
1564 const int text_size_offset =
int(fstyle_points *
UI_SCALE_FAC * 0.35f);
1567 is_left ? rct->
xmax - text_v_ofs + text_size_offset :
1568 rct->
xmin + text_v_ofs - text_size_offset,
1571 BLF_color3ubv(fontid, is_active ? theme_col_text_hi : theme_col_text);
1572 BLF_draw(fontid, category_id_draw, category_draw_len);
1578 pc_dyn->rect.xmin = v2d->
mask.
xmin;
1581 pc_dyn->rect.xmax = v2d->
mask.
xmax;
1590#undef TABS_PADDING_BETWEEN_FACTOR
1591#undef TABS_PADDING_TEXT_FACTOR
1602 return panel->
sizey;
1668 if (pin_last_a && !pin_last_b) {
1671 if (!pin_last_a && pin_last_b) {
1713 pachild->ofsx = panel->
ofsx;
1717 if (pachild->children.first) {
1730 int active_panels_len = 0;
1735 active_panels_len++;
1738 if (active_panels_len == 0) {
1758 for (
int i = 0; i < active_panels_len; i++) {
1769 for (
int i = 0; i < active_panels_len; i++) {
1777 for (
int i = 0, y = 0; i < active_panels_len; i++) {
1784 if (show_background) {
1795 bool changed =
false;
1796 for (
int i = 0; i < active_panels_len; i++) {
1817 if (panel->children.first) {
1832 bool has_panel_with_background =
false;
1837 const int pa_sizex = panel->ofsx + panel->sizex;
1840 sizex =
max_ii(sizex, pa_sizex);
1841 sizey =
min_ii(sizey, pa_sizey);
1843 has_panel_with_background =
true;
1856 if (has_panel_with_background) {
1892 const bool was_active = panel->runtime_flag &
PANEL_ACTIVE;
1894 panel->runtime_flag &= flag_copy;
1931 BLI_assert(panel->runtime->block !=
nullptr);
1938 if (block->active && block->panel) {
1968#define DRAG_REGION_PAD (PNL_HEADER * 0.5)
1977 float dy =
float(y - data->starty);
1983 dy += (
float(region->v2d.cur.ymin) - data->start_cur_ymin);
1991#undef DRAG_REGION_PAD
2047 const int xy_dst[2])
2055 float xy_b_block[2] = {
float(xy_dst[0]),
float(xy_dst[1])};
2056 Panel *panel = block->panel;
2058 if (panel ==
nullptr) {
2063 xy_b_block[0] = dragcol_data->
xy_init[0];
2070 rctf rect = block->rect;
2071 rect.
ymin = block->rect.ymax + header.start_y;
2072 rect.
ymax = block->rect.ymax + header.end_y;
2076 &header.open_owner_ptr, header.open_prop_name.c_str(), !dragcol_data->
was_first_open);
2079 &header.open_owner_ptr,
2089 const int oldflag = panel->
flag;
2092 rctf rect = block->rect;
2103 if (panel->
flag != oldflag) {
2124 switch (event->
type) {
2177 bContext *C,
const uiBlock *block,
const int ,
const int my,
const int event_type)
2183 if (header ==
nullptr) {
2204 const int event_type,
2214 const bool is_subpanel = (panel->
type->
parent !=
nullptr);
2216 const bool show_pin = use_pin && (panel->
flag &
PNL_PIN);
2217 const bool show_drag = !is_subpanel;
2226 float expansion_area_xmax = block->
rect.
xmax;
2228 expansion_area_xmax -= (
PNL_ICON * 1.5f);
2236 if (ctrl && !is_subpanel) {
2274 const float drag_area_xmax = block->
rect.
xmax;
2275 if (
IN_RANGE(mx, drag_area_xmin, drag_area_xmax)) {
2289 const float pin_area_xmin = expansion_area_xmax;
2290 const float pin_area_xmax = pin_area_xmin +
PNL_ICON;
2291 if (
IN_RANGE(mx, pin_area_xmin, pin_area_xmax)) {
2302 return region->panels_category.first &&
2303 region->panels_category.first != region->panels_category.last;
2325 ListBase *lb = ®ion->panels_category_active;
2332 pc_act = MEM_cnew<PanelCategoryStack>(__func__);
2350 pc_act_next = pc_act->
next;
2351 while ((pc_act = pc_act_next)) {
2352 pc_act_next = pc_act->
next;
2390 return pc_act->idname;
2433 const uiBut *active_but)
2436 const bool inside_tabregion =
2439 (
event->mval[0] > ((
PanelCategoryDyn *)region->panels_category.first)->rect.xmin));
2442 if (is_mousewheel && (event->
modifier &
KM_CTRL) == 0 && !inside_tabregion) {
2456 if (is_mousewheel) {
2461 const bool backwards =
event->modifier &
KM_SHIFT;
2462 pc_dyn = backwards ? pc_dyn->
prev : pc_dyn->
next;
2465 pc_dyn = backwards ?
static_cast<PanelCategoryDyn *
>(region->panels_category.last) :
2487 const uiBut *active_but)
2533 const bool region_has_active_button = region_active_but &&
2537 Panel *panel = block->panel;
2538 if (panel ==
nullptr || panel->
type ==
nullptr) {
2545 int mx =
event->xy[0];
2546 int my =
event->xy[1];
2570 if (region_has_active_button) {
2635 Panel *panel = block->panel;
2636 if (panel ==
nullptr) {
2640 int mx =
event->xy[0];
2641 int my =
event->xy[1];
2667 Panel *panel =
static_cast<Panel *
>(userdata);
2698 Panel *panel =
static_cast<Panel *
>(userdata);
2725 if (!data->animtimer) {
2729 data->state =
state;
2732 data->startofsx = panel->
ofsx;
2733 data->startofsy = panel->
ofsy;
2734 data->start_cur_xmin = region->v2d.cur.xmin;
2735 data->start_cur_ymin = region->v2d.cur.ymin;
2750 if (data !=
nullptr && data->state ==
state) {
2776 if (data->animtimer) {
2778 data->animtimer =
nullptr;
ARegion * CTX_wm_region_popup(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
void CTX_store_set(bContext *C, const bContextStore *store)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
void BKE_panel_free(Panel *panel)
Panel * BKE_panel_new(PanelType *panel_type)
@ PANEL_TYPE_DEFAULT_CLOSED
void BLF_size(int fontid, float size)
void BLF_color3ubv(int fontid, const unsigned char rgb[3])
#define BLF_DRAW_STR_DUMMY_MAX
void BLF_disable(int fontid, int option)
void BLF_rotation(int fontid, float angle)
void BLF_draw(int fontid, const char *str, size_t str_len, ResultBLF *r_info=nullptr) ATTR_NONNULL(2)
void BLF_enable(int fontid, int option)
float BLF_width(int fontid, const char *str, size_t str_len, ResultBLF *r_info=nullptr) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2)
void BLF_position(int fontid, float x, float y, float z)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findstringindex(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE int round_fl_to_int(float a)
MINLINE int min_ii(int a, int b)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
MINLINE float interpf(float target, float origin, float t)
MINLINE int clamp_i(int value, int min, int max)
MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
bool BLI_rcti_isect_pt(const struct rcti *rect, int x, int y)
bool BLI_rctf_isect_segment(const struct rctf *rect, const float s1[2], const float s2[2])
void BLI_rctf_rcti_copy(struct rctf *dst, const struct rcti *src)
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
#define STRNCPY(dst, src)
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
Platform independent time functions.
double BLI_time_now_seconds(void)
#define STREQLEN(a, b, n)
#define IN_RANGE(a, b, c)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define CTX_IFACE_(context, msgid)
#define RGN_ALIGN_ENUM_FROM_MASK(align)
#define RGN_TYPE_HAS_CATEGORY_MASK
@ RGN_FLAG_SEARCH_FILTER_UPDATE
@ RGN_FLAG_SEARCH_FILTER_ACTIVE
@ PNL_INSTANCED_LIST_ORDER_CHANGED
void(*)(void *data_link, char *r_idname) uiListPanelIDFromDataFunc
void ED_region_tag_refresh_ui(ARegion *region)
void ED_region_tag_redraw(ARegion *region)
void GPU_batch_program_set_builtin(blender::gpu::Batch *batch, eGPUBuiltinShader shader_id)
void GPU_batch_draw(blender::gpu::Batch *batch)
blender::gpu::Batch * GPU_batch_preset_panel_drag_widget(float pixelsize, const float col_high[4], const float col_dark[4], float width) ATTR_WARN_UNUSED_RESULT
void GPU_matrix_translate_2f(float x, float y)
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_SHADER_3D_FLAT_COLOR
void GPU_blend(eGPUBlend blend)
void GPU_line_smooth(bool enable)
Read Guarded memory(de)allocation.
void UI_draw_roundbox_4fv(const rctf *rect, bool filled, float rad, const float col[4])
void UI_block_theme_style_set(uiBlock *block, char theme_style)
#define INSTANCED_PANEL_UNIQUE_STR_SIZE
const uiStyle * UI_style_get_dpi()
void UI_draw_roundbox_corner_set(int type)
#define UI_PANEL_MARGIN_X
const uiStyle * UI_style_get()
bool UI_block_is_search_only(const uiBlock *block)
void UI_block_draw(const bContext *C, uiBlock *block)
#define UI_PANEL_CATEGORY_MARGIN_WIDTH
@ UI_BLOCK_THEME_STYLE_POPUP
void UI_fontstyle_draw(const uiFontStyle *fs, const rcti *rect, const char *str, size_t str_len, const uchar col[4], const uiFontStyleDraw_Params *fs_params)
#define UI_PANEL_MARGIN_Y
bContextStore * uiLayoutGetContextStore(uiLayout *layout)
void UI_block_set_search_only(uiBlock *block, bool search_only)
void uiLayoutSetContextPointer(uiLayout *layout, const char *name, PointerRNA *ptr)
#define UI_NO_ICON_OVERLAY_TEXT
void UI_icon_draw_ex(float x, float y, int icon_id, float aspect, float alpha, float desaturate, const uchar mono_color[4], bool mono_border, const IconTextOverlay *text_overlay, const bool inverted=false)
void UI_GetThemeColor3ubv(int colorid, unsigned char col[3])
void UI_GetThemeColor4fv(int colorid, float col[4])
void UI_GetThemeColorShade4fv(int colorid, int offset, float col[4])
void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
char char UI_view2d_mouse_in_scrollers(const ARegion *region, const View2D *v2d, const int xy[2]) ATTR_NONNULL(1
void UI_view2d_offset(View2D *v2d, float xfac, float yfac)
#define WM_UI_HANDLER_CONTINUE
#define WM_UI_HANDLER_BREAK
const T & last(const int64_t n=0) const
local_group_size(16, 16) .push_constant(Type b
static float is_left(const float p0[2], const float p1[2], const float p2[2])
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void ui_window_to_block(const ARegion *region, const uiBlock *block, int *x, int *y)
void ui_block_bounds_calc(uiBlock *block)
rcti ui_to_pixelrect(const ARegion *region, const uiBlock *block, const rctf *src_rect)
void ui_window_to_block_fl(const ARegion *region, const uiBlock *block, float *x, float *y)
void ui_fontscale(float *points, float aspect)
bool ui_but_supports_cycling(const uiBut *but)
void ui_handle_afterfunc_add_operator(wmOperatorType *ot, wmOperatorCallContext opcontext)
@ UI_BUTTON_GROUP_PANEL_HEADER
bool ui_block_is_popup_any(const uiBlock *block) ATTR_WARN_UNUSED_RESULT
uiBut * ui_region_find_active_but(ARegion *region) ATTR_WARN_UNUSED_RESULT
void ui_block_views_bounds_calc(const uiBlock *block)
bool UI_panel_is_closed(const Panel *panel)
static void panel_activate_state(const bContext *C, Panel *panel, const uiHandlePanelState state)
static int get_panel_real_ofsy(Panel *panel)
static void panel_title_color_get(const Panel *panel, const bool show_background, const bool region_search_filter_active, uchar r_color[4])
static void panel_set_expansion_from_search_filter_recursive(const bContext *C, Panel *panel, const bool use_search_closed)
static void panel_set_runtime_flag_recursive(Panel *panel, short flag, bool value)
static void region_panels_set_expansion_from_search_filter(const bContext *C, ARegion *region, const bool use_search_closed)
void UI_panel_category_draw_all(ARegion *region, const char *category_id_active)
static void ui_panels_size(ARegion *region, int *r_x, int *r_y)
PanelCategoryDyn * UI_panel_category_find(const ARegion *region, const char *idname)
bool UI_panel_can_be_pinned(const Panel *panel)
static void ui_panel_drag_collapse_handler_remove(bContext *, void *userdata)
static void ui_do_animate(bContext *C, Panel *panel)
static int get_panel_real_size_y(const Panel *panel)
static void set_panels_list_data_expand_flag(const bContext *C, const ARegion *region)
void UI_panel_drawname_set(Panel *panel, blender::StringRef name)
Panel * UI_panel_find_by_type(ListBase *lb, const PanelType *pt)
@ PANEL_SEARCH_FILTER_MATCH
@ PANEL_USE_CLOSED_FROM_SEARCH
static void region_panels_set_expansion_from_list_data(const bContext *C, ARegion *region)
static void ui_panel_drag_collapse(const bContext *C, const uiPanelDragCollapseHandle *dragcol_data, const int xy_dst[2])
bool UI_panel_matches_search_filter(const Panel *panel)
static void panel_set_flag_recursive(Panel *panel, short flag, bool value)
static void region_panels_remove_invisible_layouts(ARegion *region)
void UI_panel_header_buttons_begin(Panel *panel)
void UI_panels_free_instanced(const bContext *C, ARegion *region)
static int ui_handler_panel(bContext *C, const wmEvent *event, void *userdata)
static void panel_delete(ARegion *region, ListBase *panels, Panel *panel)
void ui_draw_layout_panels_backdrop(const ARegion *region, const Panel *panel, const float radius, float subpanel_backcolor[4])
bool UI_panel_category_is_visible(const ARegion *region)
static void ui_panel_custom_data_set_recursive(Panel *panel, PointerRNA *custom_data)
bool ui_layout_panel_toggle_open(const bContext *C, LayoutPanelHeader *header)
static void get_panel_expand_flag(const Panel *panel, short *flag, short *flag_index)
static bool panel_type_context_poll(ARegion *region, const PanelType *panel_type, const char *context)
Panel * UI_panel_begin(ARegion *region, ListBase *lb, uiBlock *block, PanelType *pt, Panel *panel, bool *r_open)
static bool panel_custom_data_active_get(const Panel *panel)
int ui_handler_panel_region(bContext *C, const wmEvent *event, ARegion *region, const uiBut *active_but)
int UI_panel_size_y(const Panel *panel)
void UI_panels_begin(const bContext *, ARegion *region)
static bool panel_set_expand_from_list_data_recursive(Panel *panel, short flag, short *flag_index)
void UI_panels_end(const bContext *C, ARegion *region, int *r_x, int *r_y)
void UI_panel_category_active_set(ARegion *region, const char *idname)
void UI_panel_custom_data_set(Panel *panel, PointerRNA *custom_data)
static void ui_handler_remove_panel(bContext *C, void *userdata)
static bool panel_custom_pin_to_last_get(const Panel *panel)
void ui_panel_tag_search_filter_match(Panel *panel)
bool UI_panel_is_active(const Panel *panel)
static int get_panel_size_y(const Panel *panel)
bool UI_panel_should_show_background(const ARegion *region, const PanelType *panel_type)
static void panel_remove_invisible_layouts_recursive(Panel *panel, const Panel *parent_panel)
static void panel_draw_aligned_widgets(const uiStyle *style, const Panel *panel, const rcti *header_rect, const float aspect, const bool show_pin, const bool show_background, const bool region_search_filter_active)
static PanelCategoryDyn * panel_categories_find_mouse_over(ARegion *region, const wmEvent *event)
void UI_panel_category_clear_all(ARegion *region)
PanelCategoryStack * UI_panel_category_active_find(ARegion *region, const char *idname)
static bool panels_need_realign(const ScrArea *area, ARegion *region, Panel **r_panel_animation)
LayoutPanelHeader * ui_layout_panel_header_under_mouse(const Panel &panel, const int my)
static float panel_region_offset_x_get(const ARegion *region)
static void align_sub_panels(Panel *panel)
@ PANEL_MOUSE_INSIDE_HEADER
@ PANEL_MOUSE_INSIDE_LAYOUT_PANEL_HEADER
@ PANEL_MOUSE_INSIDE_CONTENT
static void panel_matches_search_filter_recursive(const Panel *panel, bool *filter_matches)
static void reorder_instanced_panel_list(bContext *C, ARegion *region, Panel *drag_panel)
static void panel_set_expansion_from_list_data(const bContext *C, Panel *panel)
#define TABS_PADDING_BETWEEN_FACTOR
int UI_panel_category_index_find(ARegion *region, const char *idname)
static Panel * panel_add_instanced(ListBase *panels, PanelType *panel_type, PointerRNA *custom_data)
static void panel_handle_data_ensure(const bContext *C, wmWindow *win, const ARegion *region, Panel *panel, const uiHandlePanelState state)
void UI_panel_category_active_set_default(ARegion *region, const char *idname)
#define ANIMATION_INTERVAL
void UI_panel_label_offset(const uiBlock *block, int *r_x, int *r_y)
#define TABS_PADDING_TEXT_FACTOR
static int compare_panel(const void *a, const void *b)
static int ui_panel_drag_collapse_handler(bContext *C, const wmEvent *event, void *userdata)
static void panels_collapse_all(ARegion *region, const Panel *from_panel)
static void panels_layout_begin_clear_flags(ListBase *lb)
static void ui_do_drag(const bContext *C, const wmEvent *event, Panel *panel)
void UI_panel_end(Panel *panel, int width, int height)
void UI_panel_category_index_active_set(ARegion *region, const int index)
bool UI_panel_list_matches_data(ARegion *region, ListBase *data, uiListPanelIDFromDataFunc panel_idname_func)
void UI_panel_header_buttons_end(Panel *panel)
bool UI_panel_is_dragging(const Panel *panel)
static void ui_offset_panel_block(uiBlock *block)
void UI_panels_draw(const bContext *C, ARegion *region)
static void panel_custom_data_active_set(Panel *panel)
static int ui_handle_panel_category_cycling(const wmEvent *event, ARegion *region, const uiBut *active_but)
PointerRNA * UI_panel_custom_data_get(const Panel *panel)
static bool panel_active_animation_changed(ListBase *lb, Panel **r_panel_animation, bool *r_no_animation)
static bool uiAlignPanelStep(ARegion *region, const float factor, const bool drag)
void UI_list_panel_unique_str(Panel *panel, char *r_name)
void UI_panel_context_pointer_set(Panel *panel, const char *name, PointerRNA *ptr)
void ui_panel_drag_collapse_handler_add(const bContext *C, const bool was_open)
Panel * UI_panel_add_instanced(const bContext *C, ARegion *region, ListBase *panels, const char *panel_idname, PointerRNA *custom_data)
void UI_panel_category_add(ARegion *region, const char *name)
static void panel_draw_aligned_backdrop(const ARegion *region, const Panel *panel, const rcti *rect, const rcti *header_rect)
static int find_highest_panel(const void *a, const void *b)
static void ui_handle_panel_header(const bContext *C, const uiBlock *block, const int mx, const int event_type, const bool ctrl, const bool shift)
static void ui_handle_layout_panel_header(bContext *C, const uiBlock *block, const int, const int my, const int event_type)
static void panel_calculate_size_recursive(ARegion *region, Panel *panel)
PointerRNA * UI_region_panel_custom_data_under_cursor(const bContext *C, const wmEvent *event)
const char * UI_panel_category_active_get(ARegion *region, bool set_fallback)
static void ui_panel_category_active_set(ARegion *region, const char *idname, bool fallback)
void ui_draw_aligned_panel(const ARegion *region, const uiStyle *style, const uiBlock *block, const rcti *rect, const bool show_pin, const bool show_background, const bool region_search_filter_active)
static void panel_draw_highlight_border(const Panel *panel, const rcti *rect, const rcti *header_rect)
static void panel_custom_pin_to_last_set(const bContext *C, const Panel *panel, const bool value)
static uiPanelMouseState ui_panel_mouse_state_get(const uiBlock *block, const Panel *panel, const int mx, const int my)
static bool properties_space_needs_realign(const ScrArea *area, const ARegion *region)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
ccl_device_inline float2 floor(const float2 a)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
bool RNA_pointer_is_null(const PointerRNA *ptr)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
blender::Vector< LayoutPanelBody > bodies
blender::Vector< LayoutPanelHeader > headers
struct PanelCategoryDyn * next
struct PanelCategoryDyn * prev
struct PanelCategoryStack * next
void(* reorder)(bContext *C, Panel *pa, int new_index)
char idname[BKE_ST_MAXNAME]
char pin_to_last_property[BKE_ST_MAXNAME]
char context[BKE_ST_MAXNAME]
char translation_context[BKE_ST_MAXNAME]
char active_property[BKE_ST_MAXNAME]
char category[BKE_ST_MAXNAME]
char label[BKE_ST_MAXNAME]
short(* get_list_data_expand_flag)(const bContext *C, Panel *pa)
PointerRNA * custom_data_ptr
LayoutPanels layout_panels
struct Panel_Runtime * runtime
uiWidgetColors wcol_menu_back
blender::Vector< uiButtonGroup > button_groups
struct wmEvent * eventstate
wmEventHandler_UI * WM_event_add_ui_handler(const bContext *C, ListBase *handlers, wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn, void *user_data, const eWM_EventHandlerFlag flag)
void WM_event_remove_ui_handler(ListBase *handlers, wmUIHandlerFunc handle_fn, wmUIHandlerRemoveFunc remove_fn, void *user_data, const bool postpone)
#define ISMOUSE_MOTION(event_type)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void WM_event_timer_remove(wmWindowManager *wm, wmWindow *, wmTimer *timer)
wmTimer * WM_event_timer_add(wmWindowManager *wm, wmWindow *win, const int event_type, const double time_step)