diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 1a701a7b6..6ce80f8a9 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -528,6 +528,13 @@ void Widget::chosenRow(const ChosenRow &row) { topic, row.message.fullId.msg, Window::SectionShow::Way::ClearStack); + } else if (history + && row.userpicClick + && (row.message.fullId.msg == ShowAtUnreadMsgId) + && history->peer->hasActiveStories() + && !history->peer->isSelf()) { + controller()->openPeerStories(history->peer->id); + return; } else if (history && history->isForum() && !row.message.fullId @@ -558,14 +565,6 @@ void Widget::chosenRow(const ChosenRow &row) { return; } else if (history) { const auto peer = history->peer; - if (row.message.fullId.msg == ShowAtUnreadMsgId) { - if (row.userpicClick - && peer->hasActiveStories() - && !peer->isSelf()) { - controller()->openPeerStories(peer->id); - return; - } - } const auto showAtMsgId = controller()->uniqueChatsInSearchResults() ? ShowAtUnreadMsgId : row.message.fullId.msg; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.cpp index bf60a2488..f676861b0 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.cpp @@ -66,7 +66,7 @@ Content State::next() { if (const auto i = _userpics.find(peer); i != end(_userpics)) { userpic = i->second; } else { - userpic = Ui::MakeUserpicThumbnail(peer); + userpic = Ui::MakeUserpicThumbnail(peer, true); _userpics.emplace(peer, userpic); } result.elements.push_back({ diff --git a/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp b/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp index 3cd8ba36a..d8857f349 100644 --- a/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp +++ b/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp @@ -25,7 +25,7 @@ namespace { class PeerUserpic final : public DynamicImage { public: - explicit PeerUserpic(not_null peer); + PeerUserpic(not_null peer, bool forceRound); QImage image(int size) override; void subscribeToUpdates(Fn callback) override; @@ -33,7 +33,7 @@ public: private: struct Subscribed { explicit Subscribed(Fn callback) - : callback(std::move(callback)) { + : callback(std::move(callback)) { } Ui::PeerUserpicView view; @@ -49,6 +49,7 @@ private: const not_null _peer; QImage _frame; std::unique_ptr _subscribed; + bool _forceRound = false; }; @@ -116,8 +117,9 @@ private: }; -PeerUserpic::PeerUserpic(not_null peer) -: _peer(peer) { +PeerUserpic::PeerUserpic(not_null peer, bool forceRound) +: _peer(peer) +, _forceRound(forceRound) { } QImage PeerUserpic::image(int size) { @@ -135,7 +137,17 @@ QImage PeerUserpic::image(int size) { _frame.fill(Qt::transparent); auto p = Painter(&_frame); - _peer->paintUserpic(p, _subscribed->view, 0, 0, size); + auto &view = _subscribed->view; + if (!_forceRound) { + _peer->paintUserpic(p, view, 0, 0, size); + } else if (const auto cloud = _peer->userpicCloudImage(view)) { + Ui::ValidateUserpicCache(view, cloud, nullptr, size, false); + p.drawImage(QRect(0, 0, size, size), view.cached); + } else { + const auto r = size / 2.; + const auto empty = _peer->generateUserpicImage(view, size, r); + p.drawImage(QRect(0, 0, size, size), empty); + } } return _frame; } @@ -302,8 +314,9 @@ void EmptyThumbnail::subscribeToUpdates(Fn callback) { } // namespace std::shared_ptr MakeUserpicThumbnail( - not_null peer) { - return std::make_shared(peer); + not_null peer, + bool forceRound) { + return std::make_shared(peer, forceRound); } std::shared_ptr MakeStoryThumbnail( diff --git a/Telegram/SourceFiles/ui/dynamic_thumbnails.h b/Telegram/SourceFiles/ui/dynamic_thumbnails.h index a3a95111f..cbf3cb235 100644 --- a/Telegram/SourceFiles/ui/dynamic_thumbnails.h +++ b/Telegram/SourceFiles/ui/dynamic_thumbnails.h @@ -18,7 +18,8 @@ namespace Ui { class DynamicImage; [[nodiscard]] std::shared_ptr MakeUserpicThumbnail( - not_null peer); + not_null peer, + bool forceRound = false); [[nodiscard]] std::shared_ptr MakeStoryThumbnail( not_null story);