aboutsummaryrefslogtreecommitdiff
path: root/avatar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'avatar.cpp')
-rw-r--r--avatar.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/avatar.cpp b/avatar.cpp
new file mode 100644
index 00000000..f5101ddb
--- /dev/null
+++ b/avatar.cpp
@@ -0,0 +1,84 @@
+/******************************************************************************
+ * Copyright (C) 2017 Kitsune Ral <kitsune-ral@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avatar.h"
+
+#include "jobs/mediathumbnailjob.h"
+#include "events/eventcontent.h"
+#include "connection.h"
+
+using namespace QMatrixClient;
+
+QPixmap Avatar::get(int width, int height, Avatar::notifier_t notifier)
+{
+ QSize size(width, height);
+
+ // FIXME: Alternating between longer-width and longer-height requests
+ // is a sure way to trick the below code into constantly getting another
+ // image from the server because the existing one is alleged unsatisfactory.
+ // This is plain abuse by the client, though; so not critical for now.
+ if( ( !(_valid || _ongoingRequest)
+ || width > _requestedSize.width()
+ || height > _requestedSize.height() ) && _url.isValid() )
+ {
+ qCDebug(MAIN) << "Getting avatar from" << _url.toString();
+ _requestedSize = size;
+ if (_ongoingRequest)
+ _ongoingRequest->abandon();
+ notifiers.emplace_back(std::move(notifier));
+ _ongoingRequest = _connection->callApi<MediaThumbnailJob>(_url, size);
+ _ongoingRequest->connect( _ongoingRequest, &MediaThumbnailJob::finished,
+ _connection, [=]() {
+ if (_ongoingRequest->status().good())
+ {
+ _valid = true;
+ _originalPixmap = _ongoingRequest->scaledThumbnail(_requestedSize);
+ _scaledPixmaps.clear();
+ for (auto n: notifiers)
+ n();
+ }
+ _ongoingRequest = nullptr;
+ });
+ }
+
+ if( _originalPixmap.isNull() )
+ {
+ if (_defaultIcon.isNull())
+ return _originalPixmap;
+
+ _originalPixmap = _defaultIcon.pixmap(size);
+ }
+
+ for (auto p: _scaledPixmaps)
+ if (p.first == size)
+ return p.second;
+ auto pixmap = _originalPixmap.scaled(size,
+ Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ _scaledPixmaps.emplace_back(size, pixmap);
+ return pixmap;
+}
+
+bool Avatar::updateUrl(const QUrl& newUrl)
+{
+ if (newUrl == _url)
+ return false;
+
+ _url = newUrl;
+ _valid = false;
+ return true;
+}