diff options
Diffstat (limited to 'src/Chatbar.cpp')
-rw-r--r-- | src/Chatbar.cpp | 140 |
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() |