|
13 | 13 |
|
14 | 14 | namespace Menu
|
15 | 15 | {
|
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); |
19 | 17 |
|
20 | 18 | IMenu::~IMenu() {}
|
21 | 19 |
|
22 | 20 | MenuImpl::MenuImpl(const MenuConfig& config, const sf::Vector2u& windowSize)
|
23 | 21 | : _selectedColor(config.SelectedItemColor)
|
24 | 22 | , _unselectedColor(config.ItemStyle.Color)
|
25 | 23 | {
|
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); |
36 | 27 | for (auto& item : config.Items)
|
37 | 28 | {
|
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); |
39 | 30 | _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); |
41 | 33 | }
|
42 | 34 | }
|
43 | 35 |
|
@@ -74,42 +66,30 @@ namespace Menu
|
74 | 66 | }
|
75 | 67 | }
|
76 | 68 |
|
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) |
79 | 70 | {
|
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); |
83 | 73 |
|
84 |
| - auto textX = basePosition.x; |
85 |
| - if (textX - halfTextBoxWidth < 0) |
| 74 | + auto x = textStyle.Padding.Left * scalingFactor; |
| 75 | + if (textStyle.Alignment == Align::Center) |
86 | 76 | {
|
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); |
88 | 80 | }
|
89 |
| - else if (textX + halfTextBoxWidth > windowSize.x) |
| 81 | + else if (textStyle.Alignment == Align::Right) |
90 | 82 | {
|
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); |
92 | 85 | }
|
93 | 86 |
|
94 |
| - sfText.setPosition(sf::Vector2f(textX, basePosition.y)); |
| 87 | + const auto y = yHeight + (textStyle.Padding.Top * scalingFactor); |
| 88 | + sfText.setPosition(x, y); |
95 | 89 |
|
96 | 90 | return sfText;
|
97 | 91 | }
|
98 | 92 |
|
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 |
| - |
113 | 93 | std::shared_ptr<IMenu> BuildMenu(const sf::Vector2u& windowSize, const MenuConfig& menuConfig)
|
114 | 94 | {
|
115 | 95 | return std::make_shared<MenuImpl>(menuConfig, windowSize);
|
|
0 commit comments