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 <psemek/ui/label.hpp>
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
namespace psemek::ui
|
namespace psemek::ui
|
||||||
{
|
{
|
||||||
|
|
@ -113,6 +114,12 @@ namespace psemek::ui
|
||||||
|
|
||||||
for (std::size_t line = 0; line < max_lines; ++line)
|
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_begin = current_glyph;
|
||||||
std::size_t line_end = line_begin;
|
std::size_t line_end = line_begin;
|
||||||
|
|
||||||
|
|
@ -127,6 +134,16 @@ namespace psemek::ui
|
||||||
++line_end;
|
++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())
|
if (line + 1 == max_lines && line_end < glyphs.size())
|
||||||
{
|
{
|
||||||
switch (overflow_)
|
switch (overflow_)
|
||||||
|
|
@ -165,8 +182,6 @@ namespace psemek::ui
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
geom::interval<float> x_range_full;
|
|
||||||
|
|
||||||
for (std::size_t l = 0; l < lines.size(); ++l)
|
for (std::size_t l = 0; l < lines.size(); ++l)
|
||||||
{
|
{
|
||||||
geom::interval<float> x_range;
|
geom::interval<float> x_range;
|
||||||
|
|
@ -175,18 +190,16 @@ namespace psemek::ui
|
||||||
|
|
||||||
geom::vector<float, 2> offset;
|
geom::vector<float, 2> offset;
|
||||||
|
|
||||||
float prev_x = x_range_full.empty() ? 0.f : x_range_full.length();
|
|
||||||
|
|
||||||
switch (halign_)
|
switch (halign_)
|
||||||
{
|
{
|
||||||
case halignment::left:
|
case halignment::left:
|
||||||
offset[0] = shape_.box[0].min - prev_x;
|
offset[0] = shape_.box[0].min - x_range.min;
|
||||||
break;
|
break;
|
||||||
case halignment::center:
|
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;
|
break;
|
||||||
case halignment::right:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -205,8 +218,6 @@ namespace psemek::ui
|
||||||
|
|
||||||
for (std::size_t i = lines[l].first; i < lines[l].second; ++i)
|
for (std::size_t i = lines[l].first; i < lines[l].second; ++i)
|
||||||
glyphs[i].position += offset;
|
glyphs[i].position += offset;
|
||||||
|
|
||||||
x_range_full |= x_range;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cached_state_->glyphs = std::move(glyphs);
|
cached_state_->glyphs = std::move(glyphs);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue