Browse Source

Merge pull request #70168 from Haydoggo/autocomplete-placement-fix

Fix autocomplete box placement
Rémi Verschelde 2 years ago
parent
commit
03cc4c3f3b
2 changed files with 5 additions and 2 deletions
  1. 3 1
      scene/gui/code_edit.cpp
  2. 2 1
      tests/scene/test_code_edit.h

+ 3 - 1
scene/gui/code_edit.cpp

@@ -115,7 +115,9 @@ void CodeEdit::_notification(int p_what) {
 
 
 				const Point2 caret_pos = get_caret_draw_pos();
 				const Point2 caret_pos = get_caret_draw_pos();
 				const int total_height = csb->get_minimum_size().y + code_completion_rect.size.height;
 				const int total_height = csb->get_minimum_size().y + code_completion_rect.size.height;
-				if (caret_pos.y + row_height + total_height > get_size().height) {
+				const bool can_fit_completion_above = (caret_pos.y - row_height > total_height);
+				const bool can_fit_completion_below = (caret_pos.y + row_height + total_height <= get_size().height);
+				if (!can_fit_completion_below && can_fit_completion_above) {
 					code_completion_rect.position.y = (caret_pos.y - total_height - row_height) + line_spacing;
 					code_completion_rect.position.y = (caret_pos.y - total_height - row_height) + line_spacing;
 				} else {
 				} else {
 					code_completion_rect.position.y = caret_pos.y + (line_spacing / 2.0f);
 					code_completion_rect.position.y = caret_pos.y + (line_spacing / 2.0f);

+ 2 - 1
tests/scene/test_code_edit.h

@@ -3027,7 +3027,7 @@ TEST_CASE("[SceneTree][CodeEdit] completion") {
 			CHECK(code_edit->get_code_completion_selected_index() == 0);
 			CHECK(code_edit->get_code_completion_selected_index() == 0);
 
 
 			Point2 caret_pos = code_edit->get_caret_draw_pos();
 			Point2 caret_pos = code_edit->get_caret_draw_pos();
-			caret_pos.y -= code_edit->get_line_height();
+			caret_pos.y += code_edit->get_line_height();
 			SEND_GUI_MOUSE_BUTTON_EVENT(code_edit, caret_pos, MouseButton::WHEEL_DOWN, MouseButton::NONE, Key::NONE);
 			SEND_GUI_MOUSE_BUTTON_EVENT(code_edit, caret_pos, MouseButton::WHEEL_DOWN, MouseButton::NONE, Key::NONE);
 			CHECK(code_edit->get_code_completion_selected_index() == 1);
 			CHECK(code_edit->get_code_completion_selected_index() == 1);
 
 
@@ -3035,6 +3035,7 @@ TEST_CASE("[SceneTree][CodeEdit] completion") {
 			CHECK(code_edit->get_code_completion_selected_index() == 0);
 			CHECK(code_edit->get_code_completion_selected_index() == 0);
 
 
 			/* Single click selects. */
 			/* Single click selects. */
+			caret_pos.y += code_edit->get_line_height() * 2;
 			SEND_GUI_MOUSE_BUTTON_EVENT(code_edit, caret_pos, MouseButton::LEFT, MouseButton::MASK_LEFT, Key::NONE);
 			SEND_GUI_MOUSE_BUTTON_EVENT(code_edit, caret_pos, MouseButton::LEFT, MouseButton::MASK_LEFT, Key::NONE);
 			CHECK(code_edit->get_code_completion_selected_index() == 2);
 			CHECK(code_edit->get_code_completion_selected_index() == 2);