From 38e082422a700d9b90094ac0e021179ec777b645 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 12 Feb 2024 15:34:48 +0400 Subject: [PATCH] Show story sender / repost userpic under story source. --- Telegram/SourceFiles/data/data_story.cpp | 14 +++++++ Telegram/SourceFiles/data/data_story.h | 3 ++ .../data/stickers/data_custom_emoji.cpp | 2 +- .../stories/media_stories_controller.cpp | 1 + .../media/stories/media_stories_header.cpp | 42 ++++++++++++++----- .../media/stories/media_stories_header.h | 1 + .../SourceFiles/media/view/media_view.style | 3 +- 7 files changed, 53 insertions(+), 13 deletions(-) diff --git a/Telegram/SourceFiles/data/data_story.cpp b/Telegram/SourceFiles/data/data_story.cpp index 7631892a3..d4b12de6a 100644 --- a/Telegram/SourceFiles/data/data_story.cpp +++ b/Telegram/SourceFiles/data/data_story.cpp @@ -164,6 +164,15 @@ using UpdateFlag = StoryUpdate::Flag; return false; } +[[nodiscard]] PeerData *FromPeer( + not_null owner, + const MTPDstoryItem &data) { + if (const auto from = data.vfrom_id()) { + return owner->peer(peerFromMTP(*from)); + } + return nullptr; +} + } // namespace class StoryPreload::LoadTask final : private Storage::DownloadMtprotoTask { @@ -278,6 +287,7 @@ Story::Story( , _repostSourcePeer(RepostSourcePeer(&peer->owner(), data)) , _repostSourceName(RepostSourceName(data)) , _repostSourceId(RepostSourceId(data)) +, _fromPeer(FromPeer(&peer->owner(), data)) , _date(data.vdate().v) , _expires(data.vexpire_date().v) , _repostModified(RepostModified(data)) { @@ -890,6 +900,10 @@ StoryId Story::repostSourceId() const { return _repostSourceId; } +PeerData *Story::fromPeer() const { + return _fromPeer; +} + StoryPreload::StoryPreload(not_null story, Fn done) : _story(story) , _done(std::move(done)) { diff --git a/Telegram/SourceFiles/data/data_story.h b/Telegram/SourceFiles/data/data_story.h index 4fb4796b2..41da0239e 100644 --- a/Telegram/SourceFiles/data/data_story.h +++ b/Telegram/SourceFiles/data/data_story.h @@ -208,6 +208,8 @@ public: [[nodiscard]] QString repostSourceName() const; [[nodiscard]] StoryId repostSourceId() const; + [[nodiscard]] PeerData *fromPeer() const; + private: struct ViewsCounts { int views = 0; @@ -234,6 +236,7 @@ private: PeerData * const _repostSourcePeer = nullptr; const QString _repostSourceName; const StoryId _repostSourceId = 0; + PeerData * const _fromPeer = nullptr; Data::ReactionId _sentReactionId; StoryMedia _media; TextWithEntities _caption; diff --git a/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp b/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp index 1e225afc5..0ce9ccf78 100644 --- a/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp +++ b/Telegram/SourceFiles/data/stickers/data_custom_emoji.cpp @@ -538,7 +538,7 @@ std::unique_ptr CustomEmojiManager::create( return internal(data); } else if (data.startsWith(UserpicEmojiPrefix())) { const auto ratio = style::DevicePixelRatio(); - const auto size = FrameSizeFromTag(tag, sizeOverride) / ratio; + const auto size = EmojiSizeFromTag(tag) / ratio; return userpic(data, std::move(update), size); } const auto parsed = ParseCustomEmojiData(data); diff --git a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp index 7814b71d2..e9170bbb1 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp @@ -883,6 +883,7 @@ void Controller::show( const auto document = story->document(); _header->show({ .peer = peer, + .fromPeer = story->fromPeer(), .repostPeer = _repostView ? _repostView->fromPeer() : nullptr, .repostFrom = _repostView ? _repostView->fromName() : nullptr, .date = story->date(), diff --git a/Telegram/SourceFiles/media/stories/media_stories_header.cpp b/Telegram/SourceFiles/media/stories/media_stories_header.cpp index 8b14a984b..b247acf81 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_header.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_header.cpp @@ -255,21 +255,37 @@ struct MadePrivacyBadge { result.text.append( QString::fromUtf8(" \xE2\x80\xA2 ") + tr::lng_edited(tr::now)); } - if (!data.repostFrom.isEmpty()) { + if (data.fromPeer || !data.repostFrom.isEmpty()) { result.text = QString::fromUtf8("\xE2\x80\xA2 ") + result.text; } return result; } +[[nodiscard]] TextWithEntities FromNameValue(not_null from) { + auto result = Ui::Text::SingleCustomEmoji( + from->owner().customEmojiManager().peerUserpicEmojiData( + from, + st::storiesRepostUserpicPadding)); + result.append(from->name()); + return Ui::Text::Link(result); +} + [[nodiscard]] TextWithEntities RepostNameValue( not_null owner, + PeerData *peer, QString name) { - const auto result = Ui::Text::SingleCustomEmoji( + auto result = Ui::Text::SingleCustomEmoji( owner->customEmojiManager().registerInternalEmoji( st::storiesRepostIcon, - st::storiesRepostIconPadding) - ).append(name); + st::storiesRepostIconPadding)); + if (peer) { + result.append(Ui::Text::SingleCustomEmoji( + owner->customEmojiManager().peerUserpicEmojiData( + peer, + st::storiesRepostUserpicPadding))); + } + result.append(name); return Ui::Text::Link(result); } @@ -371,24 +387,28 @@ void Header::show(HeaderData data) { _date->widthValue( ) | rpl::start_with_next(updateInfoGeometry, _date->lifetime()); - if (data.repostFrom.isEmpty()) { + if (!data.fromPeer && data.repostFrom.isEmpty()) { _repost = nullptr; } else { _repost = std::make_unique( _widget.get(), st::storiesHeaderDate); - const auto repostName = RepostNameValue( - &data.peer->owner(), - data.repostFrom); + const auto prefixName = data.fromPeer + ? FromNameValue(data.fromPeer) + : RepostNameValue( + &data.peer->owner(), + data.repostPeer, + data.repostFrom); + const auto prefix = data.fromPeer ? data.fromPeer : data.repostPeer; _repost->setMarkedText( - data.repostPeer ? Ui::Text::Link(repostName) : repostName, + (prefix ? Ui::Text::Link(prefixName) : prefixName), Core::MarkedTextContext{ .session = &data.peer->session(), .customEmojiRepaint = [=] { _repost->update(); }, }); - if (const auto peer = data.repostPeer) { + if (prefix) { _repost->setClickHandlerFilter([=](const auto &...) { - _controller->uiShow()->show(PrepareShortInfoBox(peer)); + _controller->uiShow()->show(PrepareShortInfoBox(prefix)); return false; }); } diff --git a/Telegram/SourceFiles/media/stories/media_stories_header.h b/Telegram/SourceFiles/media/stories/media_stories_header.h index cf360cc90..f02c4ff37 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_header.h +++ b/Telegram/SourceFiles/media/stories/media_stories_header.h @@ -32,6 +32,7 @@ enum class PauseState; struct HeaderData { not_null peer; + PeerData *fromPeer = nullptr; PeerData *repostPeer = nullptr; QString repostFrom; TimeId date = 0; diff --git a/Telegram/SourceFiles/media/view/media_view.style b/Telegram/SourceFiles/media/view/media_view.style index d144eba5c..5da7f93a8 100644 --- a/Telegram/SourceFiles/media/view/media_view.style +++ b/Telegram/SourceFiles/media/view/media_view.style @@ -1046,4 +1046,5 @@ storiesRepostSimpleStyle: QuoteStyle(defaultQuoteStyle) { radius: 10px; } storiesRepostIcon: icon {{ "mediaview/mini_repost", windowFg }}; -storiesRepostIconPadding: margins(0px, 4px, 4px, 0px); +storiesRepostIconPadding: margins(0px, 4px, 2px, 0px); +storiesRepostUserpicPadding: margins(0px, 1px, 4px, 0px);