Label breaks lines on space characters only

This commit is contained in:
Nikita Lisitsa 2021-02-26 11:50:34 +03:00
parent 0de3b782dc
commit e754da5f46

View file

@ -1,6 +1,7 @@
#include <psemek/ui/label.hpp>
#include <stdexcept>
#include <cctype>
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<float> x_range_full;
for (std::size_t l = 0; l < lines.size(); ++l)
{
geom::interval<float> x_range;
@ -175,18 +190,16 @@ namespace psemek::ui
geom::vector<float, 2> 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);