From 09a8ade6becca2a71f45ff0db5f4bf6d64afb212 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 21 Apr 2018 03:46:58 +0200 Subject: Add support for static image emoji Emoji are downloaded asynchronously using remote program (curl). Need to add support for converting [inline](url) chat message emoji and gifs. --- src/MessageBoard.cpp | 104 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 37 deletions(-) (limited to 'src/MessageBoard.cpp') diff --git a/src/MessageBoard.cpp b/src/MessageBoard.cpp index 2b9115a..acb7be1 100644 --- a/src/MessageBoard.cpp +++ b/src/MessageBoard.cpp @@ -84,7 +84,7 @@ namespace dchat } } - void MessageBoard::draw(sf::RenderWindow &window) + void MessageBoard::draw(sf::RenderWindow &window, Cache &cache) { sf::RenderTarget *renderTarget = nullptr; if(useStaticContentTexture) @@ -99,55 +99,85 @@ namespace dchat dirty = true; } - if(dirty) + auto renderTargetSize = renderTarget->getSize(); + + if(useStaticContentTexture) { - dirty = false; - auto renderTargetSize = renderTarget->getSize(); - - if(useStaticContentTexture) + if(dirty) staticContentTexture.clear(BACKGROUND_COLOR); - else - { - sf::RectangleShape background(sf::Vector2f(renderTargetSize.x, renderTargetSize.y)); - background.setFillColor(BACKGROUND_COLOR); - renderTarget->draw(background); - } - - const sf::Font &usernameFont = ResourceCache::getFont("fonts/Roboto-Regular.ttf"); + } + else + { + sf::RectangleShape background(sf::Vector2f(renderTargetSize.x, renderTargetSize.y)); + background.setFillColor(BACKGROUND_COLOR); + renderTarget->draw(background); + } + + const sf::Font &usernameFont = ResourceCache::getFont("fonts/Roboto-Regular.ttf"); + + sf::Vector2f position; + for(Message *message : messages) + { + sf::Text usernameText(message->user->getName(), usernameFont, MessagePartText::getFontSizeScaled() * 1.3f); + usernameText.setFillColor(sf::Color(15, 192, 252)); + usernameText.setPosition(position); + if(dirty) + renderTarget->draw(usernameText); + position.y += usernameText.getCharacterSize() + USERNAME_PADDING_BOTTOM; - sf::Vector2f position; - for(Message *message : messages) + for(MessagePart *messagePart : message->getParts()) { - sf::Text usernameText(message->user->getName(), usernameFont, MessagePartText::getFontSizeScaled() * 1.3f); - usernameText.setFillColor(sf::Color(15, 192, 252)); - usernameText.setPosition(position); - renderTarget->draw(usernameText); - position.y += usernameText.getCharacterSize() + USERNAME_PADDING_BOTTOM; - - for(MessagePart *messagePart : message->getParts()) + switch(messagePart->type) { - switch(messagePart->type) + case MessagePart::Type::TEXT: { - case MessagePart::Type::TEXT: - { - MessagePartText *messagePartText = static_cast(messagePart); - messagePartText->text.setFillColor(sf::Color(240, 240, 240)); - messagePartText->text.setCharacterSize(MessagePartText::getFontSizeScaled()); - messagePartText->text.setPosition(floor(position.x), floor(position.y + MessagePart::getSizeScaled() * 0.5f - MessagePartText::getFontSizeScaled() * 0.5f)); + MessagePartText *messagePartText = static_cast(messagePart); + messagePartText->text.setFillColor(sf::Color(240, 240, 240)); + messagePartText->text.setCharacterSize(MessagePartText::getFontSizeScaled()); + messagePartText->text.setPosition(floor(position.x), floor(position.y + MessagePart::getSizeScaled() * 0.5f - MessagePartText::getFontSizeScaled() * 0.5f)); + if(dirty) renderTarget->draw(messagePartText->text); - position.x += messagePartText->text.getLocalBounds().width; - break; + position.x += messagePartText->text.getLocalBounds().width; + break; + } + case MessagePart::Type::EMOJI: + { + MessagePartEmoji *messagePartEmoji = static_cast(messagePart); + auto imageByUrlResult = cache.getImageByUrl(messagePartEmoji->url, 1024 * 512); + position.x += 5.0f; + if(imageByUrlResult.texture) + { + // TODO: Verify this doesn't cause lag + messagePartEmoji->sprite.setTexture(*imageByUrlResult.texture, true); + sf::Vector2f spriteSize(MessagePartEmoji::getHeightScaled(), MessagePartEmoji::getHeightScaled()); + messagePartEmoji->sprite.setScale(spriteSize.x / (float)imageByUrlResult.texture->getSize().x, spriteSize.y / (float)imageByUrlResult.texture->getSize().y); + messagePartEmoji->sprite.setPosition(floor(position.x), floor(position.y + MessagePart::getSizeScaled() * 0.5f - MessagePartEmoji::getHeightScaled() * 0.5f)); + if(dirty) + renderTarget->draw(messagePartEmoji->sprite); + } + else + { + // TODO: Replace this with a loading gif + sf::RectangleShape emojiDownloadRect(sf::Vector2f(MessagePartEmoji::getHeightScaled(), MessagePartEmoji::getHeightScaled())); + emojiDownloadRect.setPosition(floor(position.x), floor(position.y + MessagePart::getSizeScaled() * 0.5f - MessagePartEmoji::getHeightScaled() * 0.5f)); + emojiDownloadRect.setFillColor(sf::Color::White); + if(dirty) + renderTarget->draw(emojiDownloadRect); } + position.x += MessagePartEmoji::getHeightScaled() + 5.0f; + break; } } - position.x = 0.0f; - position.y += MessagePart::getSizeScaled() + MESSAGE_PADDING_BOTTOM; } - - if(useStaticContentTexture) - staticContentTexture.display(); + position.x = 0.0f; + position.y += MessagePart::getSizeScaled() + MESSAGE_PADDING_BOTTOM; } + if(useStaticContentTexture) + staticContentTexture.display(); + + dirty = false; + if(useStaticContentTexture) window.draw(sf::Sprite(staticContentTexture.getTexture())); -- cgit v1.2.3