Add bold font support in ui::label

This commit is contained in:
Nikita Lisitsa 2022-03-12 17:50:33 +03:00
parent 9e9fd738b7
commit a3cda92f4c
2 changed files with 26 additions and 9 deletions

View file

@ -12,6 +12,12 @@ namespace psemek::ui
struct label
: element
{
enum font_type
{
normal,
bold,
};
enum class halignment
{
left,
@ -40,6 +46,9 @@ namespace psemek::ui
virtual void set_text(std::string 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 halignment halign() const { return halign_; }
@ -70,6 +79,7 @@ namespace psemek::ui
private:
std::string text_;
font_type font_ = font_type::normal;
halignment halign_ = halignment::left;
valignment valign_ = valignment::top;
bool wrap_ = true;

View file

@ -16,6 +16,12 @@ namespace psemek::ui
on_state_changed();
}
void label::set_font(font_type f)
{
font_ = f;
on_state_changed();
}
void label::set_halign(halignment value)
{
halign_ = value;
@ -119,13 +125,14 @@ namespace psemek::ui
auto st = merged_own_style();
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;
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;
for (auto const & g : glyphs)
@ -136,7 +143,7 @@ namespace psemek::ui
if (wrap_)
{
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();
}
@ -201,7 +208,7 @@ namespace psemek::ui
x_offset = glyphs[el_start - 1].position[0].max;
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)
{
glyphs[i] = els[i - el_start];
@ -260,13 +267,13 @@ namespace psemek::ui
switch (valign_)
{
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;
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;
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;
}
@ -280,7 +287,7 @@ namespace psemek::ui
state.glyphs = std::move(glyphs);
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;
}