Skip to content

Commit fe7ac97

Browse files
committed
CodeEdit: Add line number gutter minimum digits
1 parent c0c1c68 commit fe7ac97

File tree

6 files changed

+35
-1
lines changed

6 files changed

+35
-1
lines changed

doc/classes/CodeEdit.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,9 @@
562562
<member name="gutters_draw_line_numbers" type="bool" setter="set_draw_line_numbers" getter="is_draw_line_numbers_enabled" default="false">
563563
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.
564564
</member>
565+
<member name="gutters_line_numbers_min_digits" type="int" setter="set_line_numbers_min_digits" getter="get_line_numbers_min_digits" default="1">
566+
The minimum width in digits reserved for the line number gutter.
567+
</member>
565568
<member name="gutters_zero_pad_line_numbers" type="bool" setter="set_line_numbers_zero_padded" getter="is_line_numbers_zero_padded" default="false">
566569
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].
567570
</member>

doc/classes/EditorSettings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,9 @@
12801280
<member name="text_editor/appearance/gutters/highlight_type_safe_lines" type="bool" setter="" getter="">
12811281
If [code]true[/code], highlights type-safe lines by displaying their line number color with [member text_editor/theme/highlighting/safe_line_number_color] instead of [member text_editor/theme/highlighting/line_number_color]. Type-safe lines are lines of code where the type of all variables is known at compile-time. These type-safe lines may run faster thanks to typed instructions.
12821282
</member>
1283+
<member name="text_editor/appearance/gutters/line_numbers_min_digits" type="int" setter="" getter="">
1284+
The minimum width in digits reserved for the line number gutter.
1285+
</member>
12831286
<member name="text_editor/appearance/gutters/line_numbers_zero_padded" type="bool" setter="" getter="">
12841287
If [code]true[/code], displays line numbers with zero padding (e.g. [code]007[/code] instead of [code]7[/code]).
12851288
</member>

editor/gui/code_editor.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,7 @@ void CodeTextEditor::update_editor_settings() {
11191119
// Appearance: Gutters
11201120
text_editor->set_draw_line_numbers(EDITOR_GET("text_editor/appearance/gutters/show_line_numbers"));
11211121
text_editor->set_line_numbers_zero_padded(EDITOR_GET("text_editor/appearance/gutters/line_numbers_zero_padded"));
1122+
text_editor->set_line_numbers_min_digits(EDITOR_GET("text_editor/appearance/gutters/line_numbers_min_digits"));
11221123

11231124
// Appearance: Minimap
11241125
text_editor->set_draw_minimap(EDITOR_GET("text_editor/appearance/minimap/show_minimap"));

editor/settings/editor_settings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
761761
// Appearance: Gutters
762762
_initial_set("text_editor/appearance/gutters/show_line_numbers", true, true);
763763
_initial_set("text_editor/appearance/gutters/line_numbers_zero_padded", false, true);
764+
EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/appearance/gutters/line_numbers_min_digits", 2, "1,10,1,or_greater");
764765
_initial_set("text_editor/appearance/gutters/highlight_type_safe_lines", true, true);
765766
_initial_set("text_editor/appearance/gutters/show_info_gutter", true, true);
766767

scene/gui/code_edit.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,26 @@ bool CodeEdit::is_line_numbers_zero_padded() const {
15111511
return line_number_padding == "0";
15121512
}
15131513

1514+
void CodeEdit::set_line_numbers_min_digits(int p_count) {
1515+
if (line_numbers_min_digits == p_count) {
1516+
return;
1517+
}
1518+
line_numbers_min_digits = p_count;
1519+
1520+
int digits = MAX(line_numbers_min_digits, std::log10(get_line_count()) + 1);
1521+
if (digits == line_number_digits) {
1522+
return;
1523+
}
1524+
line_number_digits = digits;
1525+
_clear_line_number_text_cache();
1526+
_update_line_number_gutter_width();
1527+
queue_redraw();
1528+
}
1529+
1530+
int CodeEdit::get_line_numbers_min_digits() const {
1531+
return line_numbers_min_digits;
1532+
}
1533+
15141534
void CodeEdit::_line_number_draw_callback(int p_line, int p_gutter, const Rect2 &p_region) {
15151535
if (!Rect2(Vector2(0, 0), get_size()).intersects(p_region)) {
15161536
return;
@@ -2800,6 +2820,8 @@ void CodeEdit::_bind_methods() {
28002820
ClassDB::bind_method(D_METHOD("is_draw_line_numbers_enabled"), &CodeEdit::is_draw_line_numbers_enabled);
28012821
ClassDB::bind_method(D_METHOD("set_line_numbers_zero_padded", "enable"), &CodeEdit::set_line_numbers_zero_padded);
28022822
ClassDB::bind_method(D_METHOD("is_line_numbers_zero_padded"), &CodeEdit::is_line_numbers_zero_padded);
2823+
ClassDB::bind_method(D_METHOD("set_line_numbers_min_digits", "count"), &CodeEdit::set_line_numbers_min_digits);
2824+
ClassDB::bind_method(D_METHOD("get_line_numbers_min_digits"), &CodeEdit::get_line_numbers_min_digits);
28032825

28042826
/* Fold Gutter */
28052827
ClassDB::bind_method(D_METHOD("set_draw_fold_gutter", "enable"), &CodeEdit::set_draw_fold_gutter);
@@ -2944,6 +2966,7 @@ void CodeEdit::_bind_methods() {
29442966

29452967
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "gutters_draw_line_numbers"), "set_draw_line_numbers", "is_draw_line_numbers_enabled");
29462968
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "gutters_zero_pad_line_numbers"), "set_line_numbers_zero_padded", "is_line_numbers_zero_padded");
2969+
ADD_PROPERTY(PropertyInfo(Variant::INT, "gutters_line_numbers_min_digits", PROPERTY_HINT_RANGE, "1,10,1,or_greater"), "set_line_numbers_min_digits", "get_line_numbers_min_digits");
29472970

29482971
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "gutters_draw_fold_gutter"), "set_draw_fold_gutter", "is_drawing_fold_gutter");
29492972

@@ -3823,7 +3846,7 @@ void CodeEdit::_text_changed() {
38233846
}
38243847

38253848
int lc = get_line_count();
3826-
int new_line_number_digits = std::log10(lc) + 1;
3849+
int new_line_number_digits = MAX(line_numbers_min_digits, std::log10(lc) + 1);
38273850
if (line_number_digits != new_line_number_digits) {
38283851
_clear_line_number_text_cache();
38293852
}

scene/gui/code_edit.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ class CodeEdit : public TextEdit {
111111
/* Line numbers */
112112
int line_number_gutter = -1;
113113
int line_number_digits = 1;
114+
int line_numbers_min_digits = 1;
114115
String line_number_padding = " ";
115116
HashMap<int, RID> line_number_text_cache;
116117
void _clear_line_number_text_cache();
@@ -413,6 +414,8 @@ class CodeEdit : public TextEdit {
413414
bool is_draw_line_numbers_enabled() const;
414415
void set_line_numbers_zero_padded(bool p_zero_padded);
415416
bool is_line_numbers_zero_padded() const;
417+
void set_line_numbers_min_digits(int p_count);
418+
int get_line_numbers_min_digits() const;
416419

417420
/* Fold gutter */
418421
void set_draw_fold_gutter(bool p_draw);

0 commit comments

Comments
 (0)