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