diff --git a/Widgets/WidgetText.cpp b/Widgets/WidgetText.cpp index a3c98d8..770d30e 100644 --- a/Widgets/WidgetText.cpp +++ b/Widgets/WidgetText.cpp @@ -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); } diff --git a/Widgets/WidgetText.h b/Widgets/WidgetText.h index fe79313..e0fc988 100644 --- a/Widgets/WidgetText.h +++ b/Widgets/WidgetText.h @@ -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 = "");