Show story sender / repost userpic under story source.
This commit is contained in:
parent
0fd8ceca6b
commit
38e082422a
7 changed files with 53 additions and 13 deletions
|
@ -164,6 +164,15 @@ using UpdateFlag = StoryUpdate::Flag;
|
||||||
return false;
|
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
|
} // namespace
|
||||||
|
|
||||||
class StoryPreload::LoadTask final : private Storage::DownloadMtprotoTask {
|
class StoryPreload::LoadTask final : private Storage::DownloadMtprotoTask {
|
||||||
|
@ -278,6 +287,7 @@ Story::Story(
|
||||||
, _repostSourcePeer(RepostSourcePeer(&peer->owner(), data))
|
, _repostSourcePeer(RepostSourcePeer(&peer->owner(), data))
|
||||||
, _repostSourceName(RepostSourceName(data))
|
, _repostSourceName(RepostSourceName(data))
|
||||||
, _repostSourceId(RepostSourceId(data))
|
, _repostSourceId(RepostSourceId(data))
|
||||||
|
, _fromPeer(FromPeer(&peer->owner(), data))
|
||||||
, _date(data.vdate().v)
|
, _date(data.vdate().v)
|
||||||
, _expires(data.vexpire_date().v)
|
, _expires(data.vexpire_date().v)
|
||||||
, _repostModified(RepostModified(data)) {
|
, _repostModified(RepostModified(data)) {
|
||||||
|
@ -890,6 +900,10 @@ StoryId Story::repostSourceId() const {
|
||||||
return _repostSourceId;
|
return _repostSourceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PeerData *Story::fromPeer() const {
|
||||||
|
return _fromPeer;
|
||||||
|
}
|
||||||
|
|
||||||
StoryPreload::StoryPreload(not_null<Story*> story, Fn<void()> done)
|
StoryPreload::StoryPreload(not_null<Story*> story, Fn<void()> done)
|
||||||
: _story(story)
|
: _story(story)
|
||||||
, _done(std::move(done)) {
|
, _done(std::move(done)) {
|
||||||
|
|
|
@ -208,6 +208,8 @@ public:
|
||||||
[[nodiscard]] QString repostSourceName() const;
|
[[nodiscard]] QString repostSourceName() const;
|
||||||
[[nodiscard]] StoryId repostSourceId() const;
|
[[nodiscard]] StoryId repostSourceId() const;
|
||||||
|
|
||||||
|
[[nodiscard]] PeerData *fromPeer() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct ViewsCounts {
|
struct ViewsCounts {
|
||||||
int views = 0;
|
int views = 0;
|
||||||
|
@ -234,6 +236,7 @@ private:
|
||||||
PeerData * const _repostSourcePeer = nullptr;
|
PeerData * const _repostSourcePeer = nullptr;
|
||||||
const QString _repostSourceName;
|
const QString _repostSourceName;
|
||||||
const StoryId _repostSourceId = 0;
|
const StoryId _repostSourceId = 0;
|
||||||
|
PeerData * const _fromPeer = nullptr;
|
||||||
Data::ReactionId _sentReactionId;
|
Data::ReactionId _sentReactionId;
|
||||||
StoryMedia _media;
|
StoryMedia _media;
|
||||||
TextWithEntities _caption;
|
TextWithEntities _caption;
|
||||||
|
|
|
@ -538,7 +538,7 @@ std::unique_ptr<Ui::Text::CustomEmoji> CustomEmojiManager::create(
|
||||||
return internal(data);
|
return internal(data);
|
||||||
} else if (data.startsWith(UserpicEmojiPrefix())) {
|
} else if (data.startsWith(UserpicEmojiPrefix())) {
|
||||||
const auto ratio = style::DevicePixelRatio();
|
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);
|
return userpic(data, std::move(update), size);
|
||||||
}
|
}
|
||||||
const auto parsed = ParseCustomEmojiData(data);
|
const auto parsed = ParseCustomEmojiData(data);
|
||||||
|
|
|
@ -883,6 +883,7 @@ void Controller::show(
|
||||||
const auto document = story->document();
|
const auto document = story->document();
|
||||||
_header->show({
|
_header->show({
|
||||||
.peer = peer,
|
.peer = peer,
|
||||||
|
.fromPeer = story->fromPeer(),
|
||||||
.repostPeer = _repostView ? _repostView->fromPeer() : nullptr,
|
.repostPeer = _repostView ? _repostView->fromPeer() : nullptr,
|
||||||
.repostFrom = _repostView ? _repostView->fromName() : nullptr,
|
.repostFrom = _repostView ? _repostView->fromName() : nullptr,
|
||||||
.date = story->date(),
|
.date = story->date(),
|
||||||
|
|
|
@ -255,21 +255,37 @@ struct MadePrivacyBadge {
|
||||||
result.text.append(
|
result.text.append(
|
||||||
QString::fromUtf8(" \xE2\x80\xA2 ") + tr::lng_edited(tr::now));
|
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 = QString::fromUtf8("\xE2\x80\xA2 ")
|
||||||
+ result.text;
|
+ result.text;
|
||||||
}
|
}
|
||||||
return result;
|
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(
|
[[nodiscard]] TextWithEntities RepostNameValue(
|
||||||
not_null<Data::Session*> owner,
|
not_null<Data::Session*> owner,
|
||||||
|
PeerData *peer,
|
||||||
QString name) {
|
QString name) {
|
||||||
const auto result = Ui::Text::SingleCustomEmoji(
|
auto result = Ui::Text::SingleCustomEmoji(
|
||||||
owner->customEmojiManager().registerInternalEmoji(
|
owner->customEmojiManager().registerInternalEmoji(
|
||||||
st::storiesRepostIcon,
|
st::storiesRepostIcon,
|
||||||
st::storiesRepostIconPadding)
|
st::storiesRepostIconPadding));
|
||||||
).append(name);
|
if (peer) {
|
||||||
|
result.append(Ui::Text::SingleCustomEmoji(
|
||||||
|
owner->customEmojiManager().peerUserpicEmojiData(
|
||||||
|
peer,
|
||||||
|
st::storiesRepostUserpicPadding)));
|
||||||
|
}
|
||||||
|
result.append(name);
|
||||||
return Ui::Text::Link(result);
|
return Ui::Text::Link(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -371,24 +387,28 @@ void Header::show(HeaderData data) {
|
||||||
_date->widthValue(
|
_date->widthValue(
|
||||||
) | rpl::start_with_next(updateInfoGeometry, _date->lifetime());
|
) | rpl::start_with_next(updateInfoGeometry, _date->lifetime());
|
||||||
|
|
||||||
if (data.repostFrom.isEmpty()) {
|
if (!data.fromPeer && data.repostFrom.isEmpty()) {
|
||||||
_repost = nullptr;
|
_repost = nullptr;
|
||||||
} else {
|
} else {
|
||||||
_repost = std::make_unique<Ui::FlatLabel>(
|
_repost = std::make_unique<Ui::FlatLabel>(
|
||||||
_widget.get(),
|
_widget.get(),
|
||||||
st::storiesHeaderDate);
|
st::storiesHeaderDate);
|
||||||
const auto repostName = RepostNameValue(
|
const auto prefixName = data.fromPeer
|
||||||
&data.peer->owner(),
|
? FromNameValue(data.fromPeer)
|
||||||
data.repostFrom);
|
: RepostNameValue(
|
||||||
|
&data.peer->owner(),
|
||||||
|
data.repostPeer,
|
||||||
|
data.repostFrom);
|
||||||
|
const auto prefix = data.fromPeer ? data.fromPeer : data.repostPeer;
|
||||||
_repost->setMarkedText(
|
_repost->setMarkedText(
|
||||||
data.repostPeer ? Ui::Text::Link(repostName) : repostName,
|
(prefix ? Ui::Text::Link(prefixName) : prefixName),
|
||||||
Core::MarkedTextContext{
|
Core::MarkedTextContext{
|
||||||
.session = &data.peer->session(),
|
.session = &data.peer->session(),
|
||||||
.customEmojiRepaint = [=] { _repost->update(); },
|
.customEmojiRepaint = [=] { _repost->update(); },
|
||||||
});
|
});
|
||||||
if (const auto peer = data.repostPeer) {
|
if (prefix) {
|
||||||
_repost->setClickHandlerFilter([=](const auto &...) {
|
_repost->setClickHandlerFilter([=](const auto &...) {
|
||||||
_controller->uiShow()->show(PrepareShortInfoBox(peer));
|
_controller->uiShow()->show(PrepareShortInfoBox(prefix));
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ enum class PauseState;
|
||||||
|
|
||||||
struct HeaderData {
|
struct HeaderData {
|
||||||
not_null<PeerData*> peer;
|
not_null<PeerData*> peer;
|
||||||
|
PeerData *fromPeer = nullptr;
|
||||||
PeerData *repostPeer = nullptr;
|
PeerData *repostPeer = nullptr;
|
||||||
QString repostFrom;
|
QString repostFrom;
|
||||||
TimeId date = 0;
|
TimeId date = 0;
|
||||||
|
|
|
@ -1046,4 +1046,5 @@ storiesRepostSimpleStyle: QuoteStyle(defaultQuoteStyle) {
|
||||||
radius: 10px;
|
radius: 10px;
|
||||||
}
|
}
|
||||||
storiesRepostIcon: icon {{ "mediaview/mini_repost", windowFg }};
|
storiesRepostIcon: icon {{ "mediaview/mini_repost", windowFg }};
|
||||||
storiesRepostIconPadding: margins(0px, 4px, 4px, 0px);
|
storiesRepostIconPadding: margins(0px, 4px, 2px, 0px);
|
||||||
|
storiesRepostUserpicPadding: margins(0px, 1px, 4px, 0px);
|
||||||
|
|
Loading…
Reference in a new issue