aboutsummaryrefslogtreecommitdiff
path: root/src/Chatbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Chatbar.cpp')
-rw-r--r--src/Chatbar.cpp96
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);
+ }
+}