diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 1b801bea05..3d734f98eb 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -4066,6 +4066,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_stories_link_invalid" = "This link is broken or has expired."; "lng_stats_title" = "Statistics"; +"lng_stats_message_title" = "Message Statistic"; "lng_stats_zoom_out" = "Zoom Out"; "lng_stats_overview_title" = "Overview"; diff --git a/Telegram/SourceFiles/info/info_content_widget.cpp b/Telegram/SourceFiles/info/info_content_widget.cpp index c146246779..89c0f7aad0 100644 --- a/Telegram/SourceFiles/info/info_content_widget.cpp +++ b/Telegram/SourceFiles/info/info_content_widget.cpp @@ -339,6 +339,8 @@ Key ContentMemento::key() const { return Settings::Tag{ self }; } else if (const auto peer = storiesPeer()) { return Stories::Tag{ peer, storiesTab() }; + } else if (const auto peer = statisticsPeer()) { + return Statistics::Tag{ peer, statisticsContextId() }; } else { return Downloads::Tag(); } @@ -375,4 +377,9 @@ ContentMemento::ContentMemento(Stories::Tag stories) , _storiesTab(stories.tab) { } +ContentMemento::ContentMemento(Statistics::Tag statistics) +: _statisticsPeer(statistics.peer) +, _statisticsContextId(statistics.contextId) { +} + } // namespace Info diff --git a/Telegram/SourceFiles/info/info_content_widget.h b/Telegram/SourceFiles/info/info_content_widget.h index 6a6f75bbda..5f0c8480ef 100644 --- a/Telegram/SourceFiles/info/info_content_widget.h +++ b/Telegram/SourceFiles/info/info_content_widget.h @@ -41,6 +41,10 @@ struct Tag; enum class Tab; } // namespace Info::Stories +namespace Info::Statistics { +struct Tag; +} // namespace Info::Statistics + namespace Info { class ContentMemento; @@ -163,6 +167,7 @@ public: explicit ContentMemento(Settings::Tag settings); explicit ContentMemento(Downloads::Tag downloads); explicit ContentMemento(Stories::Tag stories); + explicit ContentMemento(Statistics::Tag statistics); ContentMemento(not_null poll, FullMsgId contextId) : _poll(poll) , _pollContextId(contextId) { @@ -191,6 +196,12 @@ public: Stories::Tab storiesTab() const { return _storiesTab; } + PeerData *statisticsPeer() const { + return _statisticsPeer; + } + FullMsgId statisticsContextId() const { + return _statisticsContextId; + } PollData *poll() const { return _poll; } @@ -235,6 +246,8 @@ private: UserData * const _settingsSelf = nullptr; PeerData * const _storiesPeer = nullptr; Stories::Tab _storiesTab = {}; + PeerData * const _statisticsPeer = nullptr; + const FullMsgId _statisticsContextId; PollData * const _poll = nullptr; const FullMsgId _pollContextId; diff --git a/Telegram/SourceFiles/info/info_controller.cpp b/Telegram/SourceFiles/info/info_controller.cpp index d7beb981e3..85758a9d7d 100644 --- a/Telegram/SourceFiles/info/info_controller.cpp +++ b/Telegram/SourceFiles/info/info_controller.cpp @@ -43,6 +43,9 @@ Key::Key(Downloads::Tag downloads) : _value(downloads) { Key::Key(Stories::Tag stories) : _value(stories) { } +Key::Key(Statistics::Tag statistics) : _value(statistics) { +} + Key::Key(not_null poll, FullMsgId contextId) : _value(PollKey{ poll, contextId }) { } @@ -89,6 +92,20 @@ Stories::Tab Key::storiesTab() const { return Stories::Tab(); } +PeerData *Key::statisticsPeer() const { + if (const auto tag = std::get_if(&_value)) { + return tag->peer; + } + return nullptr; +} + +FullMsgId Key::statisticsContextId() const { + if (const auto tag = std::get_if(&_value)) { + return tag->contextId; + } + return {}; +} + PollData *Key::poll() const { if (const auto data = std::get_if(&_value)) { return data->poll; diff --git a/Telegram/SourceFiles/info/info_controller.h b/Telegram/SourceFiles/info/info_controller.h index 40f3218637..88fbf07ed6 100644 --- a/Telegram/SourceFiles/info/info_controller.h +++ b/Telegram/SourceFiles/info/info_controller.h @@ -55,6 +55,20 @@ struct Tag { } // namespace Info::Stories +namespace Info::Statistics { + +struct Tag { + explicit Tag(not_null peer, FullMsgId contextId) + : peer(peer) + , contextId(contextId) { + } + + not_null peer; + FullMsgId contextId; +}; + +} // namespace Info::Statistics + namespace Info { class Key { @@ -64,6 +78,7 @@ public: Key(Settings::Tag settings); Key(Downloads::Tag downloads); Key(Stories::Tag stories); + Key(Statistics::Tag statistics); Key(not_null poll, FullMsgId contextId); PeerData *peer() const; @@ -72,6 +87,8 @@ public: bool isDownloads() const; PeerData *storiesPeer() const; Stories::Tab storiesTab() const; + PeerData *statisticsPeer() const; + FullMsgId statisticsContextId() const; PollData *poll() const; FullMsgId pollContextId() const; @@ -86,6 +103,7 @@ private: Settings::Tag, Downloads::Tag, Stories::Tag, + Statistics::Tag, PollKey> _value; }; @@ -169,6 +187,12 @@ public: [[nodiscard]] Stories::Tab storiesTab() const { return key().storiesTab(); } + [[nodiscard]] PeerData *statisticsPeer() const { + return key().statisticsPeer(); + } + [[nodiscard]] FullMsgId statisticsContextId() const { + return key().statisticsContextId(); + } [[nodiscard]] PollData *poll() const; [[nodiscard]] FullMsgId pollContextId() const { return key().pollContextId(); diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index 214e191fb0..0bfb715a8a 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -250,7 +250,10 @@ Dialogs::RowDescriptor WrapWidget::activeChat() const { storiesPeer->owner().history(storiesPeer), FullMsgId()) : Dialogs::RowDescriptor(); - } else if (key().settingsSelf() || key().isDownloads() || key().poll()) { + } else if (key().settingsSelf() + || key().isDownloads() + || key().poll() + || key().statisticsPeer()) { return Dialogs::RowDescriptor(); } Unexpected("Owner in WrapWidget::activeChat()."); diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_widget.cpp b/Telegram/SourceFiles/info/statistics/info_statistics_widget.cpp index 4a0c1b6853..5b26fb19d7 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_widget.cpp +++ b/Telegram/SourceFiles/info/statistics/info_statistics_widget.cpp @@ -484,11 +484,14 @@ void FillRecentPosts( } // namespace Memento::Memento(not_null controller) -: Memento(controller->peer()) { +: ContentMemento(Tag{ + controller->statisticsPeer(), + controller->statisticsContextId(), +}) { } -Memento::Memento(not_null peer) -: ContentMemento(peer, nullptr, {}) { +Memento::Memento(not_null peer, FullMsgId contextId) +: ContentMemento(Tag{ peer, contextId }) { } Memento::~Memento() = default; @@ -509,7 +512,7 @@ Widget::Widget( QWidget *parent, not_null controller) : ContentWidget(parent, controller) { - const auto peer = controller->peer(); + const auto peer = controller->statisticsPeer(); if (!peer) { return; } @@ -556,7 +559,9 @@ bool Widget::showInternal(not_null memento) { } rpl::producer Widget::title() { - return tr::lng_stats_title(); + return controller()->key().statisticsContextId() + ? tr::lng_stats_message_title() + : tr::lng_stats_title(); } rpl::producer Widget::desiredShadowVisibility() const { @@ -572,11 +577,13 @@ std::shared_ptr Widget::doCreateMemento() { return result; } -std::shared_ptr Make(not_null peer) { +std::shared_ptr Make( + not_null peer, + FullMsgId contextId) { return std::make_shared( std::vector>( 1, - std::make_shared(peer))); + std::make_shared(peer, contextId))); } } // namespace Info::Statistics diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_widget.h b/Telegram/SourceFiles/info/statistics/info_statistics_widget.h index 75a9b00cd4..b6c17cb33b 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_widget.h +++ b/Telegram/SourceFiles/info/statistics/info_statistics_widget.h @@ -14,7 +14,7 @@ namespace Info::Statistics { class Memento final : public ContentMemento { public: Memento(not_null controller); - Memento(not_null peer); + Memento(not_null peer, FullMsgId contextId); ~Memento(); object_ptr createWidget( @@ -42,6 +42,8 @@ private: }; -[[nodiscard]] std::shared_ptr Make(not_null peer); +[[nodiscard]] std::shared_ptr Make( + not_null peer, + FullMsgId contextId); } // namespace Info::Statistics diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index a28acb1068..5608b6a8cb 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -1007,7 +1007,7 @@ void Filler::addViewStatistics() { const auto peer = _peer; _addAction(tr::lng_stats_title(tr::now), [=] { if (const auto strong = weak.get()) { - controller->showSection(Info::Statistics::Make(peer)); + controller->showSection(Info::Statistics::Make(peer, {})); } }, &st::menuIconStats); }