diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2021-04-11 22:27:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-11 22:27:29 +0200 |
commit | 712bb8cbb6ee35b111c6171598a807dd2dd3046c (patch) | |
tree | 0fcdee30a29fc142ec772aa85d4de0462acd07b0 /editor | |
parent | 43f89e7c2ca080168ebf8adc1c23489491320429 (diff) | |
parent | 77597ea47cb6c5e7e0b9506cc8e8c305f0f59d9c (diff) |
Merge pull request #47175 from YeldhamDev/help_search_early_match
Select non-perfect matches if necessary in the Search Help dialog
Diffstat (limited to 'editor')
-rw-r--r-- | editor/editor_help_search.cpp | 27 | ||||
-rw-r--r-- | editor/editor_help_search.h | 1 |
2 files changed, 17 insertions, 11 deletions
diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index a1ff87fe2e..23226ffa9b 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -123,7 +123,7 @@ void EditorHelpSearch::_notification(int p_what) { if (search->work()) { // Search done. - // Only point to the perfect match if it's a new search, and not just reopening a old one. + // Only point to the match if it's a new search, and not just reopening a old one. if (!old_search) { results_tree->ensure_cursor_is_visible(); } else { @@ -310,6 +310,7 @@ bool EditorHelpSearch::Runner::_phase_match_classes_init() { iterator_doc = EditorHelp::get_doc_data()->class_list.front(); matches.clear(); matched_item = nullptr; + match_highest_score = 0; return true; } @@ -460,16 +461,20 @@ bool EditorHelpSearch::Runner::_match_string(const String &p_term, const String } void EditorHelpSearch::Runner::_match_item(TreeItem *p_item, const String &p_text) { - if (!matched_item) { - if (search_flags & SEARCH_CASE_SENSITIVE) { - if (p_text.casecmp_to(term) == 0) { - matched_item = p_item; - } - } else { - if (p_text.nocasecmp_to(term) == 0) { - matched_item = p_item; - } - } + float inverse_length = 1.f / float(p_text.length()); + + // Favor types where search term is a substring close to the start of the type. + float w = 0.5f; + int pos = p_text.findn(term); + float score = (pos > -1) ? 1.0f - w * MIN(1, 3 * pos * inverse_length) : MAX(0.f, .9f - w); + + // Favor shorter items: they resemble the search term more. + w = 0.1f; + score *= (1 - w) + w * (term.length() * inverse_length); + + if (match_highest_score == 0 || score > match_highest_score) { + matched_item = p_item; + match_highest_score = score; } } diff --git a/editor/editor_help_search.h b/editor/editor_help_search.h index 0e236d523d..350a02315f 100644 --- a/editor/editor_help_search.h +++ b/editor/editor_help_search.h @@ -124,6 +124,7 @@ class EditorHelpSearch::Runner : public Reference { TreeItem *root_item = nullptr; Map<String, TreeItem *> class_items; TreeItem *matched_item = nullptr; + float match_highest_score = 0; bool _is_class_disabled_by_feature_profile(const StringName &p_class); |