summary refs log tree commit diff
path: root/src/JdenticonProvider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/JdenticonProvider.cpp')
-rw-r--r--src/JdenticonProvider.cpp95
1 files changed, 57 insertions, 38 deletions
diff --git a/src/JdenticonProvider.cpp b/src/JdenticonProvider.cpp

index e421c932..f0360ad6 100644 --- a/src/JdenticonProvider.cpp +++ b/src/JdenticonProvider.cpp
@@ -19,6 +19,35 @@ #include "Utils.h" #include "jdenticoninterface.h" +namespace Jdenticon { +JdenticonInterface * +getJdenticonInterface() +{ + static JdenticonInterface *interface = nullptr; + static bool interfaceExists{true}; + + if (interface == nullptr && interfaceExists) { + QDir pluginsDir(qApp->applicationDirPath()); + + QPluginLoader pluginLoader("qtjdenticon"); + QObject *plugin = pluginLoader.instance(); + if (plugin) { + interface = qobject_cast<JdenticonInterface *>(plugin); + if (interface) { + nhlog::ui()->info("Loaded jdenticon plugin."); + } + } + + if (!interface) { + nhlog::ui()->info("jdenticon plugin not found."); + interfaceExists = false; + } + } + + return interface; +} +} + static QPixmap clipRadius(QPixmap img, double radius) { @@ -41,30 +70,43 @@ clipRadius(QPixmap img, double radius) JdenticonResponse::JdenticonResponse(const QString &key, bool crop, double radius, + const QSize &requestedSize, + QThreadPool *pool) +{ + auto runnable = new JdenticonRunnable(key, crop, radius, requestedSize); + connect(runnable, &JdenticonRunnable::done, this, &JdenticonResponse::handleDone); + pool->start(runnable); +} + +JdenticonRunnable::JdenticonRunnable(const QString &key, + bool crop, + double radius, const QSize &requestedSize) : m_key(key) , m_crop{crop} , m_radius{radius} , m_requestedSize(requestedSize.isValid() ? requestedSize : QSize(100, 100)) - , m_pixmap{m_requestedSize} - , jdenticonInterface_{Jdenticon::getJdenticonInterface()} -{ - setAutoDelete(false); -} +{} void -JdenticonResponse::run() +JdenticonRunnable::run() { - m_pixmap.fill(Qt::transparent); + QPixmap pixmap(m_requestedSize); + pixmap.fill(Qt::transparent); + + auto jdenticon = Jdenticon::getJdenticonInterface(); + if (!jdenticon) { + emit done(pixmap.toImage()); + return; + } QPainter painter; - painter.begin(&m_pixmap); + painter.begin(&pixmap); painter.setRenderHint(QPainter::Antialiasing, true); painter.setRenderHint(QPainter::SmoothPixmapTransform, true); try { - QSvgRenderer renderer{ - jdenticonInterface_->generate(m_key, m_requestedSize.width()).toUtf8()}; + QSvgRenderer renderer{jdenticon->generate(m_key, m_requestedSize.width()).toUtf8()}; renderer.render(&painter); } catch (std::exception &e) { nhlog::ui()->error( @@ -73,36 +115,13 @@ JdenticonResponse::run() painter.end(); - m_pixmap = clipRadius(m_pixmap, m_radius); + pixmap = clipRadius(pixmap, m_radius); - emit finished(); + emit done(pixmap.toImage()); } -namespace Jdenticon { -JdenticonInterface * -getJdenticonInterface() +bool +JdenticonProvider::isAvailable() { - static JdenticonInterface *interface = nullptr; - static bool interfaceExists{true}; - - if (interface == nullptr && interfaceExists) { - QDir pluginsDir(qApp->applicationDirPath()); - - QPluginLoader pluginLoader("qtjdenticon"); - QObject *plugin = pluginLoader.instance(); - if (plugin) { - interface = qobject_cast<JdenticonInterface *>(plugin); - if (interface) { - nhlog::ui()->info("Loaded jdenticon plugin."); - } - } - - if (!interface) { - nhlog::ui()->info("jdenticon plugin not found."); - interfaceExists = false; - } - } - - return interface; -} + return Jdenticon::getJdenticonInterface() != nullptr; }