Przeglądaj źródła

Search ranking: favor filenames over extensions.

Stijn Hinlopen 5 lat temu
rodzic
commit
7f6e8d25d4
2 zmienionych plików z 34 dodań i 34 usunięć
  1. 32 33
      editor/quick_open.cpp
  2. 2 1
      editor/quick_open.h

+ 32 - 33
editor/quick_open.cpp

@@ -62,7 +62,6 @@ Vector<String> EditorQuickOpen::get_selected_files() const {
 	TreeItem *item = search_options->get_next_selected(search_options->get_root());
 	while (item) {
 		files.push_back("res://" + item->get_text(0));
-
 		item = search_options->get_next_selected(item);
 	}
 
@@ -90,7 +89,6 @@ void EditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) {
 				}
 
 				TreeItem *current = search_options->get_selected();
-
 				TreeItem *item = search_options->get_next_selected(root);
 				while (item) {
 					item->deselect(0);
@@ -98,25 +96,29 @@ void EditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) {
 				}
 
 				current->select(0);
+				current->set_as_cursor(0);
 			} break;
 		}
 	}
 }
 
-float EditorQuickOpen::_path_cmp(String search, String path) const {
-	// Exact match.
-	if (search == path) {
-		return 1.2f;
+float EditorQuickOpen::_score_path(String search, String path) const {
+	// Positive bias for matches close to the _beginning of the file name_.
+	String file = path.get_file();
+	int pos = file.findn(search);
+	if (pos != -1) {
+		return 1.0f - 0.1f * (float(pos) / file.length());
 	}
 
-	// Substring match, with positive bias for matches close to the end of the path.
-	int pos = path.rfindn(search);
+	// Positive bias for matches close to the _end of the path_.
+	String base = path.get_base_dir();
+	pos = base.rfindn(search);
 	if (pos != -1) {
-		return 1.1f + 0.09 / (path.length() - pos + 1);
+		return 0.9f - 0.1f * (float(base.length() - pos) / base.length());
 	}
 
-	// Similarity.
-	return path.to_lower().similarity(search.to_lower());
+	// Results that contain all characters but not the string.
+	return path.similarity(search) * 0.8f;
 }
 
 void EditorQuickOpen::_parse_fs(EditorFileSystemDirectory *efsd, Vector<Pair<String, Ref<Texture2D>>> &list) {
@@ -124,25 +126,25 @@ void EditorQuickOpen::_parse_fs(EditorFileSystemDirectory *efsd, Vector<Pair<Str
 		_parse_fs(efsd->get_subdir(i), list);
 	}
 
-	String search_text = search_box->get_text();
-
 	for (int i = 0; i < efsd->get_file_count(); i++) {
-		String file = efsd->get_file_path(i);
-		file = file.substr(6, file.length());
-
 		StringName file_type = efsd->get_file_type(i);
-		if (ClassDB::is_parent_class(file_type, base_type) && search_text.is_subsequence_ofi(file)) {
-			Pair<String, Ref<Texture2D>> pair;
-			pair.first = file;
-			StringName icon_name = search_options->has_theme_icon(file_type, ei) ? file_type : ot;
-			pair.second = search_options->get_theme_icon(icon_name, ei);
-			list.push_back(pair);
+
+		if (ClassDB::is_parent_class(file_type, base_type)) {
+			String file = efsd->get_file_path(i);
+			file = file.substr(6, file.length());
+
+			if (search_box->get_text().is_subsequence_ofi(file)) {
+				Pair<String, Ref<Texture2D>> pair;
+				pair.first = file;
+				pair.second = search_options->get_theme_icon(search_options->has_theme_icon(file_type, ei) ? file_type : ot, ei);
+				list.push_back(pair);
+			}
 		}
 	}
 }
 
 Vector<Pair<String, Ref<Texture2D>>> EditorQuickOpen::_sort_fs(Vector<Pair<String, Ref<Texture2D>>> &list) {
-	String search_text = search_box->get_text();
+	String search_text = search_box->get_text().to_lower();
 	Vector<Pair<String, Ref<Texture2D>>> sorted_list;
 
 	if (search_text == String() || list.size() == 0) {
@@ -152,7 +154,7 @@ Vector<Pair<String, Ref<Texture2D>>> EditorQuickOpen::_sort_fs(Vector<Pair<Strin
 	Vector<float> scores;
 	scores.resize(list.size());
 	for (int i = 0; i < list.size(); i++) {
-		scores.write[i] = _path_cmp(search_text, list[i].first);
+		scores.write[i] = _score_path(search_text, list[i].first.to_lower());
 	}
 
 	while (list.size() > 0) {
@@ -190,19 +192,17 @@ void EditorQuickOpen::_update_search() {
 		ti->set_icon(0, list[i].second);
 	}
 
-	if (root->get_children()) {
-		TreeItem *ti = root->get_children();
-
-		ti->select(0);
-		ti->set_as_cursor(0);
+	TreeItem *result = root->get_children();
+	if (result) {
+		result->select(0);
+		result->set_as_cursor(0);
 	}
 
-	get_ok()->set_disabled(root->get_children() == nullptr);
+	get_ok()->set_disabled(!result);
 }
 
 void EditorQuickOpen::_confirmed() {
-	TreeItem *ti = search_options->get_selected();
-	if (!ti) {
+	if (!search_options->get_selected()) {
 		return;
 	}
 	emit_signal("quick_open");
@@ -252,7 +252,6 @@ EditorQuickOpen::EditorQuickOpen() {
 	vbc->add_margin_child(TTR("Matches:"), search_options, true);
 
 	get_ok()->set_text(TTR("Open"));
-	get_ok()->set_disabled(true);
 	register_text_enter(search_box);
 	set_hide_on_ok(false);
 

+ 2 - 1
editor/quick_open.h

@@ -41,6 +41,7 @@ class EditorQuickOpen : public ConfirmationDialog {
 
 	LineEdit *search_box;
 	Tree *search_options;
+
 	StringName base_type;
 	StringName ei;
 	StringName ot;
@@ -50,7 +51,7 @@ class EditorQuickOpen : public ConfirmationDialog {
 	void _sbox_input(const Ref<InputEvent> &p_ie);
 	void _parse_fs(EditorFileSystemDirectory *efsd, Vector<Pair<String, Ref<Texture2D>>> &list);
 	Vector<Pair<String, Ref<Texture2D>>> _sort_fs(Vector<Pair<String, Ref<Texture2D>>> &list);
-	float _path_cmp(String search, String path) const;
+	float _score_path(String search, String path) const;
 
 	void _confirmed();
 	void _text_changed(const String &p_newtext);