Added ability to choose type of text alignment

This commit is contained in:
nedko 2025-12-08 17:28:49 +02:00
parent 9f8a037f69
commit 82c35a6636
2 changed files with 40 additions and 4 deletions

View File

@ -84,6 +84,7 @@ static SDL_Rect find_visible_area(const SDL_Surface* txt_surface)
WidgetText::WidgetText(int x, int y, int width, int height, string text,
TextFit fit, bool should_wrap,
HorizontalAlign halign, VerticalAlign valign,
bool halign_via_visible, bool valign_via_visible,
SDL_Color text_color,
int size, std::string font)
: Widget(x, y, width, height),
@ -94,7 +95,9 @@ m_fit(fit),
m_should_wrap(should_wrap),
m_halign(halign),
m_valign(valign),
m_text_color(text_color)
m_text_color(text_color),
m_halign_via_visible(halign_via_visible),
m_valign_via_visible(valign_via_visible)
{
}
@ -109,7 +112,9 @@ m_fit(fit),
m_should_wrap(should_wrap),
m_halign(HALIGN_CENTER),
m_valign(VALIGN_CENTER),
m_text_color{.r = 0, .g = 0, .b = 0, .a = SDL_ALPHA_OPAQUE}
m_text_color{.r = 0, .g = 0, .b = 0, .a = SDL_ALPHA_OPAQUE},
m_halign_via_visible(true),
m_valign_via_visible(true)
{
}
@ -122,7 +127,9 @@ m_size(size),
m_fit(FIT_NONE),
m_halign(HALIGN_CENTER),
m_valign(VALIGN_CENTER),
m_text_color{.r = 0, .g = 0, .b = 0, .a = SDL_ALPHA_OPAQUE}
m_text_color{.r = 0, .g = 0, .b = 0, .a = SDL_ALPHA_OPAQUE},
m_halign_via_visible(true),
m_valign_via_visible(true)
{
}
@ -238,6 +245,18 @@ void WidgetText::draw()
// Now we have the final rendered text surface
SDL_Rect hint = find_visible_area(txt_surface);
if (!m_halign_via_visible)
{
hint.x = 0;
hint.w = txt_surface->w;
}
if (!m_valign_via_visible)
{
hint.y = 0;
hint.h = txt_surface->h;
}
SDL_Rect align = surface_align(m_surface, txt_surface, m_halign, m_valign, &hint);
SDL_BlitSurface(txt_surface, NULL, m_surface, &align);
SDL_FreeSurface(txt_surface);
@ -254,6 +273,8 @@ Widget* WidgetText::builder(const nlohmann::json& j)
bool should_wrap = false;
HorizontalAlign halign = HALIGN_CENTER;
VerticalAlign valign = VALIGN_CENTER;
bool halign_via_visible = true;
bool valign_via_visible = true;
SDL_Color text_color = {.r = 0, .g = 0, .b = 0, .a = SDL_ALPHA_OPAQUE};
int size = 0;
string font = "";
@ -267,6 +288,8 @@ Widget* WidgetText::builder(const nlohmann::json& j)
json_extract(j, "should_wrap", should_wrap);
json_extract(j, "halign", halign);
json_extract(j, "valign", valign);
json_extract(j, "halign_via_visible", halign_via_visible);
json_extract(j, "valign_via_visible", valign_via_visible);
json_extract(j, "color", text_color);
json_extract(j, "size", size);
json_extract(j, "font", font);
@ -276,5 +299,9 @@ Widget* WidgetText::builder(const nlohmann::json& j)
return nullptr;
}
return new WidgetText(x, y, width, height, text, fit, should_wrap, halign, valign, text_color, size, font);
return new WidgetText(x, y, width, height,
text, fit, should_wrap,
halign, valign,
halign_via_visible, valign_via_visible,
text_color, size, font);
}

View File

@ -40,10 +40,19 @@ protected:
// Default - black
SDL_Color m_text_color;
// Whether to H-align via visible pixels or rendering surface
// Default - true
bool m_halign_via_visible;
// Whether to V-align via visible pixels or rendering surface
// Default - true
bool m_valign_via_visible;
public:
WidgetText(int x, int y, int width, int height, std::string text,
TextFit fit, bool should_wrap,
HorizontalAlign halign, VerticalAlign valign,
bool halign_via_visible, bool valign_via_visible,
SDL_Color text_color,
int size, std::string font = "");