60#define ANIMATION_TIME 0.30
61#define ANIMATION_INTERVAL 0.02
125 const char *context);
134 Panel **r_panel_animation,
135 bool *r_no_animation)
139 if (!(panel->type && panel->type->parent)) {
150 *r_panel_animation = panel;
161 if (panel->activedata) {
164 *r_panel_animation = panel;
168 *r_no_animation =
true;
172 *r_panel_animation = panel;
197 *r_panel_animation =
nullptr;
204 Panel *panel_animation =
nullptr;
205 bool no_animation =
false;
211 if (panel_animation) {
213 *r_panel_animation = panel_animation;
246 int max_sortorder = 0;
248 max_sortorder = std::max(existing_panel->sortorder, max_sortorder);
260 const char *panel_idname,
268 if (panel_type ==
nullptr) {
269 printf(
"Panel type '%s' not found.\n", panel_idname);
334 if (panel->runtime->custom_data_ptr !=
nullptr) {
335 MEM_delete(panel->runtime->custom_data_ptr);
349 Link *data_link =
nullptr;
350 if (
data ==
nullptr) {
356 data_link =
static_cast<Link *
>(
data->first);
368 if (data_link ==
nullptr) {
374 panel_idname_func(data_link, panel_idname);
375 if (!
STREQ(panel_idname, panel->type->idname)) {
379 data_link = data_link->
next;
395 if (drag_panel->
type ==
nullptr) {
403 char *context =
nullptr;
409 int list_panels_len = 0;
410 int start_index = -1;
415 if (panel == drag_panel) {
417 start_index = list_panels_len;
428 MEM_callocN(list_panels_len *
sizeof(*panel_sort), __func__));
434 sort_index->
panel = panel;
440 qsort(panel_sort, list_panels_len,
sizeof(*panel_sort),
compare_panel);
443 int move_to_index = 0;
444 for (; move_to_index < list_panels_len; move_to_index++) {
445 if (panel_sort[move_to_index].panel == drag_panel) {
452 if (move_to_index == start_index) {
463 drag_panel->
type->
reorder(
C, drag_panel, move_to_index);
475 const bool open = (
flag & (1 << *flag_index));
481 *flag_index = *flag_index + 1;
501 short flag_index = 0;
533 *flag_index = *flag_index + 1;
550 if (panel_type ==
nullptr) {
557 short flag_index = 0;
559 if (panel->type->set_list_data_expand_flag) {
560 panel->type->set_list_data_expand_flag(
C, panel, expand_flag);
690 const char *idname = pt->
idname;
693 if (
STREQLEN(panel->panelname, idname,
sizeof(panel->panelname))) {
705 const bool newpanel = (panel ==
nullptr);
736 for (panel_last =
static_cast<Panel *
>(lb->
first); panel_last; panel_last = panel_last->
next) {
749 panel_next->sortorder++;
759 block->
panel = panel;
824 width =
max_ii(width, child_panel->sizex);
832 panel->
sizex = width;
833 panel->
sizey = height;
836 const int old_sizex = panel->
sizex, old_sizey = panel->
sizey;
841 panel->
sizex = width;
844 panel->
sizey = height;
848 if (panel->
sizex != old_sizex || panel->
sizey != old_sizey) {
883 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
884 but->rect.ymin += ofsy;
885 but->rect.ymax += ofsy;
903 if (!*filter_matches) {
912 bool search_filter_matches =
false;
914 return search_filter_matches;
922 const bool use_search_closed)
942 const bool use_search_closed)
964 for (
const std::unique_ptr<uiBut> &but : block->
buttons) {
984 BLI_assert(child_panel->runtime->block !=
nullptr);
1046#define PNL_ICON UI_UNIT_X
1062 const bool show_background,
1063 const bool region_search_filter_active,
1066 if (!show_background) {
1077 if (region_search_filter_active && !search_match) {
1086 const rcti *header_rect)
1088 const bool is_subpanel = panel->
type->
parent !=
nullptr;
1111 const rcti *header_rect,
1113 const bool show_pin,
1114 const bool show_background,
1115 const bool region_search_filter_active)
1117 const bool is_subpanel = panel->
type->
parent !=
nullptr;
1125 widget_rect.
xmin = header_rect->
xmin + (is_subpanel ? scaled_unit * 0.7f : 0);
1126 widget_rect.
xmax = header_rect->
xmax;
1127 widget_rect.
ymin = header_rect->
ymin;
1128 widget_rect.
ymax = header_rect->
ymax;
1130 uchar title_color[4];
1132 title_color[3] = 255;
1153 title_rect.
xmin = widget_rect.
xmin + (panel->
labelofs / aspect) + scaled_unit * 1.1f;
1154 title_rect.
xmax = widget_rect.
xmax;
1155 title_rect.
ymin = widget_rect.
ymin - 2.0f / aspect;
1156 title_rect.
ymax = widget_rect.
ymax;
1168 widget_rect.
ymin + 5.0f / aspect,
1180 if (!is_subpanel && show_background) {
1181 const float x = widget_rect.
xmax - scaled_unit * 1.15;
1182 const float y = widget_rect.
ymin + (header_height - (header_height * 0.7f)) * 0.5f;
1184 const int icon = is_pin ? ICON_PINNED : ICON_GRIP;
1186 const float alpha = is_pin ? 1.0f : 0.5f;
1194 float subpanel_backcolor[4])
1218 if (is_main_panel_end) {
1228 rctf panel_pixelspacef;
1237 const rcti *header_rect)
1240 const bool is_subpanel = panel->
type->
parent !=
nullptr;
1243 if (is_subpanel && !is_open) {
1255 if (is_open || !has_header) {
1256 float panel_backcolor[4];
1272 float subpanel_backcolor[4];
1278 if (!is_subpanel && has_header) {
1279 float panel_headercolor[4];
1301 const bool show_pin,
1302 const bool show_background,
1303 const bool region_search_filter_active)
1308 const rcti header_rect = {
1327 region_search_filter_active);
1359#define TABS_PADDING_BETWEEN_FACTOR 4.0f
1360#define TABS_PADDING_TEXT_FACTOR 6.0f
1371 float fstyle_points = fstyle->
points;
1375 const float zoom = 1.0f / aspect;
1376 const int px =
U.pixelsize;
1388#ifdef USE_FLAT_INACTIVE
1389 bool is_active_prev =
false;
1395 int y_ofs = tab_v_pad;
1398 uchar theme_col_back[4];
1399 uchar theme_col_text[3];
1400 uchar theme_col_text_hi[3];
1403 uchar theme_col_tab_bg[4];
1404 float theme_col_tab_active[4];
1405 float theme_col_tab_inactive[4];
1406 float theme_col_tab_outline[4];
1417 is_alpha = (region->
overlap && (theme_col_back[3] != 255));
1432 rcti *rct = &pc_dyn->rect;
1433 const char *category_id = pc_dyn->idname;
1434 const char *category_id_draw =
IFACE_(category_id);
1437 rct->
xmin = rct_xmin;
1438 rct->
xmax = rct_xmax;
1440 rct->
ymin = v2d->
mask.
ymax - (y_ofs + category_width + (tab_v_pad_text * 2));
1443 y_ofs += category_width + tab_v_pad + (tab_v_pad_text * 2);
1450 rcti *rct = &pc_dyn->rect;
1451 rct->
ymin += scroll;
1452 rct->
ymax += scroll;
1476 v2d->
mask.
xmax - category_tabs_width,
1489 const rcti *rct = &pc_dyn->rect;
1498 const char *category_id = pc_dyn->idname;
1499 const char *category_id_draw =
IFACE_(category_id);
1501 const bool is_active =
STREQ(category_id, category_id_active);
1505#ifdef USE_FLAT_INACTIVE
1507 if (is_active ==
false && is_active_prev ==
false && pc_dyn->prev) {
1513 v2d->
mask.
xmax - (category_tabs_width / 5),
1515 is_left ? (v2d->
mask.
xmin + category_tabs_width) - (category_tabs_width / 5) :
1516 (v2d->
mask.
xmax - category_tabs_width) + (category_tabs_width / 5),
1517 rct->
ymax + (px * 3));
1521 is_active_prev = is_active;
1537 is_active ? theme_col_tab_active : theme_col_tab_inactive);
1556 const int text_v_ofs = (rct_xmax - rct_xmin) * 0.5f;
1558 const int text_size_offset = int(fstyle_points *
UI_SCALE_FAC * 0.35f);
1561 is_left ? rct->
xmax - text_v_ofs + text_size_offset :
1562 rct->
xmin + text_v_ofs - text_size_offset,
1565 BLF_color3ubv(fontid, is_active ? theme_col_text_hi : theme_col_text);
1566 BLF_draw(fontid, category_id_draw, category_draw_len);
1572 pc_dyn->rect.xmin = v2d->
mask.
xmin;
1575 pc_dyn->rect.xmax = v2d->
mask.
xmax;
1584#undef TABS_PADDING_BETWEEN_FACTOR
1585#undef TABS_PADDING_TEXT_FACTOR
1596 const bool is_active =
STREQ(pc_dyn->idname, region->
runtime->category);
1600 const rcti *rct = &pc_dyn->rect;
1605 const int tab_v_pad = rct->
ymin - pc_dyn_next->
rect.
ymax;
1620 return panel->
sizey;
1686 if (pin_last_a && !pin_last_b) {
1689 if (!pin_last_a && pin_last_b) {
1731 pachild->ofsx = panel->
ofsx;
1735 if (pachild->children.first) {
1748 int active_panels_len = 0;
1753 active_panels_len++;
1756 if (active_panels_len == 0) {
1775 for (
int i = 0;
i < active_panels_len;
i++) {
1786 for (
int i = 0;
i < active_panels_len;
i++) {
1794 for (
int i = 0,
y = 0;
i < active_panels_len;
i++) {
1801 if (show_background) {
1812 bool changed =
false;
1813 for (
int i = 0;
i < active_panels_len;
i++) {
1834 if (panel->children.first) {
1849 bool has_panel_with_background =
false;
1854 const int pa_sizex = panel->ofsx + panel->sizex;
1857 sizex =
max_ii(sizex, pa_sizex);
1858 sizey =
min_ii(sizey, pa_sizey);
1860 has_panel_with_background =
true;
1873 if (has_panel_with_background) {
1909 const bool was_active = panel->runtime_flag &
PANEL_ACTIVE;
1911 panel->runtime_flag &= flag_copy;
1948 BLI_assert(panel->runtime->block !=
nullptr);
1955 if (block->active && block->panel) {
1985#define DRAG_REGION_PAD (PNL_HEADER * 0.5)
1994 float dy = float(
y -
data->starty);
2008#undef DRAG_REGION_PAD
2064 const int xy_dst[2])
2071 float xy_a_block[2] = {float(dragcol_data->
xy_init[0]), float(dragcol_data->
xy_init[1])};
2072 float xy_b_block[2] = {float(xy_dst[0]), float(xy_dst[1])};
2073 Panel *panel = block->panel;
2075 if (panel ==
nullptr) {
2080 xy_b_block[0] = dragcol_data->
xy_init[0];
2087 rctf rect = block->rect;
2089 rect.
ymax = block->rect.ymax + header.
end_y;
2106 const int oldflag = panel->
flag;
2109 rctf rect = block->rect;
2120 if (panel->
flag != oldflag) {
2141 switch (event->
type) {
2197 bContext *
C,
const uiBlock *block,
const int ,
const int my,
const int event_type)
2203 if (header ==
nullptr) {
2224 const int event_type,
2234 const bool is_subpanel = (panel->
type->
parent !=
nullptr);
2236 const bool show_pin = use_pin && (panel->
flag &
PNL_PIN);
2237 const bool show_drag = !is_subpanel;
2246 float expansion_area_xmax = block->
rect.
xmax;
2248 expansion_area_xmax -= (
PNL_ICON * 1.5f);
2256 if (ctrl && !is_subpanel) {
2294 const float drag_area_xmax = block->
rect.
xmax;
2295 if (
IN_RANGE(mx, drag_area_xmin, drag_area_xmax)) {
2307 const float pin_area_xmin = expansion_area_xmax;
2308 const float pin_area_xmax = pin_area_xmin +
PNL_ICON;
2309 if (
IN_RANGE(mx, pin_area_xmin, pin_area_xmax)) {
2320 return region->
runtime->panels_category.first &&
2321 region->
runtime->panels_category.first != region->
runtime->panels_category.last;
2369 pc_act_next = pc_act->
next;
2370 while ((pc_act = pc_act_next)) {
2371 pc_act_next = pc_act->
next;
2409 return pc_act->idname;
2415 region->
runtime->panels_category.first);
2453 const uiBut *active_but)
2456 const bool inside_tabregion =
2464 if (is_mousewheel && (event->
modifier &
KM_CTRL) == 0 && !inside_tabregion) {
2478 if (is_mousewheel) {
2483 const bool backwards =
event->modifier &
KM_SHIFT;
2484 pc_dyn = backwards ? pc_dyn->
prev : pc_dyn->
next;
2487 pc_dyn = backwards ?
2510 const uiBut *active_but)
2559 const bool region_has_active_button = region_active_but &&
2563 Panel *panel = block->panel;
2564 if (panel ==
nullptr || panel->
type ==
nullptr) {
2571 int mx =
event->xy[0];
2572 int my =
event->xy[1];
2594 if (region_has_active_button) {
2659 Panel *panel = block->panel;
2660 if (panel ==
nullptr) {
2664 int mx =
event->xy[0];
2665 int my =
event->xy[1];
2691 Panel *panel =
static_cast<Panel *
>(userdata);
2722 Panel *panel =
static_cast<Panel *
>(userdata);
2749 if (!
data->animtimer) {
2800 if (
data->animtimer) {
2802 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_TYPE_DEFAULT_CLOSED
Panel * BKE_panel_new(PanelType *panel_type)
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)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findstringindex(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const 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)
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
char * STRNCPY(char(&dst)[N], const char *src)
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)
@ PNL_INSTANCED_LIST_ORDER_CHANGED
#define RGN_TYPE_HAS_CATEGORY_MASK
@ RGN_FLAG_SEARCH_FILTER_UPDATE
@ RGN_FLAG_SEARCH_FILTER_ACTIVE
void(*)(void *data_link, char *r_idname) uiListPanelIDFromDataFunc
void ED_region_tag_refresh_ui(ARegion *region)
bool ED_region_panel_category_gutter_isect_xy(const ARegion *region, const int event_xy[2])
void ED_region_tag_redraw(ARegion *region)
@ GPU_SHADER_3D_UNIFORM_COLOR
void GPU_blend(eGPUBlend blend)
void GPU_line_smooth(bool enable)
Read Guarded memory(de)allocation.
bool UI_panel_is_closed(const Panel *panel)
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
@ UI_BLOCK_THEME_STYLE_POPUP
const uiStyle * UI_style_get()
bool UI_block_is_search_only(const uiBlock *block)
void UI_fontstyle_set(const uiFontStyle *fs)
void UI_block_draw(const bContext *C, uiBlock *block)
#define UI_PANEL_CATEGORY_MARGIN_WIDTH
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
bool UI_panel_is_dragging(const Panel *panel)
void UI_block_set_search_only(uiBlock *block, bool search_only)
const char * UI_panel_category_active_get(ARegion *region, bool set_fallback)
#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 uiLayoutSetContextPointer(uiLayout *layout, blender::StringRef name, PointerRNA *ptr)
bContextStore * uiLayoutGetContextStore(uiLayout *layout)
void UI_GetThemeColor3ubv(int colorid, unsigned char col[3])
void UI_GetThemeColor4fv(int colorid, 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
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
const T & last(const int64_t n=0) const
constexpr int64_t size() const
constexpr const char * data() const
static float is_left(const float p0[2], const float p1[2], const float p2[2])
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)
void ui_block_views_end(ARegion *region, const uiBlock *block)
@ 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_panel_stop_animation(const bContext *C, Panel *panel)
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 int ui_panel_category_show_active_tab(ARegion *region, const int mval[2])
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)
static void ui_panel_exit_state_recursive(const bContext *C, 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_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
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)
ListBase panels_category_active
ARegionRuntimeHandle * runtime
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< std::unique_ptr< uiBut > > buttons
blender::Vector< uiButtonGroup > button_groups
wmEventModifierFlag modifier
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)
wmTimer * WM_event_timer_add(wmWindowManager *wm, wmWindow *win, const wmEventType event_type, const double time_step)
void WM_event_timer_remove(wmWindowManager *wm, wmWindow *, wmTimer *timer)