diff --git a/doc/classes/CodeEdit.xml b/doc/classes/CodeEdit.xml index 44139739940..7074ba9e890 100644 --- a/doc/classes/CodeEdit.xml +++ b/doc/classes/CodeEdit.xml @@ -562,6 +562,9 @@ If [code]true[/code], the line number gutter is drawn. Line numbers start at [code]1[/code] and are incremented for each line of text. Clicking and dragging in the line number gutter will select entire lines of text. + + The minimum width in digits reserved for the line number gutter. + If [code]true[/code], line numbers drawn in the gutter are zero padded based on the total line count. Requires [member gutters_draw_line_numbers] to be set to [code]true[/code]. diff --git a/scene/gui/code_edit.cpp b/scene/gui/code_edit.cpp index 15878bd4dab..452c6a13b8d 100644 --- a/scene/gui/code_edit.cpp +++ b/scene/gui/code_edit.cpp @@ -1511,6 +1511,26 @@ bool CodeEdit::is_line_numbers_zero_padded() const { return line_number_padding == "0"; } +void CodeEdit::set_line_numbers_min_digits(int p_count) { + if (line_numbers_min_digits == p_count) { + return; + } + line_numbers_min_digits = p_count; + + int digits = MAX(line_numbers_min_digits, std::log10(get_line_count()) + 1); + if (digits == line_number_digits) { + return; + } + line_number_digits = digits; + _clear_line_number_text_cache(); + _update_line_number_gutter_width(); + queue_redraw(); +} + +int CodeEdit::get_line_numbers_min_digits() const { + return line_numbers_min_digits; +} + void CodeEdit::_line_number_draw_callback(int p_line, int p_gutter, const Rect2 &p_region) { if (!Rect2(Vector2(0, 0), get_size()).intersects(p_region)) { return; @@ -2800,6 +2820,8 @@ void CodeEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("is_draw_line_numbers_enabled"), &CodeEdit::is_draw_line_numbers_enabled); ClassDB::bind_method(D_METHOD("set_line_numbers_zero_padded", "enable"), &CodeEdit::set_line_numbers_zero_padded); ClassDB::bind_method(D_METHOD("is_line_numbers_zero_padded"), &CodeEdit::is_line_numbers_zero_padded); + ClassDB::bind_method(D_METHOD("set_line_numbers_min_digits", "count"), &CodeEdit::set_line_numbers_min_digits); + ClassDB::bind_method(D_METHOD("get_line_numbers_min_digits"), &CodeEdit::get_line_numbers_min_digits); /* Fold Gutter */ ClassDB::bind_method(D_METHOD("set_draw_fold_gutter", "enable"), &CodeEdit::set_draw_fold_gutter); @@ -2944,6 +2966,7 @@ void CodeEdit::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "gutters_draw_line_numbers"), "set_draw_line_numbers", "is_draw_line_numbers_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "gutters_zero_pad_line_numbers"), "set_line_numbers_zero_padded", "is_line_numbers_zero_padded"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "gutters_line_numbers_min_digits", PROPERTY_HINT_RANGE, "1,5,1"), "set_line_numbers_min_digits", "get_line_numbers_min_digits"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "gutters_draw_fold_gutter"), "set_draw_fold_gutter", "is_drawing_fold_gutter"); @@ -3823,7 +3846,7 @@ void CodeEdit::_text_changed() { } int lc = get_line_count(); - int new_line_number_digits = std::log10(lc) + 1; + int new_line_number_digits = MAX(line_numbers_min_digits, std::log10(lc) + 1); if (line_number_digits != new_line_number_digits) { _clear_line_number_text_cache(); } diff --git a/scene/gui/code_edit.h b/scene/gui/code_edit.h index 74ca889bb1c..bda57af261c 100644 --- a/scene/gui/code_edit.h +++ b/scene/gui/code_edit.h @@ -111,6 +111,7 @@ private: /* Line numbers */ int line_number_gutter = -1; int line_number_digits = 1; + int line_numbers_min_digits = 3; String line_number_padding = " "; HashMap line_number_text_cache; void _clear_line_number_text_cache(); @@ -413,6 +414,8 @@ public: bool is_draw_line_numbers_enabled() const; void set_line_numbers_zero_padded(bool p_zero_padded); bool is_line_numbers_zero_padded() const; + void set_line_numbers_min_digits(int p_count); + int get_line_numbers_min_digits() const; /* Fold gutter */ void set_draw_fold_gutter(bool p_draw);