From 1077fdb15a4d10f918b0cbc7e0dc05194ac8a5ce Mon Sep 17 00:00:00 2001 From: BrotherShort <129957860+BrotherShort@users.noreply.github.com> Date: Sun, 30 Mar 2025 04:11:24 +0800 Subject: [PATCH] fix TextEdit VScroll max tolerance newline Co-Authored-By: Kit Bishop --- scene/gui/text_edit.cpp | 7 +++---- tests/scene/test_text_edit.h | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index f6f700de2a6..8c891d08ce9 100644 --- a/scene/gui/text_edit.cpp +++ b/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; diff --git a/tests/scene/test_text_edit.h b/tests/scene/test_text_edit.h index 8a10c0b6ee5..19db4f19e17 100644 --- a/tests/scene/test_text_edit.h +++ b/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);