summaryrefslogtreecommitdiff
path: root/scene/gui
diff options
context:
space:
mode:
authorPedro J. Estébanez <pedrojrulez@gmail.com>2023-02-16 11:44:04 +0100
committerPedro J. Estébanez <pedrojrulez@gmail.com>2023-02-16 11:54:57 +0100
commit73b6c0b972150c7cee3975080bedc510f1088adb (patch)
tree72b716603c4f7021b17c80edf1a23d0f8363d376 /scene/gui
parentaa6ec763179e5bf1d1300aa72dc5f4172d810efa (diff)
Fix width determination of non-trimmed, non-wrapped labels
In other words, exclude trimmable labels from the special logic used for non-wrapping ones, since they are not expected to dictate their width authoritatively.
Diffstat (limited to 'scene/gui')
-rw-r--r--scene/gui/label.cpp16
1 files changed, 9 insertions, 7 deletions
diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp
index 45218773fe..b861d7af01 100644
--- a/scene/gui/label.cpp
+++ b/scene/gui/label.cpp
@@ -139,11 +139,14 @@ bool Label::_shape() {
can_process_lines = true;
lines_dirty = false;
} else {
- // With autowrap on, we won't compute the minimum size until width is stable (two shape requests in a
- // row with the same width.) This avoids situations in which the initial width is very narrow and the label
- // would break text into many very short lines, causing a very tall label that can leave a deformed container.
-
- can_process_lines = get_size().width == stable_width || autowrap_mode == TextServer::AUTOWRAP_OFF;
+ // With autowrap on or off with trimming enabled, we won't compute the minimum size until width is stable
+ // (two shape requests in a row with the same width.) This avoids situations in which the initial width is
+ // very narrow and the label would break text into many very short lines, causing a very tall label that can
+ // leave a deformed container. In the remaining case (namely, autowrap off and no trimming), the label is
+ // free to dictate its own width, something that will be taken advtantage of.
+ bool can_dictate_width = autowrap_mode == TextServer::AUTOWRAP_OFF && overrun_behavior == TextServer::OVERRUN_NO_TRIMMING;
+ bool is_width_stable = get_size().width == stable_width;
+ can_process_lines = can_dictate_width || is_width_stable;
stable_width = get_size().width;
if (can_process_lines) {
@@ -171,14 +174,13 @@ bool Label::_shape() {
}
}
- if (autowrap_mode == TextServer::AUTOWRAP_OFF) {
+ if (can_dictate_width) {
for (int i = 0; i < lines_rid.size(); i++) {
if (minsize.width < TS->shaped_text_get_size(lines_rid[i]).x) {
minsize.width = TS->shaped_text_get_size(lines_rid[i]).x;
}
}
- // With autowrap off, by now we already know the width the label will take.
width = (minsize.width - style->get_minimum_size().width);
}