From 12fe0a836a5216e0932534dd677f0c2134b38bf9 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 5 Jul 2023 16:18:55 +0400 Subject: [PATCH] Apply editions in realtime, show badge. --- Telegram/SourceFiles/data/data_story.cpp | 7 +++++++ Telegram/SourceFiles/data/data_story.h | 2 ++ .../stories/media_stories_controller.cpp | 20 +++++++++++++++---- .../media/stories/media_stories_delegate.h | 2 ++ .../media/stories/media_stories_header.cpp | 13 ++++++++++-- .../media/stories/media_stories_header.h | 1 + .../media/view/media_view_overlay_widget.cpp | 14 +++++++++++++ .../media/view/media_view_overlay_widget.h | 1 + 8 files changed, 54 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/data/data_story.cpp b/Telegram/SourceFiles/data/data_story.cpp index dd11bcc0e..af8b50c8a 100644 --- a/Telegram/SourceFiles/data/data_story.cpp +++ b/Telegram/SourceFiles/data/data_story.cpp @@ -260,6 +260,10 @@ bool Story::forbidsForward() const { return _noForwards; } +bool Story::edited() const { + return _edited; +} + bool Story::canDownload() const { return !forbidsForward() || _peer->isSelf(); } @@ -369,6 +373,7 @@ void Story::applyViewsSlice( bool Story::applyChanges(StoryMedia media, const MTPDstoryItem &data) { const auto pinned = data.is_pinned(); + const auto edited = data.is_edited(); const auto isPublic = data.is_public(); const auto closeFriends = data.is_close_friends(); const auto noForwards = data.is_noforwards(); @@ -395,6 +400,7 @@ bool Story::applyChanges(StoryMedia media, const MTPDstoryItem &data) { const auto changed = (_media != media) || (_pinned != pinned) + || (_edited != edited) || (_isPublic != isPublic) || (_closeFriends != closeFriends) || (_noForwards != noForwards) @@ -405,6 +411,7 @@ bool Story::applyChanges(StoryMedia media, const MTPDstoryItem &data) { return false; } _media = std::move(media); + _edited = edited; _pinned = pinned; _isPublic = isPublic; _closeFriends = closeFriends; diff --git a/Telegram/SourceFiles/data/data_story.h b/Telegram/SourceFiles/data/data_story.h index 183e46808..d80272e67 100644 --- a/Telegram/SourceFiles/data/data_story.h +++ b/Telegram/SourceFiles/data/data_story.h @@ -89,6 +89,7 @@ public: [[nodiscard]] bool isPublic() const; [[nodiscard]] bool closeFriends() const; [[nodiscard]] bool forbidsForward() const; + [[nodiscard]] bool edited() const; [[nodiscard]] bool canDownload() const; [[nodiscard]] bool canShare() const; @@ -128,6 +129,7 @@ private: bool _isPublic : 1 = false; bool _closeFriends : 1 = false; bool _noForwards : 1 = false; + bool _edited : 1 = false; }; diff --git a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp index cf411bc7b..e1e6cc875 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp @@ -741,20 +741,24 @@ void Controller::show( _slider->raise(); } - if (_shown == storyId) { + _captionText = story->caption(); + _captionFullView = nullptr; + _header->show({ + .user = user, + .date = story->date(), + .edited = story->edited(), + }); + if (_shown == storyId && _session == &story->session()) { return; } _shown = storyId; _viewed = false; - _captionText = story->caption(); - _captionFullView = nullptr; invalidate_weak_ptrs(&_viewsLoadGuard); _reactions->hide(); if (_replyFocused) { unfocusReply(); } - _header->show({ .user = user, .date = story->date() }); _replyArea->show({ .user = unsupported ? nullptr : user, .id = story->id(), @@ -781,6 +785,14 @@ void Controller::show( checkWaitingFor(); } }, _sessionLifetime); + session->changes().storyUpdates( + Data::StoryUpdate::Flag::Edited + ) | rpl::filter([=](const Data::StoryUpdate &update) { + return (update.story == this->story()); + }) | rpl::start_with_next([=](const Data::StoryUpdate &update) { + show(update.story, _context); + _delegate->storiesRedisplay(update.story); + }, _sessionLifetime); _sessionLifetime.add([=] { session->data().stories().setPreloadingInViewer({}); }); diff --git a/Telegram/SourceFiles/media/stories/media_stories_delegate.h b/Telegram/SourceFiles/media/stories/media_stories_delegate.h index 6dfbf3acd..f42e3c463 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_delegate.h +++ b/Telegram/SourceFiles/media/stories/media_stories_delegate.h @@ -13,6 +13,7 @@ struct FileChosen; } // namespace ChatHelpers namespace Data { +class Story; struct StoriesContext; } // namespace Data @@ -49,6 +50,7 @@ public: -> rpl::producer = 0; [[nodiscard]] virtual auto storiesCachedReactionIconFactory() -> HistoryView::Reactions::CachedIconFactory & = 0; + virtual void storiesRedisplay(not_null story) = 0; virtual void storiesJumpTo( not_null session, FullStoryId id, diff --git a/Telegram/SourceFiles/media/stories/media_stories_header.cpp b/Telegram/SourceFiles/media/stories/media_stories_header.cpp index dc33da5f4..fd8f21b33 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_header.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_header.cpp @@ -75,6 +75,15 @@ struct Timestamp { return { Ui::FormatDateTime(whenFull) }; } +[[nodiscard]] Timestamp ComposeDetails(HeaderData data, TimeId now) { + auto result = ComposeTimestamp(data.date, now); + if (data.edited) { + result.text.append( + QString::fromUtf8(" \xE2\x80\xA2 ") + tr::lng_edited(tr::now)); + } + return result; +} + } // namespace Header::Header(not_null controller) @@ -123,7 +132,7 @@ void Header::show(HeaderData data) { raw->setGeometry(layout.header); }, raw->lifetime()); } - auto timestamp = ComposeTimestamp(data.date, base::unixtime::now()); + auto timestamp = ComposeDetails(data, base::unixtime::now()); _date = std::make_unique( _widget.get(), std::move(timestamp.text), @@ -148,7 +157,7 @@ void Header::updateDateText() { if (!_date || !_data || !_data->date) { return; } - auto timestamp = ComposeTimestamp(_data->date, base::unixtime::now()); + auto timestamp = ComposeDetails(*_data, base::unixtime::now()); _date->setText(timestamp.text); if (timestamp.changes > 0) { _dateUpdateTimer.callOnce(timestamp.changes * crl::time(1000)); diff --git a/Telegram/SourceFiles/media/stories/media_stories_header.h b/Telegram/SourceFiles/media/stories/media_stories_header.h index 97d62b250..cab943464 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_header.h +++ b/Telegram/SourceFiles/media/stories/media_stories_header.h @@ -22,6 +22,7 @@ class Controller; struct HeaderData { not_null user; TimeId date = 0; + bool edited = false; friend inline auto operator<=>(HeaderData, HeaderData) = default; friend inline bool operator==(HeaderData, HeaderData) = default; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 12b6e0332..9690f150e 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -4167,6 +4167,20 @@ void OverlayWidget::storiesJumpTo( }); } +void OverlayWidget::storiesRedisplay(not_null story) { + Expects(_stories != nullptr); + + clearStreaming(); + _streamingStartPaused = false; + v::match(story->media().data, [&](not_null photo) { + displayPhoto(photo, anim::activation::background); + }, [&](not_null document) { + displayDocument(document, anim::activation::background); + }, [&](v::null_t) { + displayDocument(nullptr, anim::activation::background); + }); +} + void OverlayWidget::storiesClose() { close(); } diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index d90cf8a02..b5be1b16c 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -250,6 +250,7 @@ private: -> rpl::producer override; auto storiesCachedReactionIconFactory() -> HistoryView::Reactions::CachedIconFactory & override; + void storiesRedisplay(not_null story) override; void storiesJumpTo( not_null session, FullStoryId id,