#include "../include/Chatbar.hpp" #include "../include/ResourceCache.hpp" #include "../include/Settings.hpp" #include 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); } }