diff options
author | Philipp Oeser <info@graphics-engineer.com> | 2020-07-07 11:08:42 +0300 |
---|---|---|
committer | Philipp Oeser <info@graphics-engineer.com> | 2020-09-04 11:11:45 +0300 |
commit | 2a24b3aaf4c846a5d98f783fef69946584865df9 (patch) | |
tree | 34b33b8512d0bc821f5ada704c37a868046869f1 /source/blender/editors/interface/interface_utils.c | |
parent | 92b8d7019b4b484dc3120b26a27a59a3c7dc5489 (diff) |
Fix T78084: Search does not accept text fragments everywhere
This was reported for the "Add Node" search functionality, but is
relevant in other searches as well.
So e.g. when searching for "Separate XYZ", typing "sep", then " " (with
the intention to type "X" next) would clear the search field. Now use
the same method (matching against all search words) as in F3 searching
('menu_search_update_fn') in other searches as well [searching IDs,
property objects, finding nodes,...]
This should give a much nicer search experience in general.
Note: this does not touch other searches in the Dopesheet, Outliner,
Filebrowser or User Preferences that have other search implementations.
Maniphest Tasks: T78084
Differential Revision: https://developer.blender.org/D8232
Diffstat (limited to 'source/blender/editors/interface/interface_utils.c')
-rw-r--r-- | source/blender/editors/interface/interface_utils.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index c413cac6023..690051ad735 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -30,6 +30,7 @@ #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BLI_alloca.h" #include "BLI_listbase.h" #include "BLI_math.h" #include "BLI_string.h" @@ -53,18 +54,6 @@ #include "interface_intern.h" -bool ui_str_has_word_prefix(const char *haystack, const char *needle, size_t needle_len) -{ - const char *match = BLI_strncasestr(haystack, needle, needle_len); - if (match) { - if ((match == haystack) || (*(match - 1) == ' ') || ispunct(*(match - 1))) { - return true; - } - return ui_str_has_word_prefix(match + 1, needle, needle_len); - } - return false; -} - /*************************** RNA Utilities ******************************/ uiBut *uiDefAutoButR(uiBlock *block, @@ -417,6 +406,12 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, char *name; bool has_id_icon = false; + /* Prepare matching all words. */ + const size_t str_len = strlen(str); + const int words_max = BLI_string_max_possible_word_count(str_len); + int(*words)[2] = BLI_array_alloca(words, words_max); + const int words_len = BLI_string_find_split_words(str, str_len, ' ', words, words_max); + /* build a temporary list of relevant items first */ RNA_PROP_BEGIN (&data->search_ptr, itemptr, data->search_prop) { @@ -462,7 +457,8 @@ void ui_rna_collection_search_update_fn(const struct bContext *C, } if (name) { - if (skip_filter || BLI_strcasestr(name + name_prefix_offset, str)) { + if (skip_filter || + BLI_string_all_words_matched(name + name_prefix_offset, str, words, words_len)) { cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch"); cis->data = itemptr.data; cis->name = BLI_strdup(name); |