@@ -139,11 +139,14 @@ bool Label::_shape() {
139
139
can_process_lines = true ;
140
140
lines_dirty = false ;
141
141
} else {
142
- // With autowrap on, we won't compute the minimum size until width is stable (two shape requests in a
143
- // row with the same width.) This avoids situations in which the initial width is very narrow and the label
144
- // would break text into many very short lines, causing a very tall label that can leave a deformed container.
145
-
146
- can_process_lines = get_size ().width == stable_width || autowrap_mode == TextServer::AUTOWRAP_OFF;
142
+ // With autowrap on or off with trimming enabled, we won't compute the minimum size until width is stable
143
+ // (two shape requests in a row with the same width.) This avoids situations in which the initial width is
144
+ // very narrow and the label would break text into many very short lines, causing a very tall label that can
145
+ // leave a deformed container. In the remaining case (namely, autowrap off and no trimming), the label is
146
+ // free to dictate its own width, something that will be taken advtantage of.
147
+ bool can_dictate_width = autowrap_mode == TextServer::AUTOWRAP_OFF && overrun_behavior == TextServer::OVERRUN_NO_TRIMMING;
148
+ bool is_width_stable = get_size ().width == stable_width;
149
+ can_process_lines = can_dictate_width || is_width_stable;
147
150
stable_width = get_size ().width ;
148
151
149
152
if (can_process_lines) {
@@ -171,14 +174,13 @@ bool Label::_shape() {
171
174
}
172
175
}
173
176
174
- if (autowrap_mode == TextServer::AUTOWRAP_OFF ) {
177
+ if (can_dictate_width ) {
175
178
for (int i = 0 ; i < lines_rid.size (); i++) {
176
179
if (minsize.width < TS->shaped_text_get_size (lines_rid[i]).x ) {
177
180
minsize.width = TS->shaped_text_get_size (lines_rid[i]).x ;
178
181
}
179
182
}
180
183
181
- // With autowrap off, by now we already know the width the label will take.
182
184
width = (minsize.width - style->get_minimum_size ().width );
183
185
}
184
186
0 commit comments