From 52056a79fa94117ce0fc8f388458ceb48cc3be54 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 26 Aug 2019 01:24:56 +0200 Subject: [PATCH 1/4] Try to reduce memory usage by reusing avatar pixmaps --- src/AvatarProvider.cpp | 55 ++++++++++++++++++++++++----- src/AvatarProvider.h | 12 +++++-- src/Cache.cpp | 5 +-- src/Cache.h | 1 - src/ChatPage.cpp | 38 +++----------------- src/ChatPage.h | 4 +-- src/Logging.cpp | 2 ++ src/Logging.h | 2 ++ src/RoomInfoListItem.cpp | 9 +++-- src/RoomInfoListItem.h | 2 +- src/RoomList.cpp | 39 ++------------------ src/RoomList.h | 6 ++-- src/TopRoomBar.cpp | 5 ++- src/TopRoomBar.h | 2 +- src/UserInfoWidget.cpp | 19 +++++----- src/UserInfoWidget.h | 2 +- src/dialogs/MemberList.cpp | 12 ++----- src/dialogs/ReadReceipts.cpp | 8 ++--- src/dialogs/RoomSettings.cpp | 17 +++++---- src/dialogs/RoomSettings.h | 4 +-- src/dialogs/UserProfile.cpp | 6 ++-- src/popups/PopupItem.cpp | 26 +++----------- src/timeline/.TimelineItem.cpp.swp | Bin 0 -> 114688 bytes src/timeline/TimelineItem.cpp | 22 +++++------- src/timeline/TimelineItem.h | 8 ++--- src/ui/Avatar.cpp | 41 ++++++++++----------- src/ui/Avatar.h | 10 +++--- 27 files changed, 149 insertions(+), 208 deletions(-) create mode 100644 src/timeline/.TimelineItem.cpp.swp diff --git a/src/AvatarProvider.cpp b/src/AvatarProvider.cpp index 57b61c75..277a4030 100644 --- a/src/AvatarProvider.cpp +++ b/src/AvatarProvider.cpp @@ -16,30 +16,44 @@ */ #include +#include #include +#include #include "AvatarProvider.h" #include "Cache.h" #include "Logging.h" #include "MatrixClient.h" +static QPixmapCache avatar_cache; + namespace AvatarProvider { - void -resolve(const QString &room_id, const QString &user_id, QObject *receiver, AvatarCallback callback) +resolve(const QString &avatarUrl, int size, QObject *receiver, AvatarCallback callback) { - const auto key = QString("%1 %2").arg(room_id).arg(user_id); - const auto avatarUrl = Cache::avatarUrl(room_id, user_id); + avatar_cache.setCacheLimit(1024 * 1024); - if (!Cache::AvatarUrls.contains(key) || !cache::client()) + const auto cacheKey = avatarUrl + "_size_" + size; + + if (!cache::client()) return; if (avatarUrl.isEmpty()) return; + QPixmap pixmap; + if (avatar_cache.find(cacheKey, pixmap)) { + nhlog::net()->info("cached pixmap {}", avatarUrl.toStdString()); + callback(pixmap); + return; + } + auto data = cache::client()->image(avatarUrl); if (!data.isNull()) { - callback(QImage::fromData(data)); + pixmap.loadFromData(data); + avatar_cache.insert(cacheKey, pixmap); + nhlog::net()->info("loaded pixmap from disk cache {}", avatarUrl.toStdString()); + callback(pixmap); return; } @@ -47,7 +61,12 @@ resolve(const QString &room_id, const QString &user_id, QObject *receiver, Avata QObject::connect(proxy.get(), &AvatarProxy::avatarDownloaded, receiver, - [callback](const QByteArray &data) { callback(QImage::fromData(data)); }); + [callback, cacheKey](const QByteArray &data) { + QPixmap pm; + pm.loadFromData(data); + avatar_cache.insert(cacheKey, pm); + callback(pm); + }); mtx::http::ThumbOpts opts; opts.width = 256; @@ -67,8 +86,26 @@ resolve(const QString &room_id, const QString &user_id, QObject *receiver, Avata cache::client()->saveImage(opts.mxc_url, res); - auto data = QByteArray(res.data(), res.size()); - emit proxy->avatarDownloaded(data); + nhlog::net()->info("downloaded pixmap {}", opts.mxc_url); + + emit proxy->avatarDownloaded(QByteArray(res.data(), res.size())); }); } + +void +resolve(const QString &room_id, + const QString &user_id, + int size, + QObject *receiver, + AvatarCallback callback) +{ + const auto key = QString("%1 %2").arg(room_id).arg(user_id); + const auto avatarUrl = Cache::avatarUrl(room_id, user_id); + const auto cacheKey = avatarUrl + "_size_" + size; + + if (!Cache::AvatarUrls.contains(key) || !cache::client()) + return; + + resolve(avatarUrl, size, receiver, callback); +} } diff --git a/src/AvatarProvider.h b/src/AvatarProvider.h index 4b4e15e9..47ed028e 100644 --- a/src/AvatarProvider.h +++ b/src/AvatarProvider.h @@ -17,7 +17,7 @@ #pragma once -#include +#include #include class AvatarProxy : public QObject @@ -28,9 +28,15 @@ signals: void avatarDownloaded(const QByteArray &data); }; -using AvatarCallback = std::function; +using AvatarCallback = std::function; namespace AvatarProvider { void -resolve(const QString &room_id, const QString &user_id, QObject *receiver, AvatarCallback cb); +resolve(const QString &avatarUrl, int size, QObject *receiver, AvatarCallback cb); +void +resolve(const QString &room_id, + const QString &user_id, + int size, + QObject *receiver, + AvatarCallback cb); } diff --git a/src/Cache.cpp b/src/Cache.cpp index ef0f951e..083dbe89 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -1830,10 +1830,7 @@ Cache::searchRooms(const std::string &query, std::uint8_t max_items) std::vector results; for (auto it = items.begin(); it != end; it++) { - results.push_back( - RoomSearchResult{it->second.first, - it->second.second, - QImage::fromData(image(txn, it->second.second.avatar_url))}); + results.push_back(RoomSearchResult{it->second.first, it->second.second}); } txn.commit(); diff --git a/src/Cache.h b/src/Cache.h index 302bb65b..0da49793 100644 --- a/src/Cache.h +++ b/src/Cache.h @@ -153,7 +153,6 @@ struct RoomSearchResult { std::string room_id; RoomInfo info; - QImage img; }; Q_DECLARE_METATYPE(RoomSearchResult) diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 2ed64b6b..21ded4b3 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -774,12 +774,12 @@ ChatPage::bootstrap(QString userid, QString homeserver, QString token) } void -ChatPage::updateTopBarAvatar(const QString &roomid, const QPixmap &img) +ChatPage::updateTopBarAvatar(const QString &roomid, const QString &img) { if (current_room_ != roomid) return; - top_bar_->updateRoomAvatar(img.toImage()); + top_bar_->updateRoomAvatar(img); } void @@ -807,7 +807,7 @@ ChatPage::changeTopRoomInfo(const QString &room_id) if (img.isNull()) top_bar_->updateRoomAvatarFromName(name); else - top_bar_->updateRoomAvatar(img); + top_bar_->updateRoomAvatar(avatar_url); } catch (const lmdb::error &e) { nhlog::ui()->error("failed to change top bar room info: {}", e.what()); @@ -1337,37 +1337,7 @@ ChatPage::getProfileInfo() emit setUserDisplayName(QString::fromStdString(res.display_name)); - if (cache::client()) { - auto data = cache::client()->image(res.avatar_url); - if (!data.isNull()) { - emit setUserAvatar(QImage::fromData(data)); - return; - } - } - - if (res.avatar_url.empty()) - return; - - http::client()->download( - res.avatar_url, - [this, res](const std::string &data, - const std::string &, - const std::string &, - mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn( - "failed to download user avatar: {} - {}", - mtx::errors::to_string(err->matrix_error.errcode), - err->matrix_error.error); - return; - } - - if (cache::client()) - cache::client()->saveImage(res.avatar_url, data); - - emit setUserAvatar( - QImage::fromData(QByteArray(data.data(), data.size()))); - }); + emit setUserAvatar(QString::fromStdString(res.avatar_url)); }); http::client()->joined_groups( diff --git a/src/ChatPage.h b/src/ChatPage.h index 189af387..e41ae1ae 100644 --- a/src/ChatPage.h +++ b/src/ChatPage.h @@ -129,7 +129,7 @@ signals: void ownProfileOk(); void setUserDisplayName(const QString &name); - void setUserAvatar(const QImage &avatar); + void setUserAvatar(const QString &avatar); void loggedOut(); void trySyncCb(); @@ -159,7 +159,7 @@ signals: private slots: void showUnreadMessageNotification(int count); - void updateTopBarAvatar(const QString &roomid, const QPixmap &img); + void updateTopBarAvatar(const QString &roomid, const QString &img); void changeTopRoomInfo(const QString &room_id); void logout(); void removeRoom(const QString &room_id); diff --git a/src/Logging.cpp b/src/Logging.cpp index 686274d8..32287582 100644 --- a/src/Logging.cpp +++ b/src/Logging.cpp @@ -16,6 +16,8 @@ constexpr auto MAX_LOG_FILES = 3; } namespace nhlog { +bool enable_debug_log_from_commandline = false; + void init(const std::string &file_path) { diff --git a/src/Logging.h b/src/Logging.h index 2feae60d..e54f3c3f 100644 --- a/src/Logging.h +++ b/src/Logging.h @@ -18,4 +18,6 @@ db(); std::shared_ptr crypto(); + +extern bool enable_debug_log_from_commandline; } diff --git a/src/RoomInfoListItem.cpp b/src/RoomInfoListItem.cpp index 9bcce134..dbcd6806 100644 --- a/src/RoomInfoListItem.cpp +++ b/src/RoomInfoListItem.cpp @@ -21,6 +21,7 @@ #include #include +#include "AvatarProvider.h" #include "Cache.h" #include "Config.h" #include "RoomInfoListItem.h" @@ -434,10 +435,12 @@ RoomInfoListItem::mousePressEvent(QMouseEvent *event) } void -RoomInfoListItem::setAvatar(const QImage &img) +RoomInfoListItem::setAvatar(const QString &avatar_url) { - roomAvatar_ = utils::scaleImageToPixmap(img, IconSize); - update(); + AvatarProvider::resolve(avatar_url, IconSize, this, [this](const QPixmap &img) { + roomAvatar_ = img; + update(); + }); } void diff --git a/src/RoomInfoListItem.h b/src/RoomInfoListItem.h index 40c938c1..54e02a76 100644 --- a/src/RoomInfoListItem.h +++ b/src/RoomInfoListItem.h @@ -73,7 +73,7 @@ public: bool isPressed() const { return isPressed_; } int unreadMessageCount() const { return unreadMsgCount_; } - void setAvatar(const QImage &avatar_image); + void setAvatar(const QString &avatar_url); void setDescriptionMessage(const DescInfo &info); DescInfo lastMessageInfo() const { return lastMsgInfo_; } diff --git a/src/RoomList.cpp b/src/RoomList.cpp index 1abf3533..c5e05621 100644 --- a/src/RoomList.cpp +++ b/src/RoomList.cpp @@ -89,40 +89,7 @@ RoomList::updateAvatar(const QString &room_id, const QString &url) if (url.isEmpty()) return; - QByteArray savedImgData; - - if (cache::client()) - savedImgData = cache::client()->image(url); - - if (savedImgData.isEmpty()) { - mtx::http::ThumbOpts opts; - opts.mxc_url = url.toStdString(); - http::client()->get_thumbnail( - opts, [room_id, opts, this](const std::string &res, mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn( - "failed to download room avatar: {} {} {}", - opts.mxc_url, - mtx::errors::to_string(err->matrix_error.errcode), - err->matrix_error.error); - return; - } - - if (cache::client()) - cache::client()->saveImage(opts.mxc_url, res); - - auto data = QByteArray(res.data(), res.size()); - QPixmap pixmap; - pixmap.loadFromData(data); - - emit updateRoomAvatarCb(room_id, pixmap); - }); - } else { - QPixmap img; - img.loadFromData(savedImgData); - - updateRoomAvatar(room_id, img); - } + emit updateRoomAvatarCb(room_id, url); } void @@ -252,7 +219,7 @@ RoomList::highlightSelectedRoom(const QString &room_id) } void -RoomList::updateRoomAvatar(const QString &roomid, const QPixmap &img) +RoomList::updateRoomAvatar(const QString &roomid, const QString &img) { if (!roomExists(roomid)) { nhlog::ui()->warn("avatar update on non-existent room_id: {}", @@ -260,7 +227,7 @@ RoomList::updateRoomAvatar(const QString &roomid, const QPixmap &img) return; } - rooms_[roomid]->setAvatar(img.toImage()); + rooms_[roomid]->setAvatar(img); // Used to inform other widgets for the new image data. emit roomAvatarChanged(roomid, img); diff --git a/src/RoomList.h b/src/RoomList.h index 155a969c..95fc0d9b 100644 --- a/src/RoomList.h +++ b/src/RoomList.h @@ -61,12 +61,12 @@ signals: void totalUnreadMessageCountUpdated(int count); void acceptInvite(const QString &room_id); void declineInvite(const QString &room_id); - void roomAvatarChanged(const QString &room_id, const QPixmap &img); + void roomAvatarChanged(const QString &room_id, const QString &img); void joinRoom(const QString &room_id); - void updateRoomAvatarCb(const QString &room_id, const QPixmap &img); + void updateRoomAvatarCb(const QString &room_id, const QString &img); public slots: - void updateRoomAvatar(const QString &roomid, const QPixmap &img); + void updateRoomAvatar(const QString &roomid, const QString &img); void highlightSelectedRoom(const QString &room_id); void updateUnreadMessageCount(const QString &roomid, int count, int highlightedCount); void updateRoomDescription(const QString &roomid, const DescInfo &info); diff --git a/src/TopRoomBar.cpp b/src/TopRoomBar.cpp index a8049e3a..712fe9aa 100644 --- a/src/TopRoomBar.cpp +++ b/src/TopRoomBar.cpp @@ -46,9 +46,8 @@ TopRoomBar::TopRoomBar(QWidget *parent) topLayout_->setContentsMargins( 2 * widgetMargin, widgetMargin, 2 * widgetMargin, widgetMargin); - avatar_ = new Avatar(this); + avatar_ = new Avatar(this, fontHeight * 2); avatar_->setLetter(""); - avatar_->setSize(fontHeight * 2); textLayout_ = new QVBoxLayout(); textLayout_->setSpacing(0); @@ -183,7 +182,7 @@ TopRoomBar::reset() } void -TopRoomBar::updateRoomAvatar(const QImage &avatar_image) +TopRoomBar::updateRoomAvatar(const QString &avatar_image) { avatar_->setImage(avatar_image); update(); diff --git a/src/TopRoomBar.h b/src/TopRoomBar.h index 5f2c936e..3243064e 100644 --- a/src/TopRoomBar.h +++ b/src/TopRoomBar.h @@ -44,7 +44,7 @@ class TopRoomBar : public QWidget public: TopRoomBar(QWidget *parent = 0); - void updateRoomAvatar(const QImage &avatar_image); + void updateRoomAvatar(const QString &avatar_image); void updateRoomAvatar(const QIcon &icon); void updateRoomName(const QString &name); void updateRoomTopic(QString topic); diff --git a/src/UserInfoWidget.cpp b/src/UserInfoWidget.cpp index 5345fb2a..19d7478e 100644 --- a/src/UserInfoWidget.cpp +++ b/src/UserInfoWidget.cpp @@ -52,10 +52,9 @@ UserInfoWidget::UserInfoWidget(QWidget *parent) textLayout_->setSpacing(widgetMargin / 2); textLayout_->setContentsMargins(widgetMargin * 2, widgetMargin, widgetMargin, widgetMargin); - userAvatar_ = new Avatar(this); + userAvatar_ = new Avatar(this, fontHeight * 2.5); userAvatar_->setObjectName("userAvatar"); userAvatar_->setLetter(QChar('?')); - userAvatar_->setSize(fontHeight * 2.5); QFont nameFont; nameFont.setPointSizeF(nameFont.pointSizeF() * 1.1); @@ -134,14 +133,6 @@ UserInfoWidget::reset() userAvatar_->setLetter(QChar('?')); } -void -UserInfoWidget::setAvatar(const QImage &img) -{ - avatar_image_ = img; - userAvatar_->setImage(img); - update(); -} - void UserInfoWidget::setDisplayName(const QString &name) { @@ -160,6 +151,14 @@ UserInfoWidget::setUserId(const QString &userid) { user_id_ = userid; userIdLabel_->setText(userid); + update(); +} + +void +UserInfoWidget::setAvatar(const QString &url) +{ + userAvatar_->setImage(url); + update(); } void diff --git a/src/UserInfoWidget.h b/src/UserInfoWidget.h index 65de7be9..263dd0c2 100644 --- a/src/UserInfoWidget.h +++ b/src/UserInfoWidget.h @@ -33,9 +33,9 @@ class UserInfoWidget : public QWidget public: UserInfoWidget(QWidget *parent = 0); - void setAvatar(const QImage &img); void setDisplayName(const QString &name); void setUserId(const QString &userid); + void setAvatar(const QString &url); void reset(); diff --git a/src/dialogs/MemberList.cpp b/src/dialogs/MemberList.cpp index 88a95403..9e973efa 100644 --- a/src/dialogs/MemberList.cpp +++ b/src/dialogs/MemberList.cpp @@ -9,7 +9,6 @@ #include "dialogs/MemberList.h" -#include "AvatarProvider.h" #include "Cache.h" #include "ChatPage.h" #include "Config.h" @@ -28,17 +27,10 @@ MemberItem::MemberItem(const RoomMember &member, QWidget *parent) textLayout_->setMargin(0); textLayout_->setSpacing(0); - avatar_ = new Avatar(this); - avatar_->setSize(44); + avatar_ = new Avatar(this, 44); avatar_->setLetter(utils::firstChar(member.display_name)); - if (!member.avatar.isNull()) - avatar_->setImage(member.avatar); - else - AvatarProvider::resolve(ChatPage::instance()->currentRoom(), - member.user_id, - this, - [this](const QImage &img) { avatar_->setImage(img); }); + avatar_->setImage(ChatPage::instance()->currentRoom(), member.user_id); QFont nameFont; nameFont.setPointSizeF(nameFont.pointSizeF() * 1.1); diff --git a/src/dialogs/ReadReceipts.cpp b/src/dialogs/ReadReceipts.cpp index 5a0d98c7..58ad59c3 100644 --- a/src/dialogs/ReadReceipts.cpp +++ b/src/dialogs/ReadReceipts.cpp @@ -37,8 +37,7 @@ ReceiptItem::ReceiptItem(QWidget *parent, auto displayName = Cache::displayName(room_id, user_id); - avatar_ = new Avatar(this); - avatar_->setSize(44); + avatar_ = new Avatar(this, 44); avatar_->setLetter(utils::firstChar(displayName)); // If it's a matrix id we use the second letter. @@ -56,10 +55,7 @@ ReceiptItem::ReceiptItem(QWidget *parent, topLayout_->addWidget(avatar_); topLayout_->addLayout(textLayout_, 1); - AvatarProvider::resolve(ChatPage::instance()->currentRoom(), - user_id, - this, - [this](const QImage &img) { avatar_->setImage(img); }); + avatar_->setImage(ChatPage::instance()->currentRoom(), user_id); } void diff --git a/src/dialogs/RoomSettings.cpp b/src/dialogs/RoomSettings.cpp index 1fe5904b..00b034cc 100644 --- a/src/dialogs/RoomSettings.cpp +++ b/src/dialogs/RoomSettings.cpp @@ -350,12 +350,12 @@ RoomSettings::RoomSettings(const QString &room_id, QWidget *parent) keyRequestsToggle_->hide(); } - avatar_ = new Avatar(this); - avatar_->setSize(128); + avatar_ = new Avatar(this, 128); if (avatarImg_.isNull()) avatar_->setLetter(utils::firstChar(QString::fromStdString(info_.name))); else - avatar_->setImage(avatarImg_); + avatar_->setImage(room_id_, + QString::fromStdString(http::client()->user_id().to_string())); if (canChangeAvatar(room_id_.toStdString(), utils::localUser().toStdString())) { auto filter = new ClickableFilter(this); @@ -487,7 +487,7 @@ RoomSettings::retrieveRoomInfo() try { usesEncryption_ = cache::client()->isRoomEncrypted(room_id_.toStdString()); info_ = cache::client()->singleRoomInfo(room_id_.toStdString()); - setAvatar(QImage::fromData(cache::client()->image(info_.avatar_url))); + setAvatar(); } catch (const lmdb::error &e) { nhlog::db()->warn("failed to retrieve room info from cache: {}", room_id_.toStdString()); @@ -633,14 +633,13 @@ RoomSettings::displayErrorMessage(const QString &msg) } void -RoomSettings::setAvatar(const QImage &img) +RoomSettings::setAvatar() { stopLoadingSpinner(); - avatarImg_ = img; - if (avatar_) - avatar_->setImage(img); + avatar_->setImage(room_id_, + QString::fromStdString(http::client()->user_id().to_string())); } void @@ -733,7 +732,7 @@ RoomSettings::updateAvatar() return; } - emit proxy->avatarChanged(QImage::fromData(content)); + emit proxy->avatarChanged(); }); }); } diff --git a/src/dialogs/RoomSettings.h b/src/dialogs/RoomSettings.h index 6667b68b..e1807ba1 100644 --- a/src/dialogs/RoomSettings.h +++ b/src/dialogs/RoomSettings.h @@ -52,7 +52,7 @@ class ThreadProxy : public QObject signals: void error(const QString &msg); - void avatarChanged(const QImage &img); + void avatarChanged(); void nameEventSent(const QString &); void topicEventSent(); }; @@ -140,7 +140,7 @@ private: void resetErrorLabel(); void displayErrorMessage(const QString &msg); - void setAvatar(const QImage &img); + void setAvatar(); void setupEditButton(); //! Retrieve the current room information from cache. void retrieveRoomInfo(); diff --git a/src/dialogs/UserProfile.cpp b/src/dialogs/UserProfile.cpp index 6aea96a8..5ad3afa2 100644 --- a/src/dialogs/UserProfile.cpp +++ b/src/dialogs/UserProfile.cpp @@ -114,9 +114,8 @@ UserProfile::UserProfile(QWidget *parent) btnLayout->setSpacing(8); btnLayout->setMargin(0); - avatar_ = new Avatar(this); + avatar_ = new Avatar(this, 128); avatar_->setLetter("X"); - avatar_->setSize(128); QFont font; font.setPointSizeF(font.pointSizeF() * 2); @@ -210,8 +209,7 @@ UserProfile::init(const QString &userId, const QString &roomId) displayNameLabel_->setText(displayName); avatar_->setLetter(utils::firstChar(displayName)); - AvatarProvider::resolve( - roomId, userId, this, [this](const QImage &img) { avatar_->setImage(img); }); + avatar_->setImage(roomId, userId); auto localUser = utils::localUser(); diff --git a/src/popups/PopupItem.cpp b/src/popups/PopupItem.cpp index f905983a..c4d4327f 100644 --- a/src/popups/PopupItem.cpp +++ b/src/popups/PopupItem.cpp @@ -11,7 +11,7 @@ constexpr int PopupItemMargin = 3; PopupItem::PopupItem(QWidget *parent) : QWidget(parent) - , avatar_{new Avatar(this)} + , avatar_{new Avatar(this, conf::popup::avatar)} , hovering_{false} { setMouseTracking(true); @@ -40,7 +40,6 @@ UserItem::UserItem(QWidget *parent) : PopupItem(parent) { userName_ = new QLabel("Placeholder", this); - avatar_->setSize(conf::popup::avatar); avatar_->setLetter("P"); topLayout_->addWidget(avatar_); topLayout_->addWidget(userName_, 1); @@ -52,7 +51,6 @@ UserItem::UserItem(QWidget *parent, const QString &user_id) { auto displayName = Cache::displayName(ChatPage::instance()->currentRoom(), userId_); - avatar_->setSize(conf::popup::avatar); avatar_->setLetter(utils::firstChar(displayName)); // If it's a matrix id we use the second letter. @@ -87,16 +85,7 @@ UserItem::updateItem(const QString &user_id) void UserItem::resolveAvatar(const QString &user_id) { - AvatarProvider::resolve( - ChatPage::instance()->currentRoom(), userId_, this, [this, user_id](const QImage &img) { - // The user on the widget when the avatar is resolved, - // might be different from the user that made the call. - if (user_id == userId_) - avatar_->setImage(img); - else - // We try to resolve the avatar again. - resolveAvatar(userId_); - }); + avatar_->setImage(ChatPage::instance()->currentRoom(), user_id); } void @@ -116,7 +105,6 @@ RoomItem::RoomItem(QWidget *parent, const RoomSearchResult &res) auto name = QFontMetrics(QFont()).elidedText( QString::fromStdString(res.info.name), Qt::ElideRight, parentWidget()->width() - 10); - avatar_->setSize(conf::popup::avatar + 6); avatar_->setLetter(utils::firstChar(name)); roomName_ = new QLabel(name, this); @@ -125,8 +113,7 @@ RoomItem::RoomItem(QWidget *parent, const RoomSearchResult &res) topLayout_->addWidget(avatar_); topLayout_->addWidget(roomName_, 1); - if (!res.img.isNull()) - avatar_->setImage(res.img); + avatar_->setImage(QString::fromStdString(res.info.avatar_url)); } void @@ -141,10 +128,7 @@ RoomItem::updateItem(const RoomSearchResult &result) roomName_->setText(name); - if (!result.img.isNull()) - avatar_->setImage(result.img); - else - avatar_->setLetter(utils::firstChar(name)); + avatar_->setImage(QString::fromStdString(result.info.avatar_url)); } void @@ -154,4 +138,4 @@ RoomItem::mousePressEvent(QMouseEvent *event) emit clicked(selectedText()); QWidget::mousePressEvent(event); -} \ No newline at end of file +} diff --git a/src/timeline/.TimelineItem.cpp.swp b/src/timeline/.TimelineItem.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..75e03aebe8a2b20a05aec339ab9cab819ed7fe2e GIT binary patch literal 114688 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 generateBody(sender, displayName, formatted_body); setupAvatarLayout(displayName); - AvatarProvider::resolve( - room_id_, sender, this, [this](const QImage &img) { setUserAvatar(img); }); + setUserAvatar(sender); } else { generateBody(formatted_body); setupSimpleLayout(); @@ -607,8 +604,7 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent generateBody(sender, displayName, formatted_body); setupAvatarLayout(displayName); - AvatarProvider::resolve( - room_id_, sender, this, [this](const QImage &img) { setUserAvatar(img); }); + setUserAvatar(sender); } else { generateBody(formatted_body); setupSimpleLayout(); @@ -793,9 +789,8 @@ TimelineItem::setupAvatarLayout(const QString &userName) QFont f; f.setPointSizeF(f.pointSizeF()); - userAvatar_ = new Avatar(this); + userAvatar_ = new Avatar(this, QFontMetrics(f).height() * 2); userAvatar_->setLetter(QChar(userName[0]).toUpper()); - userAvatar_->setSize(QFontMetrics(f).height() * 2); // TODO: The provided user name should be a UserId class if (userName[0] == '@' && userName.size() > 1) @@ -822,12 +817,12 @@ TimelineItem::setupSimpleLayout() } void -TimelineItem::setUserAvatar(const QImage &avatar) +TimelineItem::setUserAvatar(const QString &userid) { if (userAvatar_ == nullptr) return; - userAvatar_->setImage(avatar); + userAvatar_->setImage(room_id_, userid); } void @@ -911,8 +906,7 @@ TimelineItem::addAvatar() setupAvatarLayout(displayName); - AvatarProvider::resolve( - room_id_, userid, this, [this](const QImage &img) { setUserAvatar(img); }); + setUserAvatar(userid); } void diff --git a/src/timeline/TimelineItem.h b/src/timeline/TimelineItem.h index fe354000..356976e5 100644 --- a/src/timeline/TimelineItem.h +++ b/src/timeline/TimelineItem.h @@ -215,7 +215,7 @@ public: void setBackgroundColor(const QColor &color) { backgroundColor_ = color; } QColor backgroundColor() const { return backgroundColor_; } - void setUserAvatar(const QImage &pixmap); + void setUserAvatar(const QString &userid); DescInfo descriptionMessage() const { return descriptionMsg_; } QString eventId() const { return event_id_; } void setEventId(const QString &event_id) { event_id_ = event_id; } @@ -336,8 +336,7 @@ TimelineItem::setupLocalWidgetLayout(Widget *widget, const QString &userid, bool generateBody(userid, displayName, ""); setupAvatarLayout(displayName); - AvatarProvider::resolve( - room_id_, userid, this, [this](const QImage &img) { setUserAvatar(img); }); + setUserAvatar(userid); } else { setupSimpleLayout(); } @@ -381,8 +380,7 @@ TimelineItem::setupWidgetLayout(Widget *widget, const Event &event, bool withSen generateBody(sender, displayName, ""); setupAvatarLayout(displayName); - AvatarProvider::resolve( - room_id_, sender, this, [this](const QImage &img) { setUserAvatar(img); }); + setUserAvatar(sender); } else { setupSimpleLayout(); } diff --git a/src/ui/Avatar.cpp b/src/ui/Avatar.cpp index 4b4cd272..98bf21c6 100644 --- a/src/ui/Avatar.cpp +++ b/src/ui/Avatar.cpp @@ -1,12 +1,13 @@ #include +#include "AvatarProvider.h" #include "Utils.h" #include "ui/Avatar.h" -Avatar::Avatar(QWidget *parent) +Avatar::Avatar(QWidget *parent, int size) : QWidget(parent) + , size_(size) { - size_ = ui::AvatarSize; type_ = ui::AvatarType::Letter; letter_ = "A"; @@ -60,21 +61,6 @@ Avatar::setBackgroundColor(const QColor &color) background_color_ = color; } -void -Avatar::setSize(int size) -{ - size_ = size; - - if (!image_.isNull()) - pixmap_ = utils::scaleImageToPixmap(image_, size_); - - QFont _font(font()); - _font.setPointSizeF(size_ * (ui::FontSize) / 40); - - setFont(_font); - update(); -} - void Avatar::setLetter(const QString &letter) { @@ -84,12 +70,23 @@ Avatar::setLetter(const QString &letter) } void -Avatar::setImage(const QImage &image) +Avatar::setImage(const QString &avatar_url) { - image_ = image; - type_ = ui::AvatarType::Image; - pixmap_ = utils::scaleImageToPixmap(image_, size_); - update(); + AvatarProvider::resolve(avatar_url, size_, this, [this](QPixmap pm) { + type_ = ui::AvatarType::Image; + pixmap_ = pm; + update(); + }); +} + +void +Avatar::setImage(const QString &room, const QString &user) +{ + AvatarProvider::resolve(room, user, size_, this, [this](QPixmap pm) { + type_ = ui::AvatarType::Image; + pixmap_ = pm; + update(); + }); } void diff --git a/src/ui/Avatar.h b/src/ui/Avatar.h index 41967af5..b9225dd1 100644 --- a/src/ui/Avatar.h +++ b/src/ui/Avatar.h @@ -15,13 +15,14 @@ class Avatar : public QWidget Q_PROPERTY(QColor backgroundColor WRITE setBackgroundColor READ backgroundColor) public: - explicit Avatar(QWidget *parent = 0); + explicit Avatar(QWidget *parent = 0, int size = ui::AvatarSize); void setBackgroundColor(const QColor &color); void setIcon(const QIcon &icon); - void setImage(const QImage &image); + void setImage(const QString &avatar_url); + void setImage(const QString &room, const QString &user); void setLetter(const QString &letter); - void setSize(int size); + // void setSize(int size); void setTextColor(const QColor &color); QColor backgroundColor() const; @@ -41,7 +42,8 @@ private: QColor background_color_; QColor text_color_; QIcon icon_; - QImage image_; QPixmap pixmap_; + const std::string room; + const std::string user; int size_; }; From 8b5515d5c1a705ca5ffc64b3ed849332cf82ff4a Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 26 Aug 2019 08:50:54 +0200 Subject: [PATCH 2/4] Remove unused variables --- src/ui/Avatar.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ui/Avatar.h b/src/ui/Avatar.h index b9225dd1..0f8678c7 100644 --- a/src/ui/Avatar.h +++ b/src/ui/Avatar.h @@ -43,7 +43,5 @@ private: QColor text_color_; QIcon icon_; QPixmap pixmap_; - const std::string room; - const std::string user; int size_; }; From c5f0c3221ff54477d8f12a348820e903e5e9b5ff Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 28 Aug 2019 08:21:07 +0200 Subject: [PATCH 3/4] Fix usage of deprecated find --- src/AvatarProvider.cpp | 2 +- src/ui/Avatar.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/AvatarProvider.cpp b/src/AvatarProvider.cpp index 277a4030..ec745c04 100644 --- a/src/AvatarProvider.cpp +++ b/src/AvatarProvider.cpp @@ -42,7 +42,7 @@ resolve(const QString &avatarUrl, int size, QObject *receiver, AvatarCallback ca return; QPixmap pixmap; - if (avatar_cache.find(cacheKey, pixmap)) { + if (avatar_cache.find(cacheKey, &pixmap)) { nhlog::net()->info("cached pixmap {}", avatarUrl.toStdString()); callback(pixmap); return; diff --git a/src/ui/Avatar.h b/src/ui/Avatar.h index 0f8678c7..a643c8c4 100644 --- a/src/ui/Avatar.h +++ b/src/ui/Avatar.h @@ -22,7 +22,6 @@ public: void setImage(const QString &avatar_url); void setImage(const QString &room, const QString &user); void setLetter(const QString &letter); - // void setSize(int size); void setTextColor(const QColor &color); QColor backgroundColor() const; From 98d4f14bd1ccf4c280be6a5fb965c75217c74b7e Mon Sep 17 00:00:00 2001 From: Joseph Donofry Date: Thu, 29 Aug 2019 18:01:20 -0400 Subject: [PATCH 4/4] Fix themeing issues on mentions --- resources/styles/nheko-dark.qss | 11 +++++++++++ resources/styles/nheko.qss | 11 +++++++++++ resources/styles/system.qss | 10 ++++++++++ src/popups/UserMentions.cpp | 12 +++++++++++- src/popups/UserMentions.h | 4 ++++ 5 files changed, 47 insertions(+), 1 deletion(-) diff --git a/resources/styles/nheko-dark.qss b/resources/styles/nheko-dark.qss index 1e1333b2..1271e39f 100644 --- a/resources/styles/nheko-dark.qss +++ b/resources/styles/nheko-dark.qss @@ -24,6 +24,17 @@ TimelineView > * { border: none; } +UserMentionsWidget, +UserMentionsWidget > * { + background-color: #202228; + border: none; +} + +UserMentionsWidget > TimelineItem { + qproperty-backgroundColor: #202228; + qproperty-hoverColor: rgba(45, 49, 57, 120); +} + #scroll_widget { background-color: #202228; } diff --git a/resources/styles/nheko.qss b/resources/styles/nheko.qss index a70441be..3c7f3b71 100644 --- a/resources/styles/nheko.qss +++ b/resources/styles/nheko.qss @@ -24,6 +24,17 @@ TimelineView > * { border: none; } +UserMentionsWidget, +UserMentionsWidget > * { + background-color: white; + border: none; +} + +UserMentionsWidget > TimelineItem { + qproperty-backgroundColor: white; + qproperty-hoverColor: rgba(192, 193, 195, 120); +} + #scroll_widget { background-color: white; } diff --git a/resources/styles/system.qss b/resources/styles/system.qss index dfb8ce65..0a8c4b21 100644 --- a/resources/styles/system.qss +++ b/resources/styles/system.qss @@ -12,6 +12,16 @@ TimelineView > * { border: none; } +UserMentionsWidget, +UserMentionsWidget > * { + border: none; +} + +UserMentionsWidget > TimelineItem { + qproperty-backgroundColor: palette(window); + qproperty-hoverColor: palette(base); +} + TextInputWidget { border: none; border-top: 1px solid palette(mid); diff --git a/src/popups/UserMentions.cpp b/src/popups/UserMentions.cpp index 152cd82d..3480959a 100644 --- a/src/popups/UserMentions.cpp +++ b/src/popups/UserMentions.cpp @@ -1,3 +1,5 @@ +#include +#include #include #include @@ -140,7 +142,6 @@ UserMentions::pushItem(const QString &event_id, local_scroll_widget_); local_view_item->setEventId(event_id); local_view_item->hide(); - local_scroll_layout_->addWidget(local_view_item); QTimer::singleShot(0, this, [local_view_item]() { @@ -148,4 +149,13 @@ UserMentions::pushItem(const QString &event_id, local_view_item->adjustSize(); }); } +} + +void +UserMentions::paintEvent(QPaintEvent *) +{ + QStyleOption opt; + opt.init(this); + QPainter p(this); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } \ No newline at end of file diff --git a/src/popups/UserMentions.h b/src/popups/UserMentions.h index a74bf2ec..d7dfc575 100644 --- a/src/popups/UserMentions.h +++ b/src/popups/UserMentions.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -26,6 +27,9 @@ public: void initializeMentions(const QMap ¬ifs); void showPopup(); +protected: + void paintEvent(QPaintEvent *) override; + private: void pushItem(const QString &event_id, const QString &user_id,