aboutsummaryrefslogtreecommitdiff
path: root/src/Chatbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Chatbar.cpp')
-rw-r--r--src/Chatbar.cpp140
1 files changed, 11 insertions, 129 deletions
diff --git a/src/Chatbar.cpp b/src/Chatbar.cpp
index 55fd764..5f17c28 100644
--- a/src/Chatbar.cpp
+++ b/src/Chatbar.cpp
@@ -29,89 +29,15 @@ namespace dchat
unordered_map<string, string> binds;
Chatbar::Chatbar() :
- text("", *ResourceCache::getFont("fonts/Roboto-Regular.ttf"), FONT_SIZE * Settings::getScaling()),
- caretIndex(0),
+ text("", ResourceCache::getFont("fonts/Roboto-Regular.ttf"), FONT_SIZE * Settings::getScaling(), 0),
focused(true)
{
+ text.setEditable(true);
text.setFillColor(sf::Color(240, 240, 240));
background.setFillColor(ColorScheme::getBackgroundColor());
inputBackground.setFillColor(ColorScheme::getBackgroundColor() + sf::Color(10, 10, 10));
}
- void Chatbar::addChar(sf::Uint32 codePoint)
- {
- auto str = text.getString();
- str.insert(caretIndex, codePoint);
- text.setString(str);
- ++caretIndex;
- caretOffset = text.findCharacterPos(caretIndex) - text.getPosition();
- blinkTimer.restart();
- }
-
- void Chatbar::addString(const string &strToAdd)
- {
- if(strToAdd.empty()) return;
- auto str = text.getString();
- str.insert(caretIndex, sf::String::fromUtf8(strToAdd.begin(), strToAdd.end()));
- text.setString(str);
- caretIndex += strToAdd.size();
- caretOffset = text.findCharacterPos(caretIndex) - text.getPosition();
- blinkTimer.restart();
- }
-
- 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();
- }
- blinkTimer.restart();
- }
-
- void Chatbar::removeNextChar()
- {
- if(caretIndex < text.getString().getSize())
- {
- auto str = text.getString();
- str.erase(caretIndex);
- text.setString(str);
- }
- blinkTimer.restart();
- }
-
- void Chatbar::clear()
- {
- text.setString("");
- caretIndex = 0;
- caretOffset.x = 0.0f;
- caretOffset.y = 0.0f;
- blinkTimer.restart();
- }
-
- 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();
- blinkTimer.restart();
- }
-
- void Chatbar::moveCaretRight()
- {
- caretIndex = min((int)text.getString().getSize(), caretIndex + 1);
- caretOffset = text.findCharacterPos(caretIndex) - text.getPosition();
- blinkTimer.restart();
- }
-
bool Chatbar::isFocused() const
{
return focused;
@@ -207,18 +133,6 @@ namespace dchat
}
}
- static string getClipboard()
- {
- string result;
- TinyProcessLib::Process process("xsel -o -b", "", [&result](const char *bytes, size_t n)
- {
- result.append(bytes, n);
- });
- if(process.get_exit_status() != 0)
- fprintf(stderr, "Failed to get clipboard content\n");
- return result;
- }
-
static void findReplaceAll(string &str, const string &substrToReplace, const string &stringToReplaceWith)
{
size_t findOffset = 0;
@@ -245,21 +159,20 @@ namespace dchat
{
if(!focused) return;
+ text.processEvent(event);
if(event.type == sf::Event::TextEntered)
{
- if(event.text.unicode == 8) // backspace
- removePreviousChar();
- else if(event.text.unicode == 13) // enter
+ if(event.text.unicode == 13) // enter
{
- if(!getString().isEmpty())
+ if(!text.getString().isEmpty())
{
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::LShift) || sf::Keyboard::isKeyPressed(sf::Keyboard::Key::RShift))
{
- addChar('\n');
+ //addChar('\n');
}
else
{
- auto chatbarMsgUtf8 = getString().toUtf8();
+ auto chatbarMsgUtf8 = text.getString().toUtf8();
string msg;
msg.resize(chatbarMsgUtf8.size());
memcpy(&msg[0], chatbarMsgUtf8.data(), chatbarMsgUtf8.size());
@@ -270,35 +183,14 @@ namespace dchat
replaceBinds(msg);
channel->addMessage(msg);
}
- clear();
+ text.setString("");
}
}
}
- else if(event.text.unicode == 127) // delete
- {
- removeNextChar();
- }
- else if(event.text.unicode == 22) // ctrl+v
- {
- // TODO: Instead of calling external xsel, use sfml clipboard functionality (in new sfml version)
- string clipboard = getClipboard();
- addString(clipboard);
- }
- else
- {
- addChar(event.text.unicode);
- }
- }
- else if(event.type == sf::Event::KeyPressed)
- {
- if(event.key.code == sf::Keyboard::Left)
- moveCaretLeft();
- else if(event.key.code == sf::Keyboard::Right)
- moveCaretRight();
}
}
- void Chatbar::draw(sf::RenderWindow &window)
+ void Chatbar::draw(sf::RenderWindow &window, Cache &cache)
{
auto windowSize = window.getSize();
@@ -320,20 +212,10 @@ namespace dchat
inputBackground.setSize(inputBackgroundSize);
inputBackground.setPosition(inputBackgroundPos);
text.setPosition(floor(inputBackgroundPos.x + BOX_PADDING_X), floor(inputBackgroundPos.y + inputBackgroundSize.y * 0.5f - fontHeight * 0.5f));
+ text.setMaxWidth(inputBackgroundSize.x - BOX_PADDING_X * 2.0f);
window.draw(inputBackground);
- window.draw(text);
-
- int blinkElapsedTime = blinkTimer.getElapsedTime().asMilliseconds();
- if(focused && blinkElapsedTime <= BLINK_TIME_VISIBLE_MS)
- {
- sf::RectangleShape caretShape(sf::Vector2f(2.0f, inputBackgroundSize.y - BOX_PADDING_Y * Settings::getScaling() * 2.0f));
- caretShape.setPosition(floor(text.getPosition().x + caretOffset.x), floor(caretOffset.y + inputBackgroundPos.y + BOX_PADDING_Y * Settings::getScaling()));
- window.draw(caretShape);
- }
-
- if(blinkElapsedTime > BLINK_TIME_VISIBLE_MS + BLINK_TIME_INVISIBLE_MS)
- blinkTimer.restart();
+ text.draw(window, cache);
}
float Chatbar::getHeight()