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;
}
|