diff options
Diffstat (limited to 'src/Chatbar.cpp')
-rw-r--r-- | src/Chatbar.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/Chatbar.cpp b/src/Chatbar.cpp new file mode 100644 index 0000000..14edba7 --- /dev/null +++ b/src/Chatbar.cpp @@ -0,0 +1,96 @@ +#include "../include/Chatbar.hpp" +#include "../include/ResourceCache.hpp" +#include "../include/Settings.hpp" +#include <cmath> + +using namespace std; + +namespace dchat +{ + const float FONT_SIZE = 24; + const float BOX_PADDING_X = 15.0f; + const float BOX_PADDING_Y = 5.0f; + + Chatbar::Chatbar() : + text("", ResourceCache::getFont("fonts/Roboto-Regular.ttf"), FONT_SIZE * Settings::getScaling()), + caretIndex(0) + { + text.setFillColor(sf::Color(240, 240, 240)); + background.setFillColor(sf::Color(60, 60, 60)); + } + + void Chatbar::addChar(sf::Uint32 codePoint) + { + auto str = text.getString(); + str.insert(caretIndex, codePoint); + text.setString(str); + ++caretIndex; + caretOffset = text.findCharacterPos(caretIndex) - text.getPosition(); + } + + const sf::String& Chatbar::getString() const + { + return text.getString(); + } + + void Chatbar::removePreviousChar() + { + if(caretIndex > 0) + { + auto str = text.getString(); + str.erase(caretIndex - 1); + text.setString(str); + --caretIndex; + caretOffset = text.findCharacterPos(caretIndex) - text.getPosition(); + } + } + + void Chatbar::removeNextChar() + { + if(caretIndex < text.getString().getSize()) + { + auto str = text.getString(); + str.erase(caretIndex); + text.setString(str); + } + } + + void Chatbar::clear() + { + text.setString(""); + caretIndex = 0; + caretOffset.x = 0.0f; + caretOffset.y = 0.0f; + } + + void Chatbar::moveCaretLeft() + { + caretIndex = max(0, caretIndex - 1); + // TODO: Use glyph size to optimize this, no need to iterate all glyphs + caretOffset = text.findCharacterPos(caretIndex) - text.getPosition(); + } + + void Chatbar::moveCaretRight() + { + caretIndex = min((int)text.getString().getSize(), caretIndex + 1); + caretOffset = text.findCharacterPos(caretIndex) - text.getPosition(); + } + + void Chatbar::draw(sf::RenderWindow &window) + { + auto windowSize = window.getSize(); + + sf::Vector2f backgroundSize(floor(windowSize.x * 0.7f), floor(text.getCharacterSize() * 1.7f + BOX_PADDING_Y * 2.0f)); + sf::Vector2f backgroundPos(floor(windowSize.x * 0.5f - backgroundSize.x * 0.5f), floor(windowSize.y - backgroundSize.y - 20.0f)); + background.setSize(backgroundSize); + background.setPosition(backgroundPos); + text.setPosition(floor(backgroundPos.x + BOX_PADDING_X), floor(backgroundPos.y + backgroundSize.y * 0.5f - text.getCharacterSize() * 0.5f)); + + window.draw(background); + window.draw(text); + + sf::RectangleShape caretShape(sf::Vector2f(2.0f, backgroundSize.y - BOX_PADDING_Y * 2.0f)); + caretShape.setPosition(floor(text.getPosition().x + caretOffset.x), backgroundPos.y + BOX_PADDING_Y); + window.draw(caretShape); + } +} |