diff --git a/libs/ui/source/label.cpp b/libs/ui/source/label.cpp index b4a60bb5..aeabc534 100644 --- a/libs/ui/source/label.cpp +++ b/libs/ui/source/label.cpp @@ -1,6 +1,7 @@ #include #include +#include namespace psemek::ui { @@ -113,6 +114,12 @@ namespace psemek::ui for (std::size_t line = 0; line < max_lines; ++line) { + if (line != 0) + { + while (current_glyph < glyphs.size() && std::isspace(glyphs[current_glyph].character)) + ++current_glyph; + } + std::size_t line_begin = current_glyph; std::size_t line_end = line_begin; @@ -127,6 +134,16 @@ namespace psemek::ui ++line_end; } + if (line_end < glyphs.size()) + { + std::size_t space_pos = line_end; + while (space_pos > line_begin && !std::isspace(glyphs[space_pos].character)) + --space_pos; + + if (space_pos > line_begin) + line_end = space_pos; + } + if (line + 1 == max_lines && line_end < glyphs.size()) { switch (overflow_) @@ -165,8 +182,6 @@ namespace psemek::ui break; } - geom::interval x_range_full; - for (std::size_t l = 0; l < lines.size(); ++l) { geom::interval x_range; @@ -175,18 +190,16 @@ namespace psemek::ui geom::vector offset; - float prev_x = x_range_full.empty() ? 0.f : x_range_full.length(); - switch (halign_) { case halignment::left: - offset[0] = shape_.box[0].min - prev_x; + offset[0] = shape_.box[0].min - x_range.min; break; case halignment::center: - offset[0] = shape_.box[0].center() - x_range.length() / 2.f - prev_x; + offset[0] = shape_.box[0].center() - x_range.length() / 2.f - x_range.min; break; case halignment::right: - offset[0] = shape_.box[0].max - x_range.length() - prev_x; + offset[0] = shape_.box[0].max - x_range.length() - x_range.min; break; } @@ -205,8 +218,6 @@ namespace psemek::ui for (std::size_t i = lines[l].first; i < lines[l].second; ++i) glyphs[i].position += offset; - - x_range_full |= x_range; } cached_state_->glyphs = std::move(glyphs);