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:
parent
61e61ce0e1
commit
b9ed6ce0a5
|
@ -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 ----------------------------- */
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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` */
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue