diff --git a/libs/ui/include/psemek/ui/label.hpp b/libs/ui/include/psemek/ui/label.hpp index 146022fb..80f131ba 100644 --- a/libs/ui/include/psemek/ui/label.hpp +++ b/libs/ui/include/psemek/ui/label.hpp @@ -17,6 +17,7 @@ namespace psemek::ui left, center, right, + stretch, }; enum class valignment diff --git a/libs/ui/source/label.cpp b/libs/ui/source/label.cpp index 4e91f66e..4cbc6e67 100644 --- a/libs/ui/source/label.cpp +++ b/libs/ui/source/label.cpp @@ -209,12 +209,19 @@ namespace psemek::ui for (std::size_t l = 0; l < lines.size(); ++l) { geom::interval x_range; + int spaces = 0; + for (std::size_t i = lines[l].first; i < lines[l].second; ++i) + { x_range |= glyphs[i].position[0]; + if (std::isspace(glyphs[i].character)) + ++spaces; + } max_line_size = std::max(max_line_size, x_range.length()); geom::vector offset; + float space_extra = 0.f; switch (halign_) { @@ -227,6 +234,11 @@ namespace psemek::ui case halignment::right: offset[0] = bbox[0].max - x_range.length() - x_range.min; break; + case halignment::stretch: + offset[0] = bbox[0].min - x_range.min; + if (l + 1 != lines.size() && spaces > 0) + space_extra = (bbox[0].length() - x_range.length()) / spaces; + break; } switch (valign_) @@ -243,7 +255,11 @@ namespace psemek::ui } for (std::size_t i = lines[l].first; i < lines[l].second; ++i) + { glyphs[i].position += offset; + if (std::isspace(glyphs[i].character)) + offset[0] += space_extra; + } } state.glyphs = std::move(glyphs);