diff options
Diffstat (limited to 'src/MessageBox.h')
-rw-r--r-- | src/MessageBox.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/MessageBox.h b/src/MessageBox.h new file mode 100644 index 0000000..0e1fa8f --- /dev/null +++ b/src/MessageBox.h @@ -0,0 +1,98 @@ +//======================================================================== +// dng +//------------------------------------------------------------------------ +// Copyright (c) 2022 Steph Enders <steph@senders.io> +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef DNG_MESSAGE_BOX_H +#define DNG_MESSAGE_BOX_H + +#include "SFML/Graphics/RectangleShape.hpp" +#include "SFML/Graphics/Text.hpp" +#include "SfmlUtils.h" +#include <vector> + +const int LARGE_TEXT = 54; +const int MEDIUM_TEXT = 36; +const int SMALL_TEXT = 24; +const float PADDING = 16.f; +const float LINE_HEIGHT = 1.2f; +struct MessageBox { + + std::vector<sf::Text> msgs; + sf::RectangleShape box; + +} typedef MessageBox; + +struct DisplayText { + std::string msg; + int textSize; +} typedef DisplayText; + +inline MessageBox initializeMessageBox(const std::vector<DisplayText> &strs, + const sf::Font &font, + sf::Vector2u windowSize) { + + std::vector<sf::Text> messages; + sf::RectangleShape box; + float width = 0.f; + float height = 0.f; + float left = MAXFLOAT; + sf::Text prev; + for (const auto &str : strs) { + sf::Text text = write_text(str.msg.c_str(), str.textSize, LINE_HEIGHT, font, + windowSize); + // move below previous + if (!prev.getString().isEmpty()) { + text.move(0.f, prev.getLocalBounds().height * prev.getLineSpacing()); + } + // add to vector + messages.push_back(text); + + // find widest + if (text.getGlobalBounds().width > width) { + width = text.getGlobalBounds().width; + } + // find leftmost + if (text.getGlobalBounds().left < left) { + left = text.getGlobalBounds().left; + } + // heights added together + line height + height += (text.getLocalBounds().height * text.getLineSpacing()); + prev = text; + } + box = sf::RectangleShape(sf::Vector2f(width + PADDING, height + PADDING)); + box.setOutlineColor(sf::Color::Black); + box.setOutlineThickness(4.f); + box.setFillColor(sf::Color(128, 128, 128, 128)); + box.setPosition(left - (PADDING / 2.f), + // Top will always be the first message + messages[0].getGlobalBounds().top - (PADDING / 2.f)); + + return { + .msgs = messages, + .box = box, + }; +} + +#endif // DNG_MESSAGE_BOX_H
\ No newline at end of file |