aboutsummaryrefslogtreecommitdiff
path: root/src/MessageBoard.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-04-21 03:46:58 +0200
committerdec05eba <dec05eba@protonmail.com>2018-04-21 03:50:59 +0200
commit09a8ade6becca2a71f45ff0db5f4bf6d64afb212 (patch)
tree3cc733a5af1323c57f7dc4c18747ae0c7de78be6 /src/MessageBoard.cpp
parentde059e317e43fa1b94d77fd981be68b86bf6de6e (diff)
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.
Diffstat (limited to 'src/MessageBoard.cpp')
-rw-r--r--src/MessageBoard.cpp104
1 files changed, 67 insertions, 37 deletions
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,56 +99,86 @@ 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<MessagePartText*>(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<MessagePartText*>(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<MessagePartEmoji*>(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()));
if(!selectingText) return;