diff --git a/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp b/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp index c7eea5d48..0e47aa390 100644 --- a/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp +++ b/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp @@ -598,13 +598,21 @@ std::unique_ptr CustomEmojiManager::userpic( if (v.size() != 5 && v.size() != 1) { return nullptr; } - const auto id = PeerId(v[0].toULongLong()); + auto image = std::shared_ptr(); + if (v[0] == u"self"_q) { + image = Ui::MakeSavedMessagesThumbnail(); + } else if (v[0] == u"replies"_q) { + image = Ui::MakeRepliesThumbnail(); + } else { + const auto id = PeerId(v[0].toULongLong()); + image = Ui::MakeUserpicThumbnail(_owner->peer(id)); + } const auto padding = (v.size() == 5) ? QMargins(v[1].toInt(), v[2].toInt(), v[3].toInt(), v[4].toInt()) : QMargins(); return std::make_unique( data.toString(), - Ui::MakeUserpicThumbnail(_owner->peer(id)), + std::move(image), std::move(update), padding, size); @@ -992,10 +1000,16 @@ QString CustomEmojiManager::registerInternalEmoji( [[nodiscard]] QString CustomEmojiManager::peerUserpicEmojiData( not_null peer, - QMargins padding) { - return UserpicEmojiPrefix() - + QString::number(peer->id.value) - + InternalPadding(padding); + QMargins padding, + bool respectSavedRepliesEtc) { + const auto id = !respectSavedRepliesEtc + ? QString::number(peer->id.value) + : peer->isSelf() + ? u"self"_q + : peer->isRepliesChat() + ? u"replies"_q + : QString::number(peer->id.value); + return UserpicEmojiPrefix() + id + InternalPadding(padding); } int FrameSizeFromTag(SizeTag tag) { diff --git a/Telegram/SourceFiles/data/stickers/data_custom_emoji.h b/Telegram/SourceFiles/data/stickers/data_custom_emoji.h index 1cbbe0de9..d7a6c46ca 100644 --- a/Telegram/SourceFiles/data/stickers/data_custom_emoji.h +++ b/Telegram/SourceFiles/data/stickers/data_custom_emoji.h @@ -94,7 +94,8 @@ public: [[nodiscard]] QString peerUserpicEmojiData( not_null peer, - QMargins padding = {}); + QMargins padding = {}, + bool respectSavedRepliesEtc = false); [[nodiscard]] uint64 coloredSetId() const; diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index caa3526e2..4a910953e 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -522,7 +522,7 @@ forumTopicRow: DialogRow(defaultDialogRow) { photoSize: 20px; nameLeft: 39px; nameTop: 7px; - textLeft: 68px; + textLeft: 39px; textTop: 29px; unreadMarkDiameter: 8px; } diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index bae1e94e7..9e79f3ac2 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -3145,6 +3145,7 @@ void InnerWidget::refreshEmpty() { } else { _searchEmpty.destroy(); _loadingAnimation.destroy(); + _searchEmptyState = {}; } const auto data = &session().data(); diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index fa1c71a5f..b3b5a31f9 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -1279,11 +1279,15 @@ void Widget::updateSearchTabs() { const auto peerShortLabel = peer ? Ui::Text::SingleCustomEmoji( session().data().customEmojiManager().peerUserpicEmojiData( - peer)) + peer, + {}, + true)) : sublist ? Ui::Text::SingleCustomEmoji( session().data().customEmojiManager().peerUserpicEmojiData( - sublist->peer())) + sublist->peer(), + {}, + true)) : TextWithEntities(); const auto myShortLabel = DefaultShortLabel(ChatSearchTab::MyMessages); const auto publicShortLabel = _searchingHashtag diff --git a/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp b/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp index fb977e6d7..b9ea1ad0e 100644 --- a/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp +++ b/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp @@ -130,6 +130,17 @@ private: }; +class RepliesUserpic final : public DynamicImage { +public: + QImage image(int size) override; + void subscribeToUpdates(Fn callback) override; + +private: + QImage _frame; + int _paletteVersion = 0; + +}; + PeerUserpic::PeerUserpic(not_null peer, bool forceRound) : _peer(peer) , _forceRound(forceRound) { @@ -358,6 +369,30 @@ QImage SavedMessagesUserpic::image(int size) { void SavedMessagesUserpic::subscribeToUpdates(Fn callback) { } +QImage RepliesUserpic::image(int size) { + const auto good = (_frame.width() == size * _frame.devicePixelRatio()); + const auto paletteVersion = style::PaletteVersion(); + if (!good || _paletteVersion != paletteVersion) { + _paletteVersion = paletteVersion; + + const auto ratio = style::DevicePixelRatio(); + if (!good) { + _frame = QImage( + QSize(size, size) * ratio, + QImage::Format_ARGB32_Premultiplied); + _frame.setDevicePixelRatio(ratio); + } + _frame.fill(Qt::transparent); + + auto p = Painter(&_frame); + Ui::EmptyUserpic::PaintRepliesMessages(p, 0, 0, size, size); + } + return _frame; +} + +void RepliesUserpic::subscribeToUpdates(Fn callback) { +} + } // namespace std::shared_ptr MakeUserpicThumbnail( @@ -370,6 +405,10 @@ std::shared_ptr MakeSavedMessagesThumbnail() { return std::make_shared(); } +std::shared_ptr MakeRepliesThumbnail() { + return std::make_shared(); +} + std::shared_ptr MakeStoryThumbnail( not_null story) { using Result = std::shared_ptr; diff --git a/Telegram/SourceFiles/ui/dynamic_thumbnails.h b/Telegram/SourceFiles/ui/dynamic_thumbnails.h index ad8556d5d..4b4e0e553 100644 --- a/Telegram/SourceFiles/ui/dynamic_thumbnails.h +++ b/Telegram/SourceFiles/ui/dynamic_thumbnails.h @@ -21,6 +21,7 @@ class DynamicImage; not_null peer, bool forceRound = false); [[nodiscard]] std::shared_ptr MakeSavedMessagesThumbnail(); +[[nodiscard]] std::shared_ptr MakeRepliesThumbnail(); [[nodiscard]] std::shared_ptr MakeStoryThumbnail( not_null story);