diff options
Diffstat (limited to 'src/MessageBoard.cpp')
-rw-r--r-- | src/MessageBoard.cpp | 106 |
1 files changed, 58 insertions, 48 deletions
diff --git a/src/MessageBoard.cpp b/src/MessageBoard.cpp index 575ae5f..d39e8be 100644 --- a/src/MessageBoard.cpp +++ b/src/MessageBoard.cpp @@ -1,6 +1,7 @@ #include "../include/MessageBoard.hpp" #include "../include/Settings.hpp" #include "../include/ResourceCache.hpp" +#include "../include/Gif.hpp" #include <SFML/Graphics/RectangleShape.hpp> #include <SFML/Graphics/Sprite.hpp> #include <SFML/Window/Mouse.hpp> @@ -32,7 +33,8 @@ namespace dchat void MessageBoard::updateStaticContentTexture(const sf::Vector2u &newSize) { - useStaticContentTexture = staticContentTexture.create(newSize.x, newSize.y); + if(!staticContentTexture.create(newSize.x, newSize.y)) + throw std::runtime_error("Failed to create render target for message board!"); dirty = true; } @@ -86,32 +88,15 @@ namespace dchat void MessageBoard::draw(sf::RenderWindow &window, Cache &cache) { - sf::RenderTarget *renderTarget = nullptr; - if(useStaticContentTexture) - { - renderTarget = &staticContentTexture; - if(window.getSize() != staticContentTexture.getSize()) - updateStaticContentTexture(window.getSize()); - } - else - { - renderTarget = &window; - dirty = true; - } + auto windowSize = window.getSize(); + sf::Vector2u backgroundSize(floor(windowSize.x * 0.7f), floor(windowSize.y)); + sf::Vector2f backgroundPos(floor(windowSize.x * 0.5f - backgroundSize.x * 0.5f), 0.0f); - auto renderTargetSize = renderTarget->getSize(); + if(backgroundSize != staticContentTexture.getSize()) + updateStaticContentTexture(backgroundSize); - 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); - } + if(dirty) + staticContentTexture.clear(sf::Color::Transparent); const sf::Font &usernameFont = ResourceCache::getFont("fonts/Roboto-Regular.ttf"); @@ -122,9 +107,11 @@ namespace dchat usernameText.setFillColor(sf::Color(15, 192, 252)); usernameText.setPosition(position); if(dirty) - renderTarget->draw(usernameText); + staticContentTexture.draw(usernameText); position.y += usernameText.getCharacterSize() + USERNAME_PADDING_BOTTOM; + int index = 0; + int numParts = message->getParts().size(); for(MessagePart *messagePart : message->getParts()) { switch(messagePart->type) @@ -136,36 +123,50 @@ namespace dchat 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); + staticContentTexture.draw(messagePartText->text); position.x += messagePartText->text.getLocalBounds().width; break; } case MessagePart::Type::EMOJI: { MessagePartEmoji *messagePartEmoji = static_cast<MessagePartEmoji*>(messagePart); - // Emoji is dirty when it's created, but render target can become dirty after emoji has been added, so we need to set emoji as dirty then - if(dirty) - messagePartEmoji->dirty = true; - auto imageByUrlResult = cache.getImageByUrl(messagePartEmoji->url, 1024 * 512); position.x += 5.0f; - if(imageByUrlResult.texture) + auto imageByUrlResult = cache.getImageByUrl(messagePartEmoji->url, 1024 * 512); + bool imageDrawn = false; + if(imageByUrlResult.isGif && imageByUrlResult.gif) { - // 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(messagePartEmoji->dirty) + sf::Vector2f pos(backgroundPos.x + floor(position.x), backgroundPos.y + floor(position.y + MessagePart::getSizeScaled() * 0.5f - MessagePartEmoji::getHeightScaled() * 0.5f)); + imageByUrlResult.gif->setPosition(pos); + imageByUrlResult.gif->setSize(sf::Vector2f(MessagePartEmoji::getHeightScaled(), MessagePartEmoji::getHeightScaled())); + imageByUrlResult.gif->draw(window); + imageDrawn = true; + } + else + { + // Emoji is dirty when it's created, but render target can become dirty after emoji has been added, so we need to set emoji as dirty then + if(dirty) + messagePartEmoji->dirty = true; + if(imageByUrlResult.texture) { - messagePartEmoji->dirty = false; - renderTarget->draw(messagePartEmoji->sprite); + // 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(messagePartEmoji->dirty) + { + messagePartEmoji->dirty = false; + staticContentTexture.draw(messagePartEmoji->sprite); + } + imageDrawn = true; } } - else + + if(!imageDrawn) { // 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.setPosition(backgroundPos.x + floor(position.x), backgroundPos.y + floor(position.y + MessagePart::getSizeScaled() * 0.5f - MessagePartEmoji::getHeightScaled() * 0.5f)); emojiDownloadRect.setFillColor(sf::Color::White); window.draw(emojiDownloadRect); } @@ -173,25 +174,33 @@ namespace dchat break; } } + + if(index < numParts - 1 && messagePart->newLine) + { + position.x = 0.0f; + position.y += MessagePart::getSizeScaled(); + } + ++index; } position.x = 0.0f; position.y += MessagePart::getSizeScaled() + MESSAGE_PADDING_BOTTOM; } - if(useStaticContentTexture) - staticContentTexture.display(); - + staticContentTexture.display(); dirty = false; - if(useStaticContentTexture) - window.draw(sf::Sprite(staticContentTexture.getTexture())); + // TODO: Save this, expensive to create on fly? + sf::Sprite textureSprite(staticContentTexture.getTexture()); + textureSprite.setPosition(backgroundPos); + window.draw(textureSprite); if(!selectingText) return; sf::Vector2f selectionRectStart(min((float)mousePos.x, selectingTextStart.x), min((float)mousePos.y, selectingTextStart.y)); sf::Vector2f selectionRectEnd(max((float)mousePos.x, selectingTextStart.x), max((float)mousePos.y, selectingTextStart.y)); sf::FloatRect selectionRect(selectionRectStart, selectionRectEnd - selectionRectStart); - +#if 0 + // TODO: Remove this, put logic in render loop above for(Message *message : messages) { float messagePartStartX = -999.0f; @@ -260,5 +269,6 @@ namespace dchat window.draw(selectionShape); } } +#endif } } |