Browse Source

Merge pull request #67994 from YeldhamDev/how_suggestive

Stop centering clicked suggestions in the autocomplete popup
Rémi Verschelde 2 năm trước cách đây
mục cha
commit
87cdc2ea60
2 tập tin đã thay đổi với 19 bổ sung1 xóa
  1. 18 1
      scene/gui/code_edit.cpp
  2. 1 0
      scene/gui/code_edit.h

+ 18 - 1
scene/gui/code_edit.cpp

@@ -138,7 +138,7 @@ void CodeEdit::_notification(int p_what) {
 				code_completion_scroll_rect.position = code_completion_rect.position + Vector2(code_completion_rect.size.width, 0);
 				code_completion_scroll_rect.position = code_completion_rect.position + Vector2(code_completion_rect.size.width, 0);
 				code_completion_scroll_rect.size = Vector2(scroll_width, code_completion_rect.size.height);
 				code_completion_scroll_rect.size = Vector2(scroll_width, code_completion_rect.size.height);
 
 
-				code_completion_line_ofs = CLAMP(code_completion_current_selected - lines / 2, 0, code_completion_options_count - lines);
+				code_completion_line_ofs = CLAMP((code_completion_force_item_center < 0 ? code_completion_current_selected : code_completion_force_item_center) - lines / 2, 0, code_completion_options_count - lines);
 				RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(code_completion_rect.position.x, code_completion_rect.position.y + (code_completion_current_selected - code_completion_line_ofs) * row_height), Size2(code_completion_rect.size.width, row_height)), code_completion_selected_color);
 				RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(code_completion_rect.position.x, code_completion_rect.position.y + (code_completion_current_selected - code_completion_line_ofs) * row_height), Size2(code_completion_rect.size.width, row_height)), code_completion_selected_color);
 
 
 				for (int i = 0; i < lines; i++) {
 				for (int i = 0; i < lines; i++) {
@@ -281,16 +281,22 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 				case MouseButton::WHEEL_UP: {
 				case MouseButton::WHEEL_UP: {
 					if (code_completion_current_selected > 0) {
 					if (code_completion_current_selected > 0) {
 						code_completion_current_selected--;
 						code_completion_current_selected--;
+						code_completion_force_item_center = -1;
 						queue_redraw();
 						queue_redraw();
 					}
 					}
 				} break;
 				} break;
 				case MouseButton::WHEEL_DOWN: {
 				case MouseButton::WHEEL_DOWN: {
 					if (code_completion_current_selected < code_completion_options.size() - 1) {
 					if (code_completion_current_selected < code_completion_options.size() - 1) {
 						code_completion_current_selected++;
 						code_completion_current_selected++;
+						code_completion_force_item_center = -1;
 						queue_redraw();
 						queue_redraw();
 					}
 					}
 				} break;
 				} break;
 				case MouseButton::LEFT: {
 				case MouseButton::LEFT: {
+					if (code_completion_force_item_center == -1) {
+						code_completion_force_item_center = code_completion_current_selected;
+					}
+
 					code_completion_current_selected = CLAMP(code_completion_line_ofs + (mb->get_position().y - code_completion_rect.position.y) / get_line_height(), 0, code_completion_options.size() - 1);
 					code_completion_current_selected = CLAMP(code_completion_line_ofs + (mb->get_position().y - code_completion_rect.position.y) / get_line_height(), 0, code_completion_options.size() - 1);
 					if (mb->is_double_click()) {
 					if (mb->is_double_click()) {
 						confirm_code_completion();
 						confirm_code_completion();
@@ -300,6 +306,7 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 				default:
 				default:
 					break;
 					break;
 			}
 			}
+
 			return;
 			return;
 		} else if (code_completion_active && code_completion_scroll_rect.has_point(mb->get_position())) {
 		} else if (code_completion_active && code_completion_scroll_rect.has_point(mb->get_position())) {
 			if (mb->get_button_index() != MouseButton::LEFT) {
 			if (mb->get_button_index() != MouseButton::LEFT) {
@@ -448,6 +455,7 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 			} else {
 			} else {
 				code_completion_current_selected = code_completion_options.size() - 1;
 				code_completion_current_selected = code_completion_options.size() - 1;
 			}
 			}
+			code_completion_force_item_center = -1;
 			queue_redraw();
 			queue_redraw();
 			accept_event();
 			accept_event();
 			return;
 			return;
@@ -458,30 +466,35 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 			} else {
 			} else {
 				code_completion_current_selected = 0;
 				code_completion_current_selected = 0;
 			}
 			}
+			code_completion_force_item_center = -1;
 			queue_redraw();
 			queue_redraw();
 			accept_event();
 			accept_event();
 			return;
 			return;
 		}
 		}
 		if (k->is_action("ui_page_up", true)) {
 		if (k->is_action("ui_page_up", true)) {
 			code_completion_current_selected = MAX(0, code_completion_current_selected - code_completion_max_lines);
 			code_completion_current_selected = MAX(0, code_completion_current_selected - code_completion_max_lines);
+			code_completion_force_item_center = -1;
 			queue_redraw();
 			queue_redraw();
 			accept_event();
 			accept_event();
 			return;
 			return;
 		}
 		}
 		if (k->is_action("ui_page_down", true)) {
 		if (k->is_action("ui_page_down", true)) {
 			code_completion_current_selected = MIN(code_completion_options.size() - 1, code_completion_current_selected + code_completion_max_lines);
 			code_completion_current_selected = MIN(code_completion_options.size() - 1, code_completion_current_selected + code_completion_max_lines);
+			code_completion_force_item_center = -1;
 			queue_redraw();
 			queue_redraw();
 			accept_event();
 			accept_event();
 			return;
 			return;
 		}
 		}
 		if (k->is_action("ui_home", true)) {
 		if (k->is_action("ui_home", true)) {
 			code_completion_current_selected = 0;
 			code_completion_current_selected = 0;
+			code_completion_force_item_center = -1;
 			queue_redraw();
 			queue_redraw();
 			accept_event();
 			accept_event();
 			return;
 			return;
 		}
 		}
 		if (k->is_action("ui_end", true)) {
 		if (k->is_action("ui_end", true)) {
 			code_completion_current_selected = code_completion_options.size() - 1;
 			code_completion_current_selected = code_completion_options.size() - 1;
+			code_completion_force_item_center = -1;
 			queue_redraw();
 			queue_redraw();
 			accept_event();
 			accept_event();
 			return;
 			return;
@@ -1978,6 +1991,7 @@ void CodeEdit::set_code_completion_selected_index(int p_index) {
 	}
 	}
 	ERR_FAIL_INDEX(p_index, code_completion_options.size());
 	ERR_FAIL_INDEX(p_index, code_completion_options.size());
 	code_completion_current_selected = p_index;
 	code_completion_current_selected = p_index;
+	code_completion_force_item_center = -1;
 	queue_redraw();
 	queue_redraw();
 }
 }
 
 
@@ -2808,6 +2822,7 @@ void CodeEdit::_update_scroll_selected_line(float p_mouse_y) {
 	percent = CLAMP(percent, 0.0f, 1.0f);
 	percent = CLAMP(percent, 0.0f, 1.0f);
 
 
 	code_completion_current_selected = (int)(percent * (code_completion_options.size() - 1));
 	code_completion_current_selected = (int)(percent * (code_completion_options.size() - 1));
+	code_completion_force_item_center = -1;
 }
 }
 
 
 void CodeEdit::_filter_code_completion_candidates_impl() {
 void CodeEdit::_filter_code_completion_candidates_impl() {
@@ -2867,6 +2882,7 @@ void CodeEdit::_filter_code_completion_candidates_impl() {
 
 
 		code_completion_longest_line = MIN(max_width, code_completion_max_width * font_size);
 		code_completion_longest_line = MIN(max_width, code_completion_max_width * font_size);
 		code_completion_current_selected = 0;
 		code_completion_current_selected = 0;
+		code_completion_force_item_center = -1;
 		code_completion_active = true;
 		code_completion_active = true;
 		queue_redraw();
 		queue_redraw();
 		return;
 		return;
@@ -3123,6 +3139,7 @@ void CodeEdit::_filter_code_completion_candidates_impl() {
 
 
 	code_completion_longest_line = MIN(max_width, code_completion_max_width * font_size);
 	code_completion_longest_line = MIN(max_width, code_completion_max_width * font_size);
 	code_completion_current_selected = 0;
 	code_completion_current_selected = 0;
+	code_completion_force_item_center = -1;
 	code_completion_active = true;
 	code_completion_active = true;
 	queue_redraw();
 	queue_redraw();
 }
 }

+ 1 - 0
scene/gui/code_edit.h

@@ -214,6 +214,7 @@ private:
 	Vector<ScriptLanguage::CodeCompletionOption> code_completion_options;
 	Vector<ScriptLanguage::CodeCompletionOption> code_completion_options;
 	int code_completion_line_ofs = 0;
 	int code_completion_line_ofs = 0;
 	int code_completion_current_selected = 0;
 	int code_completion_current_selected = 0;
+	int code_completion_force_item_center = -1;
 	int code_completion_longest_line = 0;
 	int code_completion_longest_line = 0;
 	Rect2i code_completion_rect;
 	Rect2i code_completion_rect;
 	Rect2i code_completion_scroll_rect;
 	Rect2i code_completion_scroll_rect;