Label breaks lines on space characters only
This commit is contained in:
parent
0de3b782dc
commit
e754da5f46
1 changed files with 20 additions and 9 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue