瀏覽代碼

fix TextEdit VScroll max tolerance

newline

Co-Authored-By: Kit Bishop <[email protected]>
BrotherShort 5 月之前
父節點
當前提交
1077fdb15a
共有 2 個文件被更改,包括 17 次插入4 次删除
  1. 3 4
      scene/gui/text_edit.cpp
  2. 14 0
      tests/scene/test_text_edit.h

+ 3 - 4
scene/gui/text_edit.cpp

@@ -852,7 +852,7 @@ void TextEdit::_notification(int p_what) {
 			}
 
 			int first_vis_line = get_first_visible_line() - 1;
-			int draw_amount = visible_rows + (smooth_scroll_enabled ? 1 : 0);
+			int draw_amount = visible_rows + 1;
 			draw_amount += draw_placeholder ? placeholder_wrapped_rows.size() - 1 : get_line_wrap_count(first_vis_line + 1);
 
 			// Draw minimap.
@@ -4639,7 +4639,7 @@ int TextEdit::get_minimap_line_at_pos(const Point2i &p_pos) const {
 	int minimap_visible_lines = get_minimap_visible_lines();
 	int visible_rows = get_visible_line_count() + 1;
 	int first_vis_line = get_first_visible_line() - 1;
-	int draw_amount = visible_rows + (smooth_scroll_enabled ? 1 : 0);
+	int draw_amount = visible_rows + 1;
 	draw_amount += get_line_wrap_count(first_vis_line + 1);
 	int minimap_line_height = (minimap_char_size.y + minimap_line_spacing);
 
@@ -8053,7 +8053,7 @@ void TextEdit::_update_scrollbars() {
 
 	int visible_rows = get_visible_line_count();
 	int total_rows = draw_placeholder ? placeholder_wrapped_rows.size() : get_total_visible_line_count();
-	if (scroll_past_end_of_file_enabled && !fit_content_height) {
+	if ((scroll_past_end_of_file_enabled && !fit_content_height) || visible_rows == 0) {
 		total_rows += visible_rows - 1;
 	}
 
@@ -8076,7 +8076,6 @@ void TextEdit::_update_scrollbars() {
 		v_scroll->set_max(total_rows + _get_visible_lines_offset());
 		v_scroll->set_page(visible_rows + _get_visible_lines_offset());
 		set_v_scroll(get_v_scroll());
-
 	} else {
 		first_visible_line = 0;
 		first_visible_line_wrap_ofs = 0;

+ 14 - 0
tests/scene/test_text_edit.h

@@ -7920,6 +7920,20 @@ TEST_CASE("[SceneTree][TextEdit] viewport") {
 	memdelete(text_edit);
 }
 
+TEST_CASE("[SceneTree][TextEdit] small height value") {
+	TextEdit *text_edit = memnew(TextEdit);
+	SceneTree::get_singleton()->get_root()->add_child(text_edit);
+
+	text_edit->set_size(Size2(800, 32));
+	text_edit->set_text("0\n1\n2");
+	MessageQueue::get_singleton()->flush();
+
+	text_edit->set_v_scroll(100);
+	CHECK(text_edit->get_v_scroll() < 3);
+
+	memdelete(text_edit);
+}
+
 TEST_CASE("[SceneTree][TextEdit] setter getters") {
 	TextEdit *text_edit = memnew(TextEdit);
 	SceneTree::get_singleton()->get_root()->add_child(text_edit);