#include static void draw_if_true( daguerre::hilbert_color &out, const bool &in, const daguerre::hilbert_color ¶m) { if (in) out = param; } namespace pake::widgets { fixed_text::fixed_text( std::string &&text, const daguerre::fixed_font *font, daguerre::hilbert_color bg, daguerre::hilbert_color fg, halign ha, valign va) : font(font), bg(bg), fg(fg), text(std::move(text)), ha(ha), va(va) {} void fixed_text::set_text(std::string &&text) { this->text = std::move(text); text_changed = true; } void fixed_text::render( dirtiable_image &onto, int x_off, int y_off, bool force) { if (force || text_changed) { //TODO: check overflow onto.dirty.fill(true, x_off, y_off, width, height); onto.image.fill( bg, x_off, y_off, width, height); switch (ha) { case halign::left: break; case halign::center: x_off = width / 2 - text.size() * font->glyph_width / 2; break; case halign::right: x_off = width - text.size() * font->glyph_width; break; } switch (va) { case valign::top: break; case valign::center: y_off = height / 2 - font->glyph_height / 2; break; case valign::bottom: y_off = height - font->glyph_width; break; } onto.image.render_text( *font, fg, x_off, y_off, text.data(), draw_if_true); text_changed = false; } } void fixed_text::notify_size(int width, int height) { this->width = width; this->height = height; } }