Browse Source

Fix selecting recent node in CreateDialog

If the node name matches exactly as the search, the node should be selected.
This also fixes when the user clicks on recent nodes.

Fixes #24044
Bhupendra Aole 6 years ago
parent
commit
a8a293832e
1 changed files with 31 additions and 24 deletions
  1. 31 24
      editor/create_dialog.cpp

+ 31 - 24
editor/create_dialog.cpp

@@ -191,34 +191,41 @@ void CreateDialog::add_type(const String &p_type, HashMap<String, TreeItem *> &p
 		item->set_custom_color(0, get_color("disabled_font_color", "Editor"));
 		item->set_custom_color(0, get_color("disabled_font_color", "Editor"));
 		item->set_selectable(0, false);
 		item->set_selectable(0, false);
 	} else if (!(*to_select && (*to_select)->get_text(0) == search_box->get_text())) {
 	} else if (!(*to_select && (*to_select)->get_text(0) == search_box->get_text())) {
-		bool current_type_prefered = _is_type_prefered(p_type);
-		bool selected_type_prefered = *to_select ? _is_type_prefered((*to_select)->get_text(0).split(" ")[0]) : false;
-
 		String search_term = search_box->get_text().to_lower();
 		String search_term = search_box->get_text().to_lower();
-		bool is_subsequence_of_type = search_box->get_text().is_subsequence_ofi(p_type);
-		bool is_substring_of_type = p_type.to_lower().find(search_term) >= 0;
-		bool is_substring_of_selected = false;
-		bool is_subsequence_of_selected = false;
-		bool is_selected_equal = false;
-
-		if (*to_select) {
-			String name = (*to_select)->get_text(0).split(" ")[0].to_lower();
-			is_substring_of_selected = name.find(search_term) >= 0;
-			is_subsequence_of_selected = search_term.is_subsequence_of(name);
-			is_selected_equal = name == search_term;
-		}
 
 
-		if (is_subsequence_of_type && !is_selected_equal) {
-			if (is_substring_of_type) {
-				if (!is_substring_of_selected || (current_type_prefered && !selected_type_prefered)) {
-					*to_select = item;
-				}
-			} else {
-				// substring results weigh more than subsequences, so let's make sure we don't override them
-				if (!is_substring_of_selected) {
-					if (!is_subsequence_of_selected || (current_type_prefered && !selected_type_prefered)) {
+		// if the node name matches exactly as the search, the node should be selected.
+		// this also fixes when the user clicks on recent nodes.
+		if (p_type.to_lower() == search_term) {
+			*to_select = item;
+		} else {
+			bool current_type_prefered = _is_type_prefered(p_type);
+			bool selected_type_prefered = *to_select ? _is_type_prefered((*to_select)->get_text(0).split(" ")[0]) : false;
+
+			bool is_subsequence_of_type = search_box->get_text().is_subsequence_ofi(p_type);
+			bool is_substring_of_type = p_type.to_lower().find(search_term) >= 0;
+			bool is_substring_of_selected = false;
+			bool is_subsequence_of_selected = false;
+			bool is_selected_equal = false;
+
+			if (*to_select) {
+				String name = (*to_select)->get_text(0).split(" ")[0].to_lower();
+				is_substring_of_selected = name.find(search_term) >= 0;
+				is_subsequence_of_selected = search_term.is_subsequence_of(name);
+				is_selected_equal = name == search_term;
+			}
+
+			if (is_subsequence_of_type && !is_selected_equal) {
+				if (is_substring_of_type) {
+					if (!is_substring_of_selected || (current_type_prefered && !selected_type_prefered)) {
 						*to_select = item;
 						*to_select = item;
 					}
 					}
+				} else {
+					// substring results weigh more than subsequences, so let's make sure we don't override them
+					if (!is_substring_of_selected) {
+						if (!is_subsequence_of_selected || (current_type_prefered && !selected_type_prefered)) {
+							*to_select = item;
+						}
+					}
 				}
 				}
 			}
 			}
 		}
 		}