diff options
Diffstat (limited to 'src/ImagePreview.cpp')
-rw-r--r-- | src/ImagePreview.cpp | 81 |
1 files changed, 41 insertions, 40 deletions
diff --git a/src/ImagePreview.cpp b/src/ImagePreview.cpp index 0b36dbd..683bc1f 100644 --- a/src/ImagePreview.cpp +++ b/src/ImagePreview.cpp @@ -1,8 +1,8 @@ #include "../include/ImagePreview.hpp" #include "../include/Settings.hpp" -#include "../include/StringUtils.hpp" #include "../include/Gif.hpp" #include <SFML/Graphics/RectangleShape.hpp> +#include <dchat/Process.hpp> #include <cassert> namespace dchat @@ -22,23 +22,25 @@ namespace dchat void ImagePreview::preview(sf::Texture *texture, const std::string &url) { - if(texture == getInstance()->texture) return; - getInstance()->texture = texture; - getInstance()->contentType = texture ? ContentType::TEXTURE : ContentType::NONE; + ImagePreview *instance = getInstance(); + if(texture == instance->texture) return; + instance->texture = texture; + instance->contentType = texture ? ContentType::TEXTURE : ContentType::NONE; imagePreviewUrl = url; if(texture) - getInstance()->sprite.setTexture(*texture, true); + instance->sprite.setTexture(*texture, true); else - getInstance()->sprite = sf::Sprite(); + instance->sprite = sf::Sprite(); } void ImagePreview::preview(Gif *gif, const std::string &url) { - if(gif == getInstance()->gif) return; - getInstance()->gif = gif; - getInstance()->contentType = gif ? ContentType::GIF : ContentType::NONE; + ImagePreview *instance = getInstance(); + if(gif == instance->gif) return; + instance->gif = gif; + instance->contentType = gif ? ContentType::GIF : ContentType::NONE; imagePreviewUrl = url; - getInstance()->sprite = sf::Sprite(); + instance->sprite = sf::Sprite(); } void* ImagePreview::getPreviewContentPtr() @@ -53,22 +55,14 @@ namespace dchat void ImagePreview::processEvent(const sf::Event &event) { - if(getInstance()->contentType == ContentType::NONE) return; + ImagePreview *instance = getInstance(); + if(instance->contentType == ContentType::NONE) return; if(event.mouseButton.button == sf::Mouse::Button::Left) { - sf::Vector2f imagePos; - switch(getInstance()->contentType) - { - case ContentType::TEXTURE: - imagePos = getInstance()->sprite.getPosition(); - break; - case ContentType::GIF: - imagePos = getInstance()->gif->getPosition(); - break; - } - getInstance()->sprite.getPosition(); - const auto &imageSize = getInstance()->size; + const auto &imagePos = instance->position; + const auto &imageSize = instance->size; + bool mouseInside = false; if(event.mouseButton.x >= imagePos.x && event.mouseButton.x <= imagePos.x + imageSize.x && event.mouseButton.y >= imagePos.y && event.mouseButton.y <= imagePos.y + imageSize.y) @@ -79,10 +73,8 @@ namespace dchat if(event.type == sf::Event::MouseButtonPressed && mouseInside && !imagePreviewUrl.empty()) { // TODO: Implement for other platforms than linux - std::string escapedUrl = stringReplaceChar(imagePreviewUrl, "'", ""); - escapedUrl = stringReplaceChar(escapedUrl, "\\", ""); std::string cmd = "xdg-open '"; - cmd += escapedUrl; + cmd += escapeCommand(imagePreviewUrl); cmd += "'"; printf("Clicked on web page preview, opening web page by running command: %s\n", cmd.c_str()); system(cmd.c_str()); @@ -100,36 +92,43 @@ namespace dchat void ImagePreview::draw(sf::RenderWindow &window) { - if(getInstance()->contentType == ContentType::NONE) return; + ImagePreview *instance = getInstance(); + if(instance->contentType == ContentType::NONE) return; auto windowSize = window.getSize(); sf::RectangleShape background(sf::Vector2f(windowSize.x, windowSize.y)); background.setFillColor(sf::Color(0, 0, 0, 200)); - auto imageSize = getInstance()->calculateImageSize(windowSize); - getInstance()->size = imageSize; + auto imageSize = instance->calculateImageSize(windowSize); + instance->size = imageSize; window.draw(background); - switch(getInstance()->contentType) + switch(instance->contentType) { case ContentType::TEXTURE: { - auto textureSize = getInstance()->sprite.getTexture()->getSize(); - getInstance()->sprite.setPosition(windowSize.x / 2 - imageSize.x / 2, windowSize.y / 2 - imageSize.y / 2); - getInstance()->sprite.setScale((double)imageSize.x / (double)textureSize.x, (double)imageSize.y / (double)textureSize.y); - window.draw(getInstance()->sprite); + auto textureSize = instance->sprite.getTexture()->getSize(); + instance->position = sf::Vector2f(windowSize.x / 2 - imageSize.x / 2, windowSize.y / 2 - imageSize.y / 2); + instance->sprite.setPosition(instance->position); + instance->sprite.setScale((double)imageSize.x / (double)textureSize.x, (double)imageSize.y / (double)textureSize.y); + window.draw(instance->sprite); break; } case ContentType::GIF: { - auto textureSize = getInstance()->gif->getSize(); - getInstance()->gif->setPosition(sf::Vector2f(windowSize.x / 2 - imageSize.x / 2, windowSize.y / 2 - imageSize.y / 2)); - getInstance()->gif->setScale(sf::Vector2f((double)imageSize.x / (double)textureSize.x, (double)imageSize.y / (double)textureSize.y)); - getInstance()->gif->draw(window); + auto *gif = static_cast<SfmlGif*>(instance->gif); + gif->update(); + auto textureSize = gif->getSize(); + + instance->position = sf::Vector2f(windowSize.x / 2 - imageSize.x / 2, windowSize.y / 2 - imageSize.y / 2); + sf::Sprite sprite(gif->texture); + sprite.setPosition(instance->position); + sprite.setScale(sf::Vector2f((double)imageSize.x / (double)textureSize.x, (double)imageSize.y / (double)textureSize.y)); + window.draw(sprite); break; } } - getInstance()->lastSeenTimer.restart(); + instance->lastSeenTimer.restart(); } sf::Vector2u ImagePreview::calculateImageSize(sf::Vector2u windowSize) const @@ -143,7 +142,9 @@ namespace dchat textureSize = texture->getSize(); break; case ContentType::GIF: - textureSize = gif->getSize(); + auto size = gif->getSize(); + textureSize.x = size.x; + textureSize.y = size.y; break; } auto imageSize = textureSize; |