From 6a87fef8510fb5e4f9b72f9b1e938d103a3f49a8 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 22 Nov 2023 07:49:59 +0300 Subject: [PATCH] Added reactions count to recent posts in list from statistics info. --- .../info_statistics_inner_widget.cpp | 10 +- .../info_statistics_recent_message.cpp | 105 ++++++++++-------- .../info_statistics_recent_message.h | 7 +- .../SourceFiles/statistics/statistics.style | 2 + 4 files changed, 68 insertions(+), 56 deletions(-) diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_inner_widget.cpp b/Telegram/SourceFiles/info/statistics/info_statistics_inner_widget.cpp index ef2504eec..60ac08041 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_inner_widget.cpp +++ b/Telegram/SourceFiles/info/statistics/info_statistics_inner_widget.cpp @@ -621,7 +621,7 @@ void InnerWidget::fill() { if (const auto i = _peer->owner().message(_contextId)) { Ui::AddSkip(inner); const auto preview = inner->add( - object_ptr(this, i, -1, -1, QImage())); + object_ptr(this, i, QImage())); AddContextMenu(preview, _controller, i); Ui::AddSkip(inner); Ui::AddDivider(inner); @@ -719,15 +719,15 @@ void InnerWidget::fillRecentPosts() { ? Ui::CreateChild( button, maybeItem, - info.viewsCount, - info.forwardsCount, std::move(cachedPreview)) : Ui::CreateChild( button, maybeStory, - info.viewsCount, - info.forwardsCount, std::move(cachedPreview)); + raw->setInfo( + info.viewsCount, + info.forwardsCount, + info.reactionsCount); if (maybeItem) { AddContextMenu(button, _controller, maybeItem); diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_recent_message.cpp b/Telegram/SourceFiles/info/statistics/info_statistics_recent_message.cpp index b1aada079..279b07f92 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_recent_message.cpp +++ b/Telegram/SourceFiles/info/statistics/info_statistics_recent_message.cpp @@ -74,32 +74,12 @@ namespace { MessagePreview::MessagePreview( not_null parent, not_null item, - int views, - int shares, QImage cachedPreview) : Ui::RpWidget(parent) , _messageId(item->fullId()) , _date( st::statisticsHeaderTitleTextStyle, Ui::FormatDateTime(ItemDateTime(item))) -, _views( - st::defaultPeerListItem.nameStyle, - (views >= 0) - ? tr::lng_stats_recent_messages_views( - tr::now, - lt_count_decimal, - views) - : QString()) -, _shares( - st::statisticsHeaderTitleTextStyle, - (shares >= 0) - ? tr::lng_stats_recent_messages_shares( - tr::now, - lt_count_decimal, - shares) - : QString()) -, _viewsWidth(_views.maxWidth()) -, _sharesWidth(_shares.maxWidth()) , _preview(std::move(cachedPreview)) { _text.setMarkedText( st::defaultPeerListItem.nameStyle, @@ -109,7 +89,7 @@ MessagePreview::MessagePreview( .session = &item->history()->session(), .customEmojiRepaint = [=] { update(); }, }); - if (item->media()->hasSpoiler()) { + if (item->media() && item->media()->hasSpoiler()) { _spoiler = std::make_unique([=] { update(); }); } if (_preview.isNull()) { @@ -129,32 +109,12 @@ MessagePreview::MessagePreview( MessagePreview::MessagePreview( not_null parent, not_null story, - int views, - int shares, QImage cachedPreview) : Ui::RpWidget(parent) , _storyId(story->fullId()) , _date( st::statisticsHeaderTitleTextStyle, Ui::FormatDateTime(base::unixtime::parse(story->date()))) -, _views( - st::defaultPeerListItem.nameStyle, - (views >= 0) - ? tr::lng_stats_recent_messages_views( - tr::now, - lt_count_decimal, - views) - : QString()) -, _shares( - st::statisticsHeaderTitleTextStyle, - (shares >= 0) - ? tr::lng_stats_recent_messages_shares( - tr::now, - lt_count_decimal, - shares) - : QString()) -, _viewsWidth(_views.maxWidth()) -, _sharesWidth(_shares.maxWidth()) , _preview(std::move(cachedPreview)) { _text.setMarkedText( st::defaultPeerListItem.nameStyle, @@ -176,6 +136,26 @@ MessagePreview::MessagePreview( } } +void MessagePreview::setInfo(int views, int shares, int reactions) { + _views = Ui::Text::String( + st::defaultPeerListItem.nameStyle, + (views >= 0) + ? tr::lng_stats_recent_messages_views( + tr::now, + lt_count_decimal, + views) + : QString()); + _shares = Ui::Text::String( + st::statisticsHeaderTitleTextStyle, + (shares >= 0) ? Lang::FormatCountDecimal(shares) : QString()); + _reactions = Ui::Text::String( + st::statisticsHeaderTitleTextStyle, + (reactions >= 0) ? Lang::FormatCountDecimal(reactions) : QString()); + _viewsWidth = (_views.maxWidth()); + _sharesWidth = (_shares.maxWidth()); + _reactionsWidth = (_reactions.maxWidth()); +} + void MessagePreview::processPreview() { const auto session = _photoMedia ? &_photoMedia->owner()->session() @@ -234,7 +214,17 @@ void MessagePreview::paintEvent(QPaintEvent *e) { auto p = QPainter(this); const auto padding = st::boxRowPadding.left() / 2; - const auto rightWidth = std::max(_viewsWidth, _sharesWidth) + padding; + const auto rightSubTextWidth = 0 + + (_sharesWidth + ? _sharesWidth + st::statisticsRecentPostShareIcon.width() + : 0) + + (_reactionsWidth + ? _reactionsWidth + + st::statisticsRecentPostReactionIcon.width() + + st::statisticsChartRulerCaptionSkip + : 0); + const auto rightWidth = std::max(_viewsWidth, rightSubTextWidth) + + padding; const auto left = _preview.isNull() ? st::peerListBoxItem.photoPosition.x() : st::peerListBoxItem.namePosition.x(); @@ -292,11 +282,32 @@ void MessagePreview::paintEvent(QPaintEvent *e) { .outerWidth = width() - left, .availableWidth = width() - rightWidth - left, }); - _shares.draw(p, { - .position = { width() - _sharesWidth, bottomTextTop }, - .outerWidth = _sharesWidth, - .availableWidth = _sharesWidth, - }); + { + auto right = width() - _sharesWidth; + _shares.draw(p, { + .position = { right, bottomTextTop }, + .outerWidth = _sharesWidth, + .availableWidth = _sharesWidth, + }); + const auto bottomTextBottom = bottomTextTop + + st::statisticsHeaderTitleTextStyle.font->height; + if (_sharesWidth) { + const auto &icon = st::statisticsRecentPostShareIcon; + const auto iconTop = bottomTextBottom - icon.height(); + icon.paint(p, { (right -= icon.width()), iconTop }, width()); + } + right -= _reactionsWidth + st::statisticsChartRulerCaptionSkip; + _reactions.draw(p, { + .position = { right, bottomTextTop }, + .outerWidth = _reactionsWidth, + .availableWidth = _reactionsWidth, + }); + if (_reactionsWidth) { + const auto &icon = st::statisticsRecentPostReactionIcon; + const auto iconTop = bottomTextBottom - icon.height(); + icon.paint(p, { (right -= icon.width()), iconTop }, width()); + } + } } void MessagePreview::saveState(SavedState &state) const { diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_recent_message.h b/Telegram/SourceFiles/info/statistics/info_statistics_recent_message.h index 217c00041..194c61726 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_recent_message.h +++ b/Telegram/SourceFiles/info/statistics/info_statistics_recent_message.h @@ -30,16 +30,13 @@ public: MessagePreview( not_null parent, not_null item, - int views, - int shares, QImage cachedPreview); MessagePreview( not_null parent, not_null story, - int views, - int shares, QImage cachedPreview); + void setInfo(int views, int shares, int reactions); void saveState(SavedState &state) const; protected: @@ -56,9 +53,11 @@ private: Ui::Text::String _date; Ui::Text::String _views; Ui::Text::String _shares; + Ui::Text::String _reactions; int _viewsWidth = 0; int _sharesWidth = 0; + int _reactionsWidth = 0; QImage _cornerCache; QImage _preview; diff --git a/Telegram/SourceFiles/statistics/statistics.style b/Telegram/SourceFiles/statistics/statistics.style index 8fce0f2b9..2e0b594a4 100644 --- a/Telegram/SourceFiles/statistics/statistics.style +++ b/Telegram/SourceFiles/statistics/statistics.style @@ -104,6 +104,8 @@ statisticsRecentPostButton: SettingsButton(defaultSettingsButton) { height: 56px; padding: margins(7px, 0px, 24px, 0px); } +statisticsRecentPostShareIcon: icon {{ "menu/forward", windowSubTextFg }}; +statisticsRecentPostReactionIcon: icon {{ "menu/group_reactions", windowSubTextFg }}; statisticsShowMoreButton: SettingsButton(defaultSettingsButton) { textFg: lightButtonFg;