Added second type of info layer for statistics.

This commit is contained in:
23rd 2023-10-08 23:17:45 +03:00 committed by John Preston
parent 3da733520d
commit 01821cd779
9 changed files with 85 additions and 11 deletions

View File

@ -4066,6 +4066,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_stories_link_invalid" = "This link is broken or has expired."; "lng_stories_link_invalid" = "This link is broken or has expired.";
"lng_stats_title" = "Statistics"; "lng_stats_title" = "Statistics";
"lng_stats_message_title" = "Message Statistic";
"lng_stats_zoom_out" = "Zoom Out"; "lng_stats_zoom_out" = "Zoom Out";
"lng_stats_overview_title" = "Overview"; "lng_stats_overview_title" = "Overview";

View File

@ -339,6 +339,8 @@ Key ContentMemento::key() const {
return Settings::Tag{ self }; return Settings::Tag{ self };
} else if (const auto peer = storiesPeer()) { } else if (const auto peer = storiesPeer()) {
return Stories::Tag{ peer, storiesTab() }; return Stories::Tag{ peer, storiesTab() };
} else if (const auto peer = statisticsPeer()) {
return Statistics::Tag{ peer, statisticsContextId() };
} else { } else {
return Downloads::Tag(); return Downloads::Tag();
} }
@ -375,4 +377,9 @@ ContentMemento::ContentMemento(Stories::Tag stories)
, _storiesTab(stories.tab) { , _storiesTab(stories.tab) {
} }
ContentMemento::ContentMemento(Statistics::Tag statistics)
: _statisticsPeer(statistics.peer)
, _statisticsContextId(statistics.contextId) {
}
} // namespace Info } // namespace Info

View File

@ -41,6 +41,10 @@ struct Tag;
enum class Tab; enum class Tab;
} // namespace Info::Stories } // namespace Info::Stories
namespace Info::Statistics {
struct Tag;
} // namespace Info::Statistics
namespace Info { namespace Info {
class ContentMemento; class ContentMemento;
@ -163,6 +167,7 @@ public:
explicit ContentMemento(Settings::Tag settings); explicit ContentMemento(Settings::Tag settings);
explicit ContentMemento(Downloads::Tag downloads); explicit ContentMemento(Downloads::Tag downloads);
explicit ContentMemento(Stories::Tag stories); explicit ContentMemento(Stories::Tag stories);
explicit ContentMemento(Statistics::Tag statistics);
ContentMemento(not_null<PollData*> poll, FullMsgId contextId) ContentMemento(not_null<PollData*> poll, FullMsgId contextId)
: _poll(poll) : _poll(poll)
, _pollContextId(contextId) { , _pollContextId(contextId) {
@ -191,6 +196,12 @@ public:
Stories::Tab storiesTab() const { Stories::Tab storiesTab() const {
return _storiesTab; return _storiesTab;
} }
PeerData *statisticsPeer() const {
return _statisticsPeer;
}
FullMsgId statisticsContextId() const {
return _statisticsContextId;
}
PollData *poll() const { PollData *poll() const {
return _poll; return _poll;
} }
@ -235,6 +246,8 @@ private:
UserData * const _settingsSelf = nullptr; UserData * const _settingsSelf = nullptr;
PeerData * const _storiesPeer = nullptr; PeerData * const _storiesPeer = nullptr;
Stories::Tab _storiesTab = {}; Stories::Tab _storiesTab = {};
PeerData * const _statisticsPeer = nullptr;
const FullMsgId _statisticsContextId;
PollData * const _poll = nullptr; PollData * const _poll = nullptr;
const FullMsgId _pollContextId; const FullMsgId _pollContextId;

View File

@ -43,6 +43,9 @@ Key::Key(Downloads::Tag downloads) : _value(downloads) {
Key::Key(Stories::Tag stories) : _value(stories) { Key::Key(Stories::Tag stories) : _value(stories) {
} }
Key::Key(Statistics::Tag statistics) : _value(statistics) {
}
Key::Key(not_null<PollData*> poll, FullMsgId contextId) Key::Key(not_null<PollData*> poll, FullMsgId contextId)
: _value(PollKey{ poll, contextId }) { : _value(PollKey{ poll, contextId }) {
} }
@ -89,6 +92,20 @@ Stories::Tab Key::storiesTab() const {
return Stories::Tab(); return Stories::Tab();
} }
PeerData *Key::statisticsPeer() const {
if (const auto tag = std::get_if<Statistics::Tag>(&_value)) {
return tag->peer;
}
return nullptr;
}
FullMsgId Key::statisticsContextId() const {
if (const auto tag = std::get_if<Statistics::Tag>(&_value)) {
return tag->contextId;
}
return {};
}
PollData *Key::poll() const { PollData *Key::poll() const {
if (const auto data = std::get_if<PollKey>(&_value)) { if (const auto data = std::get_if<PollKey>(&_value)) {
return data->poll; return data->poll;

View File

@ -55,6 +55,20 @@ struct Tag {
} // namespace Info::Stories } // namespace Info::Stories
namespace Info::Statistics {
struct Tag {
explicit Tag(not_null<PeerData*> peer, FullMsgId contextId)
: peer(peer)
, contextId(contextId) {
}
not_null<PeerData*> peer;
FullMsgId contextId;
};
} // namespace Info::Statistics
namespace Info { namespace Info {
class Key { class Key {
@ -64,6 +78,7 @@ public:
Key(Settings::Tag settings); Key(Settings::Tag settings);
Key(Downloads::Tag downloads); Key(Downloads::Tag downloads);
Key(Stories::Tag stories); Key(Stories::Tag stories);
Key(Statistics::Tag statistics);
Key(not_null<PollData*> poll, FullMsgId contextId); Key(not_null<PollData*> poll, FullMsgId contextId);
PeerData *peer() const; PeerData *peer() const;
@ -72,6 +87,8 @@ public:
bool isDownloads() const; bool isDownloads() const;
PeerData *storiesPeer() const; PeerData *storiesPeer() const;
Stories::Tab storiesTab() const; Stories::Tab storiesTab() const;
PeerData *statisticsPeer() const;
FullMsgId statisticsContextId() const;
PollData *poll() const; PollData *poll() const;
FullMsgId pollContextId() const; FullMsgId pollContextId() const;
@ -86,6 +103,7 @@ private:
Settings::Tag, Settings::Tag,
Downloads::Tag, Downloads::Tag,
Stories::Tag, Stories::Tag,
Statistics::Tag,
PollKey> _value; PollKey> _value;
}; };
@ -169,6 +187,12 @@ public:
[[nodiscard]] Stories::Tab storiesTab() const { [[nodiscard]] Stories::Tab storiesTab() const {
return key().storiesTab(); return key().storiesTab();
} }
[[nodiscard]] PeerData *statisticsPeer() const {
return key().statisticsPeer();
}
[[nodiscard]] FullMsgId statisticsContextId() const {
return key().statisticsContextId();
}
[[nodiscard]] PollData *poll() const; [[nodiscard]] PollData *poll() const;
[[nodiscard]] FullMsgId pollContextId() const { [[nodiscard]] FullMsgId pollContextId() const {
return key().pollContextId(); return key().pollContextId();

View File

@ -250,7 +250,10 @@ Dialogs::RowDescriptor WrapWidget::activeChat() const {
storiesPeer->owner().history(storiesPeer), storiesPeer->owner().history(storiesPeer),
FullMsgId()) FullMsgId())
: Dialogs::RowDescriptor(); : Dialogs::RowDescriptor();
} else if (key().settingsSelf() || key().isDownloads() || key().poll()) { } else if (key().settingsSelf()
|| key().isDownloads()
|| key().poll()
|| key().statisticsPeer()) {
return Dialogs::RowDescriptor(); return Dialogs::RowDescriptor();
} }
Unexpected("Owner in WrapWidget::activeChat()."); Unexpected("Owner in WrapWidget::activeChat().");

View File

@ -484,11 +484,14 @@ void FillRecentPosts(
} // namespace } // namespace
Memento::Memento(not_null<Controller*> controller) Memento::Memento(not_null<Controller*> controller)
: Memento(controller->peer()) { : ContentMemento(Tag{
controller->statisticsPeer(),
controller->statisticsContextId(),
}) {
} }
Memento::Memento(not_null<PeerData*> peer) Memento::Memento(not_null<PeerData*> peer, FullMsgId contextId)
: ContentMemento(peer, nullptr, {}) { : ContentMemento(Tag{ peer, contextId }) {
} }
Memento::~Memento() = default; Memento::~Memento() = default;
@ -509,7 +512,7 @@ Widget::Widget(
QWidget *parent, QWidget *parent,
not_null<Controller*> controller) not_null<Controller*> controller)
: ContentWidget(parent, controller) { : ContentWidget(parent, controller) {
const auto peer = controller->peer(); const auto peer = controller->statisticsPeer();
if (!peer) { if (!peer) {
return; return;
} }
@ -556,7 +559,9 @@ bool Widget::showInternal(not_null<ContentMemento*> memento) {
} }
rpl::producer<QString> Widget::title() { rpl::producer<QString> Widget::title() {
return tr::lng_stats_title(); return controller()->key().statisticsContextId()
? tr::lng_stats_message_title()
: tr::lng_stats_title();
} }
rpl::producer<bool> Widget::desiredShadowVisibility() const { rpl::producer<bool> Widget::desiredShadowVisibility() const {
@ -572,11 +577,13 @@ std::shared_ptr<ContentMemento> Widget::doCreateMemento() {
return result; return result;
} }
std::shared_ptr<Info::Memento> Make(not_null<PeerData*> peer) { std::shared_ptr<Info::Memento> Make(
not_null<PeerData*> peer,
FullMsgId contextId) {
return std::make_shared<Info::Memento>( return std::make_shared<Info::Memento>(
std::vector<std::shared_ptr<ContentMemento>>( std::vector<std::shared_ptr<ContentMemento>>(
1, 1,
std::make_shared<Memento>(peer))); std::make_shared<Memento>(peer, contextId)));
} }
} // namespace Info::Statistics } // namespace Info::Statistics

View File

@ -14,7 +14,7 @@ namespace Info::Statistics {
class Memento final : public ContentMemento { class Memento final : public ContentMemento {
public: public:
Memento(not_null<Controller*> controller); Memento(not_null<Controller*> controller);
Memento(not_null<PeerData*> peer); Memento(not_null<PeerData*> peer, FullMsgId contextId);
~Memento(); ~Memento();
object_ptr<ContentWidget> createWidget( object_ptr<ContentWidget> createWidget(
@ -42,6 +42,8 @@ private:
}; };
[[nodiscard]] std::shared_ptr<Info::Memento> Make(not_null<PeerData*> peer); [[nodiscard]] std::shared_ptr<Info::Memento> Make(
not_null<PeerData*> peer,
FullMsgId contextId);
} // namespace Info::Statistics } // namespace Info::Statistics

View File

@ -1007,7 +1007,7 @@ void Filler::addViewStatistics() {
const auto peer = _peer; const auto peer = _peer;
_addAction(tr::lng_stats_title(tr::now), [=] { _addAction(tr::lng_stats_title(tr::now), [=] {
if (const auto strong = weak.get()) { if (const auto strong = weak.get()) {
controller->showSection(Info::Statistics::Make(peer)); controller->showSection(Info::Statistics::Make(peer, {}));
} }
}, &st::menuIconStats); }, &st::menuIconStats);
} }