Refactor: Various C++ improvements to collection property search

- Use FunctionRef to avoid passing a separate user_data pointer
- Use std::string in arguments struct
- Add search items in one loop after gathering search items
- Use Vector of unique_ptr for search items instead of linked list
This commit is contained in:
Hans Goudey 2024-02-14 17:08:58 -05:00
parent 61e61ce0e1
commit b9ed6ce0a5
12 changed files with 186 additions and 219 deletions

View File

@ -744,10 +744,10 @@ KeyingSet *ANIM_get_keyingset_for_autokeying(const Scene *scene, const char *tra
return ANIM_builtin_keyingset_get_named(transformKSName);
}
static void anim_keyingset_visit_for_search_impl(const bContext *C,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data,
const bool use_poll)
static void anim_keyingset_visit_for_search_impl(
const bContext *C,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn,
const bool use_poll)
{
/* Poll requires context. */
if (use_poll && (C == nullptr)) {
@ -758,10 +758,10 @@ static void anim_keyingset_visit_for_search_impl(const bContext *C,
/* Active Keying Set. */
if (!use_poll || (scene && scene->active_keyingset)) {
StringPropertySearchVisitParams visit_params = {nullptr};
StringPropertySearchVisitParams visit_params{};
visit_params.text = "__ACTIVE__";
visit_params.info = "Active Keying Set";
visit_fn(visit_user_data, &visit_params);
visit_fn(visit_params);
}
/* User-defined Keying Sets. */
@ -770,10 +770,10 @@ static void anim_keyingset_visit_for_search_impl(const bContext *C,
if (use_poll && !ANIM_keyingset_context_ok_poll((bContext *)C, keyingset)) {
continue;
}
StringPropertySearchVisitParams visit_params = {nullptr};
StringPropertySearchVisitParams visit_params{};
visit_params.text = keyingset->idname;
visit_params.info = keyingset->name;
visit_fn(visit_user_data, &visit_params);
visit_fn(visit_params);
}
}
@ -782,31 +782,31 @@ static void anim_keyingset_visit_for_search_impl(const bContext *C,
if (use_poll && !ANIM_keyingset_context_ok_poll((bContext *)C, keyingset)) {
continue;
}
StringPropertySearchVisitParams visit_params = {nullptr};
StringPropertySearchVisitParams visit_params{};
visit_params.text = keyingset->idname;
visit_params.info = keyingset->name;
visit_fn(visit_user_data, &visit_params);
visit_fn(visit_params);
}
}
void ANIM_keyingset_visit_for_search(const bContext *C,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data)
void ANIM_keyingset_visit_for_search(
const bContext *C,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn)
{
anim_keyingset_visit_for_search_impl(C, visit_fn, visit_user_data, false);
anim_keyingset_visit_for_search_impl(C, visit_fn, false);
}
void ANIM_keyingset_visit_for_search_no_poll(const bContext *C,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data)
void ANIM_keyingset_visit_for_search_no_poll(
const bContext *C,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn)
{
anim_keyingset_visit_for_search_impl(C, visit_fn, visit_user_data, true);
anim_keyingset_visit_for_search_impl(C, visit_fn, true);
}
/* Menu of All Keying Sets ----------------------------- */

View File

@ -225,19 +225,19 @@ int ANIM_scene_get_keyingset_index(Scene *scene, KeyingSet *ks);
*/
KeyingSet *ANIM_get_keyingset_for_autokeying(const Scene *scene, const char *transformKSName);
void ANIM_keyingset_visit_for_search(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data);
void ANIM_keyingset_visit_for_search(
const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn);
void ANIM_keyingset_visit_for_search_no_poll(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data);
void ANIM_keyingset_visit_for_search_no_poll(
const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn);
/**
* Dynamically populate an enum of Keying Sets.
*/

View File

@ -10,6 +10,7 @@
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fmt/format.h>
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
@ -365,51 +366,46 @@ void UI_but_func_identity_compare_set(uiBut *but, uiButIdentityCompareFunc cmp_f
/* *** RNA collection search menu *** */
struct CollItemSearch {
CollItemSearch *next, *prev;
void *data;
char *name;
std::string name;
int index;
int iconid;
bool is_id;
int name_prefix_offset;
uint has_sep_char : 1;
bool is_id;
bool has_sep_char;
};
static bool add_collection_search_item(CollItemSearch *cis,
static bool add_collection_search_item(CollItemSearch &cis,
const bool requires_exact_data_name,
const bool has_id_icon,
uiSearchItems *items)
{
char name_buf[UI_MAX_DRAW_STR];
/* If no item has an own icon to display, libraries can use the library icons rather than the
* name prefix for showing the library status. */
int name_prefix_offset = cis->name_prefix_offset;
if (!has_id_icon && cis->is_id && !requires_exact_data_name) {
cis->iconid = UI_icon_from_library(static_cast<const ID *>(cis->data));
/* No need to re-allocate, string should be shorter than before (lib status prefix is
* removed). */
int name_prefix_offset = cis.name_prefix_offset;
if (!has_id_icon && cis.is_id && !requires_exact_data_name) {
cis.iconid = UI_icon_from_library(static_cast<const ID *>(cis.data));
char name_buf[UI_MAX_DRAW_STR];
BKE_id_full_name_ui_prefix_get(
name_buf, static_cast<const ID *>(cis->data), false, UI_SEP_CHAR, &name_prefix_offset);
const int name_buf_len = strlen(name_buf);
BLI_assert(name_buf_len <= strlen(cis->name));
memcpy(cis->name, name_buf, name_buf_len + 1);
name_buf, static_cast<const ID *>(cis.data), false, UI_SEP_CHAR, &name_prefix_offset);
cis.name = name_buf;
}
return UI_search_item_add(items,
cis->name,
cis->data,
cis->iconid,
cis->has_sep_char ? int(UI_BUT_HAS_SEP_CHAR) : 0,
cis.name.c_str(),
cis.data,
cis.iconid,
cis.has_sep_char ? int(UI_BUT_HAS_SEP_CHAR) : 0,
name_prefix_offset);
}
void ui_rna_collection_search_update_fn(
const bContext *C, void *arg, const char *str, uiSearchItems *items, const bool is_first)
{
using namespace blender;
uiRNACollectionSearch *data = static_cast<uiRNACollectionSearch *>(arg);
const int flag = RNA_property_flag(data->target_prop);
ListBase *items_list = MEM_cnew<ListBase>("items_list");
const bool is_ptr_target = (RNA_property_type(data->target_prop) == PROP_POINTER);
/* For non-pointer properties, UI code acts entirely based on the item's name. So the name has to
* match the RNA name exactly. So only for pointer properties, the name can be modified to add
@ -417,16 +413,14 @@ void ui_rna_collection_search_update_fn(
const bool requires_exact_data_name = !is_ptr_target;
const bool skip_filter = is_first;
char name_buf[UI_MAX_DRAW_STR];
char *name;
bool has_id_icon = false;
blender::ui::string_search::StringSearch<CollItemSearch> search;
/* The string search API requires pointer stability. */
Vector<std::unique_ptr<CollItemSearch>> items_list;
if (data->search_prop != nullptr) {
/* build a temporary list of relevant items first */
int item_index = 0;
RNA_PROP_BEGIN (&data->search_ptr, itemptr, data->search_prop) {
if (flag & PROP_ID_SELF_CHECK) {
if (itemptr.data == data->target_ptr.owner_id) {
continue;
@ -445,6 +439,7 @@ void ui_rna_collection_search_update_fn(
bool has_sep_char = false;
const bool is_id = itemptr.type && RNA_struct_is_ID(itemptr.type);
char *name;
if (is_id) {
iconid = ui_id_icon_get(C, static_cast<ID *>(itemptr.data), false);
if (!ELEM(iconid, 0, ICON_BLANK1)) {
@ -468,24 +463,19 @@ void ui_rna_collection_search_update_fn(
}
if (name) {
CollItemSearch *cis = MEM_cnew<CollItemSearch>(__func__);
auto cis = std::make_unique<CollItemSearch>();
cis->data = itemptr.data;
cis->name = BLI_strdup(name);
cis->index = item_index;
cis->name = name;
cis->index = items_list.size();
cis->iconid = iconid;
cis->is_id = is_id;
cis->name_prefix_offset = name_prefix_offset;
cis->has_sep_char = has_sep_char;
if (!skip_filter) {
search.add(name, cis);
}
BLI_addtail(items_list, cis);
items_list.append(std::move(cis));
if (name != name_buf) {
MEM_freeN(name);
}
}
item_index++;
}
RNA_PROP_END;
}
@ -495,85 +485,66 @@ void ui_rna_collection_search_update_fn(
data->target_prop);
BLI_assert(search_flag & PROP_STRING_SEARCH_SUPPORTED);
struct SearchVisitUserData {
blender::string_search::StringSearch<CollItemSearch> *search;
bool skip_filter;
int item_index;
ListBase *items_list;
const char *func_id;
} user_data = {nullptr};
const bool show_extra_info = (G.debug_value == 102);
user_data.search = &search;
user_data.skip_filter = skip_filter;
user_data.items_list = items_list;
user_data.func_id = __func__;
RNA_property_string_search(C,
&data->target_ptr,
data->target_prop,
str,
[&](StringPropertySearchVisitParams visit_params) {
auto cis = std::make_unique<CollItemSearch>();
RNA_property_string_search(
C,
&data->target_ptr,
data->target_prop,
str,
[](void *user_data, const StringPropertySearchVisitParams *visit_params) {
const bool show_extra_info = (G.debug_value == 102);
cis->data = nullptr;
if (visit_params.info && show_extra_info) {
cis->name = fmt::format("{}" UI_SEP_CHAR_S "{}",
visit_params.text,
*visit_params.info);
}
else {
cis->name = std::move(visit_params.text);
}
SearchVisitUserData *search_data = (SearchVisitUserData *)user_data;
CollItemSearch *cis = MEM_cnew<CollItemSearch>(search_data->func_id);
cis->data = nullptr;
if (visit_params->info && show_extra_info) {
cis->name = BLI_sprintfN(
"%s" UI_SEP_CHAR_S "%s", visit_params->text, visit_params->info);
}
else {
cis->name = BLI_strdup(visit_params->text);
}
cis->index = search_data->item_index;
cis->iconid = ICON_NONE;
cis->is_id = false;
cis->name_prefix_offset = 0;
cis->has_sep_char = visit_params->info != nullptr;
if (!search_data->skip_filter) {
search_data->search->add(visit_params->text, cis);
}
BLI_addtail(search_data->items_list, cis);
search_data->item_index++;
},
(void *)&user_data);
cis->index = items_list.size();
cis->iconid = ICON_NONE;
cis->is_id = false;
cis->name_prefix_offset = 0;
cis->has_sep_char = visit_params.info.has_value();
items_list.append(std::move(cis));
});
if (search_flag & PROP_STRING_SEARCH_SORT) {
BLI_listbase_sort(items_list, [](const void *a_, const void *b_) -> int {
const CollItemSearch *cis_a = (const CollItemSearch *)a_;
const CollItemSearch *cis_b = (const CollItemSearch *)b_;
return BLI_strcasecmp_natural(cis_a->name, cis_b->name);
});
int i = 0;
LISTBASE_FOREACH (CollItemSearch *, cis, items_list) {
cis->index = i;
i++;
std::sort(
items_list.begin(),
items_list.end(),
[](const std::unique_ptr<CollItemSearch> &a, const std::unique_ptr<CollItemSearch> &b) {
return BLI_strcasecmp_natural(a->name.c_str(), b->name.c_str()) <= 0;
});
for (const int i : items_list.index_range()) {
items_list[i]->index = i;
}
}
}
if (skip_filter) {
LISTBASE_FOREACH (CollItemSearch *, cis, items_list) {
if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) {
for (std::unique_ptr<CollItemSearch> &cis : items_list) {
if (!add_collection_search_item(*cis, requires_exact_data_name, has_id_icon, items)) {
break;
}
}
}
else {
const blender::Vector<CollItemSearch *> filtered_items = search.query(str);
ui::string_search::StringSearch<CollItemSearch> search;
for (std::unique_ptr<CollItemSearch> &cis : items_list) {
search.add(cis->name, cis.get());
}
const Vector<CollItemSearch *> filtered_items = search.query(str);
for (CollItemSearch *cis : filtered_items) {
if (!add_collection_search_item(cis, requires_exact_data_name, has_id_icon, items)) {
if (!add_collection_search_item(*cis, requires_exact_data_name, has_id_icon, items)) {
break;
}
}
}
LISTBASE_FOREACH (CollItemSearch *, cis, items_list) {
MEM_freeN(cis->name);
}
BLI_freelistN(items_list);
MEM_freeN(items_list);
}
int UI_icon_from_id(const ID *id)

View File

@ -17,6 +17,7 @@
#include "RNA_types.hh"
#include "BLI_compiler_attrs.h"
#include "BLI_function_ref.hh"
struct ID;
struct IDOverrideLibrary;
@ -378,16 +379,15 @@ void RNA_property_string_set_bytes(PointerRNA *ptr, PropertyRNA *prop, const cha
eStringPropertySearchFlag RNA_property_string_search_flag(PropertyRNA *prop);
/**
* Search candidates for string `prop` by calling `visit_fn` with each string.
* Typically these strings are collected in `visit_user_data` in a format defined by the caller.
*
* See #PropStringSearchFunc for details.
*/
void RNA_property_string_search(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data);
void RNA_property_string_search(
const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn);
/**
* \return the length without `\0` terminator.

View File

@ -10,6 +10,10 @@
#ifndef __RNA_TYPES_H__
#define __RNA_TYPES_H__
#include <optional>
#include <string>
#include "../blenlib/BLI_function_ref.hh"
#include "../blenlib/BLI_sys_types.h"
#include "../blenlib/BLI_utildefines.h"
@ -538,10 +542,10 @@ using StringPropertyLengthFunc = int (*)(PointerRNA *ptr, PropertyRNA *prop);
using StringPropertySetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, const char *value);
struct StringPropertySearchVisitParams {
/** Text being searched for (never NULL). */
const char *text;
/** Additional information to display (optional, may be NULL). */
const char *info;
/** Text being searched for. */
std::string text;
/** Additional information to display. */
std::optional<std::string> info;
};
enum eStringPropertySearchFlag {
@ -562,12 +566,6 @@ enum eStringPropertySearchFlag {
};
ENUM_OPERATORS(eStringPropertySearchFlag, PROP_STRING_SEARCH_SUGGESTION)
/**
* Visit string search candidates, `text` may be freed once this callback has finished,
* so references to it should not be held.
*/
using StringPropertySearchVisitFunc = void (*)(void *visit_user_data,
const StringPropertySearchVisitParams *params);
/**
* \param C: context, may be NULL (in this case all available items should be shown).
* \param ptr: RNA pointer.
@ -577,14 +575,13 @@ using StringPropertySearchVisitFunc = void (*)(void *visit_user_data,
* for the search results (auto-complete Python attributes for e.g.).
* \param visit_fn: This function is called with every search candidate and is typically
* responsible for storing the search results.
* \param visit_user_data: Caller defined data, passed to `visit_fn`.
*/
using StringPropertySearchFunc = void (*)(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data);
using StringPropertySearchFunc =
void (*)(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn);
using EnumPropertyGetFunc = int (*)(PointerRNA *ptr, PropertyRNA *prop);
using EnumPropertySetFunc = void (*)(PointerRNA *ptr, PropertyRNA *prop, int value);

View File

@ -1169,11 +1169,10 @@ static char *rna_def_property_search_func(
"PointerRNA *ptr, "
"PropertyRNA *prop, "
"const char *edit_text, "
"StringPropertySearchVisitFunc visit_fn, "
"void *visit_user_data)\n",
"blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn)\n",
func);
fprintf(f, "{\n");
fprintf(f, "\n %s(C, ptr, prop, edit_text, visit_fn, visit_user_data);\n", manualfunc);
fprintf(f, "\n %s(C, ptr, prop, edit_text, visit_fn);\n", manualfunc);
fprintf(f, "}\n\n");
return func;
}

View File

@ -3702,12 +3702,11 @@ void RNA_property_string_search(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data)
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn)
{
BLI_assert(RNA_property_string_search_flag(prop) & PROP_STRING_SEARCH_SUPPORTED);
StringPropertyRNA *sprop = (StringPropertyRNA *)rna_ensure_property(prop);
sprop->search(C, ptr, prop, edit_text, visit_fn, visit_user_data);
sprop->search(C, ptr, prop, edit_text, visit_fn);
}
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)

View File

@ -1597,10 +1597,10 @@ static void bpy_prop_string_set_fn(PointerRNA *ptr, PropertyRNA *prop, const cha
}
}
static bool bpy_prop_string_visit_fn_call(PyObject *py_func,
PyObject *item,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data)
static bool bpy_prop_string_visit_fn_call(
PyObject *py_func,
PyObject *item,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn)
{
const char *text;
const char *info = nullptr;
@ -1637,19 +1637,19 @@ static bool bpy_prop_string_visit_fn_call(PyObject *py_func,
}
}
StringPropertySearchVisitParams visit_params = {nullptr};
StringPropertySearchVisitParams visit_params{};
visit_params.text = text;
visit_params.info = info;
visit_fn(visit_user_data, &visit_params);
visit_params.info = info ? info : "";
visit_fn(visit_params);
return true;
}
static void bpy_prop_string_visit_for_search_fn(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data)
static void bpy_prop_string_visit_for_search_fn(
const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn)
{
BPyPropStore *prop_store = static_cast<BPyPropStore *>(RNA_property_py_data_get(prop));
PyObject *py_func;
@ -1703,8 +1703,7 @@ static void bpy_prop_string_visit_for_search_fn(const bContext *C,
if (py_text == nullptr) {
break;
}
const bool ok = bpy_prop_string_visit_fn_call(
py_func, py_text, visit_fn, visit_user_data);
const bool ok = bpy_prop_string_visit_fn_call(py_func, py_text, visit_fn);
Py_DECREF(py_text);
if (!ok) {
break;
@ -1734,8 +1733,7 @@ static void bpy_prop_string_visit_for_search_fn(const bContext *C,
const Py_ssize_t ret_num = PySequence_Fast_GET_SIZE(ret_fast);
PyObject **ret_fast_items = PySequence_Fast_ITEMS(ret_fast);
for (Py_ssize_t i = 0; i < ret_num; i++) {
const bool ok = bpy_prop_string_visit_fn_call(
py_func, ret_fast_items[i], visit_fn, visit_user_data);
const bool ok = bpy_prop_string_visit_fn_call(py_func, ret_fast_items[i], visit_fn);
if (!ok) {
break;
}

View File

@ -17,9 +17,12 @@
#include <optional>
#include <string>
#include "BLI_compiler_attrs.h"
#include "BLI_sys_types.h"
#include "DNA_windowmanager_types.h"
#include "BLI_compiler_attrs.h"
#include "BLI_function_ref.hh"
#include "BLI_sys_types.h"
#include "WM_keymap.hh"
#include "WM_types.hh"
@ -1122,12 +1125,12 @@ bool WM_operatortype_remove(const char *idname);
*/
void WM_operatortype_last_properties_clear_all();
void WM_operatortype_idname_visit_for_search(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data);
void WM_operatortype_idname_visit_for_search(
const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn);
/**
* Tag all operator-properties of \a ot defined after calling this, until
@ -1229,12 +1232,12 @@ void WM_menutype_freelink(MenuType *mt);
void WM_menutype_free();
bool WM_menutype_poll(bContext *C, MenuType *mt);
void WM_menutype_idname_visit_for_search(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data);
void WM_menutype_idname_visit_for_search(
const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn);
/* `wm_panel_type.cc` */
@ -1247,12 +1250,12 @@ PanelType *WM_paneltype_find(const char *idname, bool quiet);
bool WM_paneltype_add(PanelType *pt);
void WM_paneltype_remove(PanelType *pt);
void WM_paneltype_idname_visit_for_search(const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data);
void WM_paneltype_idname_visit_for_search(
const bContext *C,
PointerRNA *ptr,
PropertyRNA *prop,
const char *edit_text,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn);
/* `wm_gesture_ops.cc` */

View File

@ -101,20 +101,20 @@ bool WM_menutype_poll(bContext *C, MenuType *mt)
return true;
}
void WM_menutype_idname_visit_for_search(const bContext * /*C*/,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data)
void WM_menutype_idname_visit_for_search(
const bContext * /*C*/,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn)
{
GHashIterator gh_iter;
GHASH_ITER (gh_iter, menutypes_hash) {
MenuType *mt = static_cast<MenuType *>(BLI_ghashIterator_getValue(&gh_iter));
StringPropertySearchVisitParams visit_params = {nullptr};
StringPropertySearchVisitParams visit_params{};
visit_params.text = mt->idname;
visit_params.info = mt->label;
visit_fn(visit_user_data, &visit_params);
visit_fn(visit_params);
}
}

View File

@ -249,12 +249,12 @@ void WM_operatortype_last_properties_clear_all()
}
}
void WM_operatortype_idname_visit_for_search(const bContext * /*C*/,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data)
void WM_operatortype_idname_visit_for_search(
const bContext * /*C*/,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn)
{
GHashIterator gh_iter;
GHASH_ITER (gh_iter, global_ops_hash) {
@ -263,10 +263,10 @@ void WM_operatortype_idname_visit_for_search(const bContext * /*C*/,
char idname_py[OP_MAX_TYPENAME];
WM_operator_py_idname(idname_py, ot->idname);
StringPropertySearchVisitParams visit_params = {nullptr};
StringPropertySearchVisitParams visit_params{};
visit_params.text = idname_py;
visit_params.info = ot->name;
visit_fn(visit_user_data, &visit_params);
visit_fn(visit_params);
}
}

View File

@ -68,20 +68,20 @@ void WM_paneltype_clear()
BLI_ghash_free(g_paneltypes_hash, nullptr, nullptr);
}
void WM_paneltype_idname_visit_for_search(const bContext * /*C*/,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
StringPropertySearchVisitFunc visit_fn,
void *visit_user_data)
void WM_paneltype_idname_visit_for_search(
const bContext * /*C*/,
PointerRNA * /*ptr*/,
PropertyRNA * /*prop*/,
const char * /*edit_text*/,
blender::FunctionRef<void(StringPropertySearchVisitParams)> visit_fn)
{
GHashIterator gh_iter;
GHASH_ITER (gh_iter, g_paneltypes_hash) {
PanelType *pt = static_cast<PanelType *>(BLI_ghashIterator_getValue(&gh_iter));
StringPropertySearchVisitParams visit_params = {nullptr};
StringPropertySearchVisitParams visit_params{};
visit_params.text = pt->idname;
visit_params.info = pt->label;
visit_fn(visit_user_data, &visit_params);
visit_fn(visit_params);
}
}