浏览代码

Automatically start searching in the asset library when entering text

Entering text will now start searching automatically after 0.25 seconds
have passed (debounce delay).

This removes the need for a separate Search button.

(cherry picked from commit 6055db2a72f108fceb6eddd87c54274fffbb8646)
Hugo Locurcio 5 年之前
父节点
当前提交
f7ed1f4d1f
共有 2 个文件被更改,包括 18 次插入7 次删除
  1. 15 6
      editor/plugins/asset_library_editor_plugin.cpp
  2. 3 1
      editor/plugins/asset_library_editor_plugin.h

+ 15 - 6
editor/plugins/asset_library_editor_plugin.cpp

@@ -951,8 +951,11 @@ void EditorAssetLibrary::_search(int p_page) {
 	_api_request("asset", REQUESTING_SEARCH, args);
 }
 
-void EditorAssetLibrary::_search_text_entered(const String &p_text) {
+void EditorAssetLibrary::_search_text_changed(const String &p_text) {
+	filter_debounce_timer->start();
+}
 
+void EditorAssetLibrary::_filter_debounce_timer_timeout() {
 	_search();
 }
 
@@ -1328,7 +1331,8 @@ void EditorAssetLibrary::_bind_methods() {
 	ClassDB::bind_method("_select_category", &EditorAssetLibrary::_select_category);
 	ClassDB::bind_method("_image_request_completed", &EditorAssetLibrary::_image_request_completed);
 	ClassDB::bind_method("_search", &EditorAssetLibrary::_search, DEFVAL(0));
-	ClassDB::bind_method("_search_text_entered", &EditorAssetLibrary::_search_text_entered);
+	ClassDB::bind_method("_search_text_changed", &EditorAssetLibrary::_search_text_changed);
+	ClassDB::bind_method("_filter_debounce_timer_timeout", &EditorAssetLibrary::_filter_debounce_timer_timeout);
 	ClassDB::bind_method("_install_asset", &EditorAssetLibrary::_install_asset);
 	ClassDB::bind_method("_manage_plugins", &EditorAssetLibrary::_manage_plugins);
 	ClassDB::bind_method("_asset_open", &EditorAssetLibrary::_asset_open);
@@ -1359,10 +1363,15 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
 	filter = memnew(LineEdit);
 	search_hb->add_child(filter);
 	filter->set_h_size_flags(SIZE_EXPAND_FILL);
-	filter->connect("text_entered", this, "_search_text_entered");
-	search = memnew(Button(TTR("Search")));
-	search->connect("pressed", this, "_search");
-	search_hb->add_child(search);
+	filter->connect("text_changed", this, "_search_text_changed");
+
+	// Perform a search automatically if the user hasn't entered any text for a certain duration.
+	// This way, the user doesn't need to press Enter to initiate their search.
+	filter_debounce_timer = memnew(Timer);
+	filter_debounce_timer->set_one_shot(true);
+	filter_debounce_timer->set_wait_time(0.25);
+	filter_debounce_timer->connect("timeout", this, "_filter_debounce_timer_timeout");
+	search_hb->add_child(filter_debounce_timer);
 
 	if (!p_templates_only)
 		search_hb->add_child(memnew(VSeparator));

+ 3 - 1
editor/plugins/asset_library_editor_plugin.h

@@ -186,10 +186,10 @@ class EditorAssetLibrary : public PanelContainer {
 	Label *library_loading;
 	Label *library_error;
 	LineEdit *filter;
+	Timer *filter_debounce_timer;
 	OptionButton *categories;
 	OptionButton *repository;
 	OptionButton *sort;
-	Button *search;
 	HBoxContainer *error_hb;
 	TextureRect *error_tr;
 	Label *error_label;
@@ -284,10 +284,12 @@ class EditorAssetLibrary : public PanelContainer {
 
 	void _search(int p_page = 0);
 	void _rerun_search(int p_ignore);
+	void _search_text_changed(const String &p_text = "");
 	void _search_text_entered(const String &p_text = "");
 	void _api_request(const String &p_request, RequestType p_request_type, const String &p_arguments = "");
 	void _http_request_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data);
 	void _http_download_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data);
+	void _filter_debounce_timer_timeout();
 
 	void _repository_changed(int p_repository_id);
 	void _support_toggled(int p_support);