aboutsummaryrefslogtreecommitdiff
path: root/src/MessageBoard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/MessageBoard.cpp')
-rw-r--r--src/MessageBoard.cpp106
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
}
}