From 18061f06002b349bdc0e5b439a84d54545b9c87e Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Fri, 11 May 2018 16:00:14 +0300 Subject: [PATCH] Use the correct avatar size for HiDPI displays --- include/CommunitiesListItem.h | 8 -------- include/Utils.h | 4 ++++ include/dialogs/RoomSettings.hpp | 17 ++--------------- src/CommunitiesListItem.cc | 7 +++++++ src/MatrixClient.cc | 6 +++--- src/RoomInfoListItem.cc | 3 +-- src/Utils.cc | 11 +++++++++++ src/dialogs/RoomSettings.cpp | 16 ++++++++++++++++ src/ui/Avatar.cc | 10 ++++------ 9 files changed, 48 insertions(+), 34 deletions(-) diff --git a/include/CommunitiesListItem.h b/include/CommunitiesListItem.h index 9309d334..6055d732 100644 --- a/include/CommunitiesListItem.h +++ b/include/CommunitiesListItem.h @@ -84,11 +84,3 @@ private: RippleOverlay *rippleOverlay_; }; - -inline void -CommunitiesListItem::setAvatar(const QImage &img) -{ - communityAvatar_ = QPixmap::fromImage( - img.scaled(IconSize, IconSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); - update(); -} diff --git a/include/Utils.h b/include/Utils.h index 6fea4962..ad8e2073 100644 --- a/include/Utils.h +++ b/include/Utils.h @@ -8,6 +8,7 @@ #include "timeline/widgets/VideoItem.h" #include +#include #include namespace utils { @@ -168,4 +169,7 @@ message_body(const mtx::events::collections::TimelineEvents &event) //! Calculate the Levenshtein distance between two strings with character skipping. int levenshtein_distance(const std::string &s1, const std::string &s2); + +QPixmap +scaleImageToPixmap(const QImage &img, int size); } diff --git a/include/dialogs/RoomSettings.hpp b/include/dialogs/RoomSettings.hpp index 2acbf4b1..df94fea3 100644 --- a/include/dialogs/RoomSettings.hpp +++ b/include/dialogs/RoomSettings.hpp @@ -22,21 +22,8 @@ class TopSection : public QWidget Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor) public: - TopSection(const RoomInfo &info, const QImage &img, QWidget *parent = nullptr) - : QWidget{parent} - , info_{std::move(info)} - { - textColor_ = palette().color(QPalette::Text); - avatar_ = QPixmap::fromImage(img.scaled( - AvatarSize, AvatarSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); - } - - QSize sizeHint() const override - { - QFont font; - font.setPixelSize(18); - return QSize(200, AvatarSize + QFontMetrics(font).ascent() + 6 * Padding); - } + TopSection(const RoomInfo &info, const QImage &img, QWidget *parent = nullptr); + QSize sizeHint() const override; QColor textColor() const { return textColor_; } void setTextColor(QColor &color) { textColor_ = color; } diff --git a/src/CommunitiesListItem.cc b/src/CommunitiesListItem.cc index 0650c0cf..e5127050 100644 --- a/src/CommunitiesListItem.cc +++ b/src/CommunitiesListItem.cc @@ -88,3 +88,10 @@ CommunitiesListItem::paintEvent(QPaintEvent *) p.restore(); } } + +void +CommunitiesListItem::setAvatar(const QImage &img) +{ + communityAvatar_ = utils::scaleImageToPixmap(img, IconSize); + update(); +} diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc index 6336a5cf..a9720d10 100644 --- a/src/MatrixClient.cc +++ b/src/MatrixClient.cc @@ -59,6 +59,8 @@ MatrixClient::MatrixClient(QObject *parent) , mediaApiUrl_{"/_matrix/media/r0"} , serverProtocol_{"https"} { + qRegisterMetaType(); + QSettings settings; txn_id_ = settings.value("client/transaction_id", 1).toInt(); @@ -344,8 +346,7 @@ MatrixClient::sync() noexcept } try { - mtx::responses::Sync response = nlohmann::json::parse(data); - emit syncCompleted(response); + emit syncCompleted(nlohmann::json::parse(std::move(data))); } catch (std::exception &e) { qWarning() << "Sync error: " << e.what(); } @@ -461,7 +462,6 @@ MatrixClient::initialSync() noexcept return; } - qRegisterMetaType(); QtConcurrent::run([data = reply->readAll(), this]() { try { emit initialSyncCompleted(nlohmann::json::parse(std::move(data))); diff --git a/src/RoomInfoListItem.cc b/src/RoomInfoListItem.cc index a10ad619..f6f2e532 100644 --- a/src/RoomInfoListItem.cc +++ b/src/RoomInfoListItem.cc @@ -368,8 +368,7 @@ RoomInfoListItem::mousePressEvent(QMouseEvent *event) void RoomInfoListItem::setAvatar(const QImage &img) { - roomAvatar_ = QPixmap::fromImage( - img.scaled(IconSize, IconSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + roomAvatar_ = utils::scaleImageToPixmap(img, IconSize); update(); } diff --git a/src/Utils.cc b/src/Utils.cc index 14620145..f2e4b381 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -1,5 +1,8 @@ #include "Utils.h" +#include +#include + #include using TimelineEvent = mtx::events::collections::TimelineEvents; @@ -138,3 +141,11 @@ utils::event_body(const mtx::events::collections::TimelineEvents &event) return QString(); } + +QPixmap +utils::scaleImageToPixmap(const QImage &img, int size) +{ + const int sz = QApplication::desktop()->screen()->devicePixelRatio() * size; + return QPixmap::fromImage( + img.scaled(sz, sz, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); +} diff --git a/src/dialogs/RoomSettings.cpp b/src/dialogs/RoomSettings.cpp index 976d2acc..b85971b0 100644 --- a/src/dialogs/RoomSettings.cpp +++ b/src/dialogs/RoomSettings.cpp @@ -15,6 +15,22 @@ using namespace dialogs; +TopSection::TopSection(const RoomInfo &info, const QImage &img, QWidget *parent) + : QWidget{parent} + , info_{std::move(info)} +{ + textColor_ = palette().color(QPalette::Text); + avatar_ = utils::scaleImageToPixmap(img, AvatarSize); +} + +QSize +TopSection::sizeHint() const +{ + QFont font; + font.setPixelSize(18); + return QSize(200, AvatarSize + QFontMetrics(font).ascent() + 6 * Padding); +} + RoomSettings::RoomSettings(const QString &room_id, QWidget *parent) : QFrame(parent) , room_id_{std::move(room_id)} diff --git a/src/ui/Avatar.cc b/src/ui/Avatar.cc index 81e6cbed..2f10db39 100644 --- a/src/ui/Avatar.cc +++ b/src/ui/Avatar.cc @@ -1,6 +1,7 @@ #include #include "Avatar.h" +#include "Utils.h" Avatar::Avatar(QWidget *parent) : QWidget(parent) @@ -64,10 +65,8 @@ Avatar::setSize(int size) { size_ = size; - if (!image_.isNull()) { - pixmap_ = QPixmap::fromImage( - image_.scaled(size_, size_, Qt::KeepAspectRatio, Qt::SmoothTransformation)); - } + if (!image_.isNull()) + pixmap_ = utils::scaleImageToPixmap(image_, size_); QFont _font(font()); _font.setPointSizeF(size_ * (ui::FontSize) / 40); @@ -89,8 +88,7 @@ Avatar::setImage(const QImage &image) { image_ = image; type_ = ui::AvatarType::Image; - pixmap_ = QPixmap::fromImage( - image_.scaled(size_, size_, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + pixmap_ = utils::scaleImageToPixmap(image_, size_); update(); }