Add bold font support in ui::label
This commit is contained in:
parent
9e9fd738b7
commit
a3cda92f4c
2 changed files with 26 additions and 9 deletions
|
|
@ -12,6 +12,12 @@ namespace psemek::ui
|
||||||
struct label
|
struct label
|
||||||
: element
|
: element
|
||||||
{
|
{
|
||||||
|
enum font_type
|
||||||
|
{
|
||||||
|
normal,
|
||||||
|
bold,
|
||||||
|
};
|
||||||
|
|
||||||
enum class halignment
|
enum class halignment
|
||||||
{
|
{
|
||||||
left,
|
left,
|
||||||
|
|
@ -40,6 +46,9 @@ namespace psemek::ui
|
||||||
virtual void set_text(std::string text);
|
virtual void set_text(std::string text);
|
||||||
virtual std::string_view text() const { return text_; }
|
virtual std::string_view text() const { return text_; }
|
||||||
|
|
||||||
|
virtual void set_font(font_type f);
|
||||||
|
virtual font_type font() const { return font_; }
|
||||||
|
|
||||||
virtual void set_halign(halignment value);
|
virtual void set_halign(halignment value);
|
||||||
virtual halignment halign() const { return halign_; }
|
virtual halignment halign() const { return halign_; }
|
||||||
|
|
||||||
|
|
@ -70,6 +79,7 @@ namespace psemek::ui
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string text_;
|
std::string text_;
|
||||||
|
font_type font_ = font_type::normal;
|
||||||
halignment halign_ = halignment::left;
|
halignment halign_ = halignment::left;
|
||||||
valignment valign_ = valignment::top;
|
valignment valign_ = valignment::top;
|
||||||
bool wrap_ = true;
|
bool wrap_ = true;
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,12 @@ namespace psemek::ui
|
||||||
on_state_changed();
|
on_state_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void label::set_font(font_type f)
|
||||||
|
{
|
||||||
|
font_ = f;
|
||||||
|
on_state_changed();
|
||||||
|
}
|
||||||
|
|
||||||
void label::set_halign(halignment value)
|
void label::set_halign(halignment value)
|
||||||
{
|
{
|
||||||
halign_ = value;
|
halign_ = value;
|
||||||
|
|
@ -119,13 +125,14 @@ namespace psemek::ui
|
||||||
|
|
||||||
auto st = merged_own_style();
|
auto st = merged_own_style();
|
||||||
if (!st) return state;
|
if (!st) return state;
|
||||||
if (!st->font) return state;
|
|
||||||
|
|
||||||
state.font = st->font.get();
|
state.font = (font_ == font_type::normal) ? st->font.get() : st->bold_font.get();
|
||||||
|
|
||||||
|
if (!state.font) return state;
|
||||||
|
|
||||||
shape_options opts;
|
shape_options opts;
|
||||||
opts.scale = *st->text_scale;
|
opts.scale = *st->text_scale;
|
||||||
auto glyphs = st->font->shape(text_, opts);
|
auto glyphs = state.font->shape(text_, opts);
|
||||||
|
|
||||||
geom::box<float, 2> raw_bbox;
|
geom::box<float, 2> raw_bbox;
|
||||||
for (auto const & g : glyphs)
|
for (auto const & g : glyphs)
|
||||||
|
|
@ -136,7 +143,7 @@ namespace psemek::ui
|
||||||
if (wrap_)
|
if (wrap_)
|
||||||
{
|
{
|
||||||
max_lines = std::isfinite(bbox[1].length())
|
max_lines = std::isfinite(bbox[1].length())
|
||||||
? std::max<std::size_t>(1, std::floor(bbox[1].length() / st->font->size()[1] / (*st->text_scale)))
|
? std::max<std::size_t>(1, std::floor(bbox[1].length() / state.font->size()[1] / (*st->text_scale)))
|
||||||
: std::numeric_limits<std::size_t>::max();
|
: std::numeric_limits<std::size_t>::max();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -201,7 +208,7 @@ namespace psemek::ui
|
||||||
x_offset = glyphs[el_start - 1].position[0].max;
|
x_offset = glyphs[el_start - 1].position[0].max;
|
||||||
|
|
||||||
char const el_str[] = "...";
|
char const el_str[] = "...";
|
||||||
auto els = st->font->shape(el_str, opts);
|
auto els = state.font->shape(el_str, opts);
|
||||||
for (std::size_t i = el_start; i < line_end; ++i)
|
for (std::size_t i = el_start; i < line_end; ++i)
|
||||||
{
|
{
|
||||||
glyphs[i] = els[i - el_start];
|
glyphs[i] = els[i - el_start];
|
||||||
|
|
@ -260,13 +267,13 @@ namespace psemek::ui
|
||||||
switch (valign_)
|
switch (valign_)
|
||||||
{
|
{
|
||||||
case valignment::top:
|
case valignment::top:
|
||||||
offset[1] = bbox[1].min + l * (*st->text_scale) * st->font->size()[1];
|
offset[1] = bbox[1].min + l * (*st->text_scale) * state.font->size()[1];
|
||||||
break;
|
break;
|
||||||
case valignment::center:
|
case valignment::center:
|
||||||
offset[1] = bbox[1].center() + (l - lines.size() / 2.f) * (*st->text_scale) * st->font->size()[1];
|
offset[1] = bbox[1].center() + (l - lines.size() / 2.f) * (*st->text_scale) * state.font->size()[1];
|
||||||
break;
|
break;
|
||||||
case valignment::bottom:
|
case valignment::bottom:
|
||||||
offset[1] = bbox[1].max + (l - lines.size() * 1.f) * (*st->text_scale) * st->font->size()[1];
|
offset[1] = bbox[1].max + (l - lines.size() * 1.f) * (*st->text_scale) * state.font->size()[1];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -280,7 +287,7 @@ namespace psemek::ui
|
||||||
|
|
||||||
state.glyphs = std::move(glyphs);
|
state.glyphs = std::move(glyphs);
|
||||||
state.size[0] = max_line_size;
|
state.size[0] = max_line_size;
|
||||||
state.size[1] = lines.size() * (*st->text_scale) * st->font->size()[1];
|
state.size[1] = lines.size() * (*st->text_scale) * state.font->size()[1];
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue