Skip to content

Commit 33ca534

Browse files
committed
Better text allignment
1 parent ae8a657 commit 33ca534

File tree

3 files changed

+28
-40
lines changed

3 files changed

+28
-40
lines changed

examples/sample_menu.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ int main()
8080
// Test to use as the title of the menu.
8181
menuConfig.TitleText = "My Menu Title";
8282

83+
// Scaling factor to apply to the whole menu.
84+
menuConfig.ScalingFactor = 1.0;
85+
8386
// Use the BuildMenu factory function in the IMenu header. This gives a fully built menu object.
8487
auto menu = Menu::BuildMenu(window.getSize(), menuConfig);
8588

public/game_menu/Menu.h

+5
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ namespace Menu
163163
/// Text to use on the title.
164164
/// </summary>
165165
std::string TitleText;
166+
167+
/// <summary>
168+
/// Scaling factor to apply to the menu.
169+
/// </summary>
170+
float ScalingFactor = 1.0;
166171
};
167172

168173
/// <summary>

src/MenuImpl.cpp

+20-40
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,23 @@
1313

1414
namespace Menu
1515
{
16-
sf::Text BuildText(const std::string& text, const sf::Font& font, const float& fontSize, const sf::Vector2u& windowSize,
17-
const sf::Vector2f& basePosition, const float& paddingLeft);
18-
float GetOffsetCoefficient(const Align& alignment);
16+
sf::Text BuildText(const std::string& text, const Style& textStyle, const sf::Vector2u& windowSize, const float& scalingFactor, const float& yHeight);
1917

2018
IMenu::~IMenu() {}
2119

2220
MenuImpl::MenuImpl(const MenuConfig& config, const sf::Vector2u& windowSize)
2321
: _selectedColor(config.SelectedItemColor)
2422
, _unselectedColor(config.ItemStyle.Color)
2523
{
26-
const auto titleOffsetCoefficient = GetOffsetCoefficient(config.TitleStyle.Alignment);
27-
const auto titleLocationX = ((float)windowSize.x * titleOffsetCoefficient) + config.TitleStyle.Padding.Left;
28-
_title = BuildText(config.TitleText, config.TitleStyle.Font, config.TitleStyle.FontSize, windowSize,
29-
sf::Vector2f(titleLocationX, config.TitleStyle.Padding.Top), config.TitleStyle.Padding.Left);
30-
_title.setColor(config.TitleStyle.Color);
31-
32-
// Calculating Menu item locations. X is constant, Y will be updated for each row.
33-
const auto offsetCoefficient = GetOffsetCoefficient(config.ItemStyle.Alignment);
34-
const auto x = ((float)windowSize.x * offsetCoefficient) + config.ItemStyle.Padding.Left;
35-
auto y = config.TitleStyle.Padding.Top + _title.getGlobalBounds().height + config.TitleStyle.Padding.Bottom + config.ItemStyle.Padding.Top;
24+
_title = BuildText(config.TitleText, config.TitleStyle, windowSize, config.ScalingFactor, 0.0);
25+
26+
auto y = (config.TitleStyle.Padding.Top * config.ScalingFactor) + _title.getGlobalBounds().height + (config.TitleStyle.Padding.Bottom * config.ScalingFactor);
3627
for (auto& item : config.Items)
3728
{
38-
auto text = BuildText(item.Name, config.ItemStyle.Font, config.ItemStyle.FontSize, windowSize, sf::Vector2f(x, y), config.ItemStyle.Padding.Left);
29+
auto text = BuildText(item.Name, config.ItemStyle, windowSize, config.ScalingFactor, y);
3930
_items.push_back(std::make_pair(text, item.Action));
40-
y += config.ItemStyle.Padding.Top + text.getGlobalBounds().height + config.ItemStyle.Padding.Bottom;
31+
32+
y += (config.ItemStyle.Padding.Top * config.ScalingFactor) + text.getGlobalBounds().height + (config.ItemStyle.Padding.Bottom * config.ScalingFactor);
4133
}
4234
}
4335

@@ -74,42 +66,30 @@ namespace Menu
7466
}
7567
}
7668

77-
sf::Text BuildText(const std::string& text, const sf::Font& font, const float& fontSize, const sf::Vector2u& windowSize,
78-
const sf::Vector2f& basePosition, const float& paddingLeft)
69+
sf::Text BuildText(const std::string& text, const Style& textStyle, const sf::Vector2u& windowSize, const float& scalingFactor, const float& yHeight)
7970
{
80-
sf::Text sfText(text, font, fontSize);
81-
const auto halfTextBoxWidth = sfText.getLocalBounds().width / 2.0f;
82-
sfText.setOrigin(halfTextBoxWidth, 0);
71+
sf::Text sfText(text, textStyle.Font, (std::uint32_t)(textStyle.FontSize * scalingFactor));
72+
sfText.setColor(textStyle.Color);
8373

84-
auto textX = basePosition.x;
85-
if (textX - halfTextBoxWidth < 0)
74+
auto x = textStyle.Padding.Left * scalingFactor;
75+
if (textStyle.Alignment == Align::Center)
8676
{
87-
textX = halfTextBoxWidth + paddingLeft;
77+
// The x position of the text is the mid point of the window, minus half the width of the text box including padding.
78+
const auto totalTextLength = (textStyle.Padding.Left * scalingFactor) + sfText.getGlobalBounds().width + (textStyle.Padding.Right * scalingFactor);
79+
x = (windowSize.x / 2.0) - (totalTextLength / 2.0) + (textStyle.Padding.Left * scalingFactor);
8880
}
89-
else if (textX + halfTextBoxWidth > windowSize.x)
81+
else if (textStyle.Alignment == Align::Right)
9082
{
91-
textX = windowSize.x - halfTextBoxWidth + paddingLeft;
83+
// The x position of the text is the right boarder of the window minus the full width of the text with the padding.
84+
x = windowSize.x - (textStyle.Padding.Right * scalingFactor) - sfText.getGlobalBounds().width - (textStyle.Padding.Left * scalingFactor);
9285
}
9386

94-
sfText.setPosition(sf::Vector2f(textX, basePosition.y));
87+
const auto y = yHeight + (textStyle.Padding.Top * scalingFactor);
88+
sfText.setPosition(x, y);
9589

9690
return sfText;
9791
}
9892

99-
float GetOffsetCoefficient(const Align& alignment)
100-
{
101-
switch (alignment)
102-
{
103-
case Align::Left:
104-
return 0.25f;
105-
case Align::Right:
106-
return 0.75f;
107-
case Align::Center:
108-
default: // Center is the default alignment if unknown.
109-
return 0.5f;
110-
}
111-
}
112-
11393
std::shared_ptr<IMenu> BuildMenu(const sf::Vector2u& windowSize, const MenuConfig& menuConfig)
11494
{
11595
return std::make_shared<MenuImpl>(menuConfig, windowSize);

0 commit comments

Comments
 (0)