Show story sender / repost userpic under story source.

This commit is contained in:
John Preston 2024-02-12 15:34:48 +04:00
parent 0fd8ceca6b
commit 38e082422a
7 changed files with 53 additions and 13 deletions

View file

@ -164,6 +164,15 @@ using UpdateFlag = StoryUpdate::Flag;
return false;
}
[[nodiscard]] PeerData *FromPeer(
not_null<Session*> 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*> story, Fn<void()> done)
: _story(story)
, _done(std::move(done)) {

View file

@ -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;

View file

@ -538,7 +538,7 @@ std::unique_ptr<Ui::Text::CustomEmoji> 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);

View file

@ -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(),

View file

@ -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<PeerData*> 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<Data::Session*> 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<Ui::FlatLabel>(
_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;
});
}

View file

@ -32,6 +32,7 @@ enum class PauseState;
struct HeaderData {
not_null<PeerData*> peer;
PeerData *fromPeer = nullptr;
PeerData *repostPeer = nullptr;
QString repostFrom;
TimeId date = 0;

View file

@ -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);