31#include "RNA_prototypes.hh"
107 layout->
label(
"", icon);
116 layout->
label(
"", icon);
130 subrow->
prop(&listptr,
134 ICON_ARROW_LEFTRIGHT);
137 subrow = &row->
row(
true);
140 subrow->
prop(&listptr,
141 "use_filter_sort_reverse",
154 const size_t slen = strlen(filter_raw);
157 if (slen + 3 <=
sizeof(storage_.filter_buff)) {
158 filter_ = storage_.filter_buff;
185 const int fn_flag = FNM_CASEFOLD | FNM_NOESCAPE;
186 if (fnmatch(filter_, name.
c_str(), fn_flag) == 0) {
207 const char *propname,
220 if (
len && (order_by_name || item_filter_fn)) {
222 int order_idx = 0,
i = 0;
228 if (item_filter_fn) {
234 bool do_order =
false;
238 namebuf =
BLI_strdup(get_name_fn(itemptr,
i).c_str());
244 const char *name = namebuf ? namebuf :
"";
246 if (item_filter_fn) {
253 if (!filter_exclude) {
256 do_order = order_by_name;
260 else if (filter_exclude) {
263 do_order = order_by_name;
267 do_order = order_by_name;
271 names[order_idx].
org_idx = order_idx;
272 STRNCPY(names[order_idx++].name, name);
293 for (new_idx = 0; new_idx < order_idx; new_idx++) {
326 const char *propname)
371 const char *item_dyntip_propname,
379 RNA_warning(
"template_list using default '%s' UIList class must provide a custom list_id",
384 if (!active_dataptr->
data) {
389 r_input_data->
dataptr = *dataptr;
392 if (!r_input_data->
prop) {
404 active_propname.
c_str());
408 if (r_input_data->
prop) {
411 RNA_warning(
"Expected a collection data property");
418 RNA_warning(
"Expected an integer active data property");
424 RNA_warning(
"List type %s not found", std::string(listtype_name).c_str());
445 bool activei_mapping_pending =
true;
452 new_order_idx = order_reverse ? dyn_data->
items_shown - new_order_idx - 1 : new_order_idx;
455 new_order_idx = order_reverse ? dyn_data->
items_shown - ++reorder_i : reorder_i++;
458 r_items->
item_vec[new_order_idx].item = itemptr;
459 r_items->
item_vec[new_order_idx].org_idx =
i;
464 if (activei_mapping_pending && activei ==
i) {
465 activei = new_order_idx;
467 activei_mapping_pending =
false;
470 else if (activei <
i) {
474 if (prev_order_idx >= 0) {
475 activei = prev_order_idx;
479 activei = new_order_idx;
484 prev_ii = new_order_idx;
510 int prev_ii = -1, prev_i;
524 if (items_shown >= 0) {
540 const bool use_auto_size = (ui_list->
list_grip <
543 int actual_rows = layout_data->
rows;
544 int actual_maxrows = layout_data->
maxrows;
545 int columns = layout_data->
columns;
548 if (actual_rows <= 0) {
552 if (actual_maxrows < actual_rows) {
553 actual_maxrows =
max_ii(actual_rows, 5);
571 if (!use_auto_size) {
575 else if ((actual_rows != actual_maxrows) && (dyn_data->
height > actual_rows)) {
585 if (activei_row < ui_list->list_scroll) {
588 else if (activei_row >= ui_list->
list_scroll + actual_rows) {
589 ui_list->
list_scroll = activei_row - actual_rows + 1;
594 const int max_scroll =
max_ii(0, dyn_data->
height - actual_rows);
624 if (propname && propname[0] && itemptr && itemptr->
data) {
636 char *dyn_tooltip =
static_cast<char *
>(argN);
637 std::string tooltip_string = dyn_tooltip;
639 tooltip_string +=
'\n';
640 tooltip_string += tip;
642 return tooltip_string;
657 if (region ==
nullptr) {
691 ui_list->
type = ui_list_type;
713 uiLayout *glob =
nullptr, *box, *row, *
col, *subrow, *sub, *overlap;
715 int rnaicon = ICON_NONE, icon = ICON_NONE;
731 glob = &box->
column(
true);
732 row = &glob->
row(
false);
733 col = &row->column(
true);
736 adjusted_layout_data.
columns = 1;
738 uilist_prepare(ui_list, items, &adjusted_layout_data, &visual_info);
749 const int org_i = items->
item_vec[
i].org_idx;
750 const int flt_flag = items->
item_vec[
i].flt_flag;
753 overlap = &
col->overlap();
773 editable ?
TIP_(
"Select List Item "
774 "(Double click to rename)") :
775 TIP_(
"Select List Item"));
787 sub = &item_row->
row(
false);
789 if (icon == ICON_DOT) {
819 col->label(
"", ICON_NONE);
843 row = &layout->
row(
true);
852 if (icon == ICON_DOT) {
868 row->label(
"", ICON_NONE);
894 glob = &box->
column(
true);
895 row = &glob->
row(
false);
896 col = &row->column(
true);
906 const int org_i = items->
item_vec[
i].org_idx;
907 const int flt_flag = items->
item_vec[
i].flt_flag;
911 subrow = &
col->row(
false);
915 overlap = &subrow->overlap();
938 sub = &overlap->row(
false);
964 subrow = &
col->row(
false);
966 subrow->label(
"", ICON_NONE);
992 glob = &box->
column(
true);
994 row = &glob->
row(
false);
1006 adjusted_layout_data.
columns = cols_per_row;
1007 uilist_prepare(ui_list, items, &adjusted_layout_data, &visual_info);
1013 const int org_i = items->
item_vec[
i].org_idx;
1014 const int flt_flag = items->
item_vec[
i].flt_flag;
1017 col = &overlap->column(
false);
1038 col = &overlap->column(
false);
1086 if (glob && add_filters_but) {
1105 row = &glob->
row(
true);
1114 ICON_DISCLOSURE_TRI_DOWN,
1122 TIP_(
"Hide filtering options"));
1165 ICON_DISCLOSURE_TRI_RIGHT,
1173 TIP_(
"Show filtering options"));
1199 const char *listtype_name,
1200 const char *list_id,
1205 const char *item_dyntip_propname,
1221 item_dyntip_propname,
1258 layout_data.
rows = rows;
1259 layout_data.
maxrows = maxrows;
1260 layout_data.
columns = columns;
1269 const char *listtype_name,
1270 const char *list_id,
1274 const char *active_propname,
1275 const char *item_dyntip_propname,
1290 item_dyntip_propname,
1301 bool create_properties)
1309 if (create_properties) {
1321 bool create_properties)
1329 if (create_properties) {
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
#define SNPRINTF(dst, format,...)
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
@ UILST_SCROLL_TO_ACTIVE_ITEM
#define UI_LIST_AUTO_SIZE_THRESHOLD
@ UILST_LAYOUT_BIG_PREVIEW_GRID
@ UILST_FLT_ITEM_NEVER_SHOW
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
void UI_but_flag_disable(uiBut *but, int flag)
uiBut * uiDefIconTextButR_prop(uiBlock *block, int 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)
void UI_block_emboss_set(uiBlock *block, blender::ui::EmbossType emboss)
uiBut * uiDefButR_prop(uiBlock *block, int 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)
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *arg, uiFreeArgFunc free_arg)
uiBut * uiDefBut(uiBlock *block, int 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)
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)
#define UI_UL_DEFAULT_CLASS_NAME
uiBut * uiDefButI(uiBlock *block, int 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)
uiBut * uiDefIconButI(uiBlock *block, int 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 * 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, 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)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
int uiLayoutGetWidth(uiLayout *layout)
void uiLayoutListItemAddPadding(uiLayout *layout)
bContextStore * uiLayoutGetContextStore(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)
uiListType * UI_UL_asset_view()
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)
PointerRNA * UI_list_custom_activate_operator_set(uiList *ui_list, const StringRefNull opname, bool create_properties)
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)
PointerRNA * UI_list_custom_drag_operator_set(uiList *ui_list, const StringRefNull opname, bool create_properties)
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)
struct wmOperatorType * custom_activate_optype
struct PointerRNA * custom_drag_opptr
uiListFreeRuntimeDataFunc free_runtime_data_fn
int * items_filter_neworder
struct wmOperatorType * custom_drag_optype
struct PointerRNA * custom_activate_opptr
uiListFilterItemsFunc filter_items
uiListDrawFilterFunc draw_filter
uiListDrawItemFunc draw_item
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void WM_operator_properties_alloc(PointerRNA **ptr, IDProperty **properties, const char *opstring)
void WM_operator_properties_free(PointerRNA *ptr)
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[])