32#include "RNA_prototypes.hh"
114 layout->
label(
"", icon);
128 subrow->
prop(&listptr,
132 ICON_ARROW_LEFTRIGHT);
135 subrow = &row->
row(
true);
138 subrow->
prop(&listptr,
139 "use_filter_sort_reverse",
152 const size_t slen = strlen(filter_raw);
155 if (slen + 3 <=
sizeof(storage_.filter_buff)) {
156 filter_ = storage_.filter_buff;
183 const int fn_flag = FNM_CASEFOLD | FNM_NOESCAPE;
184 if (fnmatch(filter_,
name.c_str(), fn_flag) == 0) {
206 const char *propname,
219 if (
len && (order_by_name || item_filter_fn)) {
221 int order_idx = 0,
i = 0;
227 if (item_filter_fn) {
233 bool do_order =
false;
237 namebuf =
BLI_strdup(get_name_fn(itemptr,
i).c_str());
243 const char *
name = namebuf ? namebuf :
"";
245 if (item_filter_fn) {
252 if (!filter_exclude) {
255 do_order = order_by_name;
259 else if (filter_exclude) {
262 do_order = order_by_name;
266 do_order = order_by_name;
270 names[order_idx].
org_idx = order_idx;
292 for (new_idx = 0; new_idx < order_idx; new_idx++) {
325 const char *propname)
361 const char *item_dyntip_propname,
369 RNA_warning(
"template_list using default '%s' UIList class must provide a custom list_id",
374 if (!active_dataptr->
data) {
379 r_input_data->
dataptr = *dataptr;
382 if (!r_input_data->
prop) {
394 active_propname.
c_str());
398 if (r_input_data->
prop) {
401 RNA_warning(
"Expected a collection data property");
408 RNA_warning(
"Expected an integer active data property");
414 RNA_warning(
"List type %s not found", std::string(listtype_name).c_str());
435 bool activei_mapping_pending =
true;
442 new_order_idx = order_reverse ? dyn_data->
items_shown - new_order_idx - 1 : new_order_idx;
445 new_order_idx = order_reverse ? dyn_data->
items_shown - ++reorder_i : reorder_i++;
448 r_items->
item_vec[new_order_idx].item = itemptr;
449 r_items->
item_vec[new_order_idx].org_idx =
i;
454 if (activei_mapping_pending && activei ==
i) {
455 activei = new_order_idx;
457 activei_mapping_pending =
false;
460 else if (activei <
i) {
464 if (prev_order_idx >= 0) {
465 activei = prev_order_idx;
469 activei = new_order_idx;
474 prev_ii = new_order_idx;
500 int prev_ii = -1, prev_i;
514 if (items_shown >= 0) {
530 const bool use_auto_size = (ui_list->
list_grip <
533 int actual_rows = layout_data->
rows;
534 int actual_maxrows = layout_data->
maxrows;
535 int columns = layout_data->
columns;
538 if (actual_rows <= 0) {
542 if (actual_maxrows < actual_rows) {
543 actual_maxrows =
max_ii(actual_rows, 5);
561 if (!use_auto_size) {
565 else if ((actual_rows != actual_maxrows) && (dyn_data->
height > actual_rows)) {
575 if (activei_row < ui_list->list_scroll) {
578 else if (activei_row >= ui_list->
list_scroll + actual_rows) {
579 ui_list->
list_scroll = activei_row - actual_rows + 1;
584 const int max_scroll =
max_ii(0, dyn_data->
height - actual_rows);
614 if (propname && propname[0] && itemptr && itemptr->
data) {
626 char *dyn_tooltip =
static_cast<char *
>(argN);
627 std::string tooltip_string = dyn_tooltip;
629 tooltip_string +=
'\n';
630 tooltip_string += tip;
632 return tooltip_string;
647 if (region ==
nullptr) {
681 ui_list->
type = ui_list_type;
703 uiLayout *glob =
nullptr, *box, *row, *
col, *sub, *overlap;
705 int rnaicon = ICON_NONE, icon = ICON_NONE;
721 glob = &box->
column(
true);
722 row = &glob->
row(
false);
723 col = &row->column(
true);
726 adjusted_layout_data.
columns = 1;
728 uilist_prepare(ui_list, items, &adjusted_layout_data, &visual_info);
739 const int org_i = items->
item_vec[
i].org_idx;
740 const int flt_flag = items->
item_vec[
i].flt_flag;
743 overlap = &
col->overlap();
763 editable ?
TIP_(
"Select List Item "
764 "(Double click to rename)") :
765 TIP_(
"Select List Item"));
777 sub = &item_row->
row(
false);
779 if (icon == ICON_DOT) {
795 but->
context = sub->context_store();
809 col->label(
"", ICON_NONE);
833 row = &layout->
row(
true);
842 if (icon == ICON_DOT) {
858 row->label(
"", ICON_NONE);
885 glob = &box->
column(
true);
887 row = &glob->
row(
false);
894 const int cols_per_row = std::max(
int((box->width() -
V2D_SCROLL_WIDTH) / size_x), 1);
898 adjusted_layout_data.
columns = cols_per_row;
899 uilist_prepare(ui_list, items, &adjusted_layout_data, &visual_info);
905 const int org_i = items->
item_vec[
i].org_idx;
906 const int flt_flag = items->
item_vec[
i].flt_flag;
909 col = &overlap->column(
false);
930 col = &overlap->column(
false);
978 if (glob && add_filters_but) {
997 row = &glob->
row(
true);
998 uiBlock *subblock = row->block();
1006 ICON_DISCLOSURE_TRI_DOWN,
1014 TIP_(
"Hide filtering options"));
1036 subblock =
col->block();
1057 ICON_DISCLOSURE_TRI_RIGHT,
1065 TIP_(
"Show filtering options"));
1091 const char *listtype_name,
1092 const char *list_id,
1097 const char *item_dyntip_propname,
1113 item_dyntip_propname,
1150 layout_data.
rows = rows;
1151 layout_data.
maxrows = maxrows;
1152 layout_data.
columns = columns;
1161 const char *listtype_name,
1162 const char *list_id,
1166 const char *active_propname,
1167 const char *item_dyntip_propname,
1182 item_dyntip_propname,
ARegion * CTX_wm_region_popup(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
void(*)(uiList *ui_list, const bContext *C, PointerRNA *, const char *propname) uiListFilterItemsFunc
void(*)(uiList *ui_list, const bContext *C, uiLayout *layout) uiListDrawFilterFunc
void(*)(uiList *ui_list, const bContext *C, uiLayout *layout, PointerRNA *dataptr, PointerRNA *itemptr, int icon, PointerRNA *active_dataptr, const char *active_propname, int index, int flt_flag) uiListDrawItemFunc
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int round_fl_to_int(float a)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
int char char int BLI_strcasecmp(const char *s1, const char *s2) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
char * STRNCPY(char(&dst)[N], const char *src)
char char * BLI_strncpy_ensure_pad(char *__restrict dst, const char *__restrict src, char pad, size_t dst_maxncpy) ATTR_NONNULL(1
#define SNPRINTF_UTF8(dst, format,...)
#define STRNCPY_UTF8(dst, src)
#define UI_LIST_AUTO_SIZE_THRESHOLD
@ UILST_FLT_ITEM_NEVER_SHOW
@ UILST_LAYOUT_BIG_PREVIEW_GRID
@ UILST_SCROLL_TO_ACTIVE_ITEM
void ED_region_tag_refresh_ui(ARegion *region)
Read Guarded memory(de)allocation.
#define RNA_PROP_BEGIN(sptr, itemptr, prop)
#define RNA_warning(format,...)
void UI_but_func_set(uiBut *but, std::function< void(bContext &)> func)
blender::FunctionRef< std::string(const PointerRNA &itemptr, int index)> uiListItemGetNameFn
@ UI_LIST_ITEM_FILTER_MISMATCHES
@ UI_LIST_ITEM_NEVER_SHOW
@ UI_LIST_ITEM_FILTER_MATCHES
blender::FunctionRef< eUIListFilterResult( const PointerRNA &itemptr, blender::StringRefNull name, int index)> uiListItemFilterFn
uiBut * uiDefButI(uiBlock *block, ButType type, int retval, blender::StringRef str, int x, int y, short width, short height, int *poin, float min, float max, std::optional< blender::StringRef > tip)
void UI_but_flag_disable(uiBut *but, int flag)
void UI_block_emboss_set(uiBlock *block, blender::ui::EmbossType emboss)
uiBut * uiDefIconButBitI(uiBlock *block, ButType type, int bit, int retval, int icon, int x, int y, short width, short height, int *poin, float min, float max, std::optional< blender::StringRef > tip)
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *arg, uiFreeArgFunc free_arg)
int UI_preview_tile_size_y(const int size_px=96)
void UI_block_flag_disable(uiBlock *block, int flag)
void UI_but_drawflag_enable(uiBut *but, int flag)
uiBut * uiDefButR_prop(uiBlock *block, ButType type, int retval, std::optional< blender::StringRef > str, int x, int y, short width, short height, PointerRNA *ptr, PropertyRNA *prop, int index, float min, float max, std::optional< blender::StringRef > tip)
uiBut * uiDefIconTextButR_prop(uiBlock *block, ButType type, int retval, int icon, std::optional< blender::StringRef > str, int x, int y, short width, short height, PointerRNA *ptr, PropertyRNA *prop, int index, float min, float max, std::optional< blender::StringRef > tip)
#define UI_UL_DEFAULT_CLASS_NAME
uiBut * uiDefIconButI(uiBlock *block, ButType type, int retval, int icon, int x, int y, short width, short height, int *poin, float min, float max, std::optional< blender::StringRef > tip)
int UI_preview_tile_size_x(const int size_px=96)
void UI_block_flag_enable(uiBlock *block, int flag)
int UI_preview_tile_size_y_no_label(const int size_px=96)
uiBut * uiDefBut(uiBlock *block, uiButTypeWithPointerType but_and_ptr_type, int retval, blender::StringRef str, int x, int y, short width, short height, void *poin, float min, float max, std::optional< blender::StringRef > tip)
void UI_but_flag_enable(uiBut *but, int flag)
@ UI_TEMPLATE_LIST_SORT_LOCK
@ UI_TEMPLATE_LIST_SORT_REVERSE
@ UI_TEMPLATE_LIST_NO_NAMES
@ UI_TEMPLATE_LIST_NO_FILTER_OPTIONS
@ UI_TEMPLATE_LIST_NO_GRIP
int UI_icon_from_rnaptr(const bContext *C, PointerRNA *ptr, int rnaicon, bool big)
void uiLayoutListItemAddPadding(uiLayout *layout)
void resize(const int64_t new_size)
constexpr bool is_empty() const
constexpr const char * c_str() const
uiListNameFilter(uiList &list)
eUIListFilterResult operator()(const PointerRNA &itemptr, blender::StringRefNull name, int index)
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
void ui_layout_list_set_labels_active(uiLayout *layout)
uiListType * UI_UL_cache_file_layers()
static int cmpstringp(const void *p1, const void *p2)
static std::string uilist_item_tooltip_func(bContext *, void *argN, const StringRef tip)
static uiList * ui_list_ensure(const bContext *C, uiListType *ui_list_type, const char *list_id, int layout_type, bool sort_reverse, bool sort_lock)
static void uilist_resize_update(bContext *C, uiList *ui_list)
static void uilist_free_dyn_data(uiList *ui_list)
static void * uilist_item_use_dynamic_tooltip(PointerRNA *itemptr, const char *propname)
static bool ui_template_list_data_retrieve(const StringRef listtype_name, const char *list_id, PointerRNA *dataptr, const StringRefNull propname, PointerRNA *active_dataptr, const StringRefNull active_propname, const char *item_dyntip_propname, TemplateListInputData *r_input_data, uiListType **r_list_type)
void UI_list_filter_and_sort_items(uiList *ui_list, const bContext *, uiListItemFilterFn item_filter_fn, PointerRNA *dataptr, const char *propname, uiListItemGetNameFn get_name_fn)
static void ui_template_list_collect_display_items(const bContext *C, uiList *ui_list, TemplateListInputData *input_data, const uiListFilterItemsFunc filter_items_fn, TemplateListItems *r_items)
static void uilist_draw_filter_default(uiList *ui_list, const bContext *, uiLayout *layout)
static void uilist_filter_items_default(uiList *ui_list, const bContext *C, PointerRNA *dataptr, const char *propname)
void uiTemplateList(uiLayout *layout, const bContext *C, const char *listtype_name, const char *list_id, PointerRNA *dataptr, blender::StringRefNull propname, PointerRNA *active_dataptr, const char *active_propname, const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns, enum uiTemplateListFlags flags)
uiList * uiTemplateList_ex(uiLayout *layout, const bContext *C, const char *listtype_name, const char *list_id, PointerRNA *dataptr, const StringRefNull propname, PointerRNA *active_dataptr, const StringRefNull active_propname, const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns, enum uiTemplateListFlags flags, void *customdata)
static void ui_template_list_collect_items(PointerRNA *list_ptr, PropertyRNA *list_prop, const uiList *ui_list, int activei, TemplateListItems *r_items)
static void ui_template_list_layout_draw(const bContext *C, uiList *ui_list, uiLayout *layout, TemplateListInputData *input_data, TemplateListItems *items, const TemplateListLayoutDrawData *layout_data, const enum uiTemplateListFlags flags)
static void uilist_prepare(uiList *ui_list, const TemplateListItems *items, const TemplateListLayoutDrawData *layout_data, TemplateListVisualInfo *r_visual_info)
bool UI_list_item_index_is_filtered_visible(const uiList *ui_list, const int item_idx)
static void uilist_draw_item_default(uiList *ui_list, const bContext *, uiLayout *layout, PointerRNA *, PointerRNA *itemptr, int icon, PointerRNA *, const char *, int, int)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
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)
void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
StructRNA * RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
char * RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen, int *r_len)
PropertyType RNA_property_type(PropertyRNA *prop)
char * RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen, int *r_len)
const char * RNA_struct_identifier(const StructRNA *type)
int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
int RNA_property_flag(PropertyRNA *prop)
int RNA_struct_ui_icon(const StructRNA *type)
PropertyRNA * RNA_struct_name_property(const StructRNA *type)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
const char * RNA_property_identifier(const PropertyRNA *prop)
int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
char name[MAX_IDPROP_NAME]
blender::Vector< _uilist_item > item_vec
uiListDrawFilterFunc draw_filter
uiListDrawItemFunc draw_item
const bContextStore * context
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
uiLayout & grid_flow(bool row_major, int columns_len, bool even_columns, bool even_rows, bool align)
uiLayout & row(bool align)
uiLayout & list_box(uiList *ui_list, PointerRNA *actptr, PropertyRNA *actprop)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
uiListFreeRuntimeDataFunc free_runtime_data_fn
int * items_filter_neworder
uiListFilterItemsFunc filter_items
uiListDrawFilterFunc draw_filter
uiListDrawItemFunc draw_item
bool WM_uilisttype_add(uiListType *ult)
uiListType * WM_uilisttype_find(const StringRef idname, bool quiet)
void WM_uilisttype_to_full_list_id(const uiListType *ult, const char *list_id, char r_full_list_id[])