From 089432be5e02a09676d63492f652f98d49135763 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 28 Aug 2023 20:52:08 +0300 Subject: [PATCH] Added icon for forwarded messages in dialogs list. --- Telegram/Resources/icons/mini_forward.png | Bin 0 -> 337 bytes Telegram/Resources/icons/mini_forward@2x.png | Bin 0 -> 527 bytes Telegram/Resources/icons/mini_forward@3x.png | Bin 0 -> 772 bytes Telegram/SourceFiles/dialogs/dialogs.style | 5 +++++ .../dialogs/ui/dialogs_message_view.cpp | 16 ++++++++++++++-- .../dialogs/ui/dialogs_message_view.h | 1 + Telegram/SourceFiles/history/history_item.cpp | 3 +++ .../history/view/history_view_item_preview.h | 2 ++ .../window/notifications_manager.cpp | 18 ++++++++++++++---- 9 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 Telegram/Resources/icons/mini_forward.png create mode 100644 Telegram/Resources/icons/mini_forward@2x.png create mode 100644 Telegram/Resources/icons/mini_forward@3x.png diff --git a/Telegram/Resources/icons/mini_forward.png b/Telegram/Resources/icons/mini_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..0b12af15d0dac8b19147b9d028e133f6f8e5c890 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K$ec6+)whG>W; zCrDT+*xSzs0+#P~b$@<*dU|@(rcEv{1qB2u{{8v+|NsB_HkFH(FK_qnpEm8<$H&JT zy&gVze7s*zPw&Rpi0J70A0HUkiJbfK_4V}4n~itL>FKTe{r&x6QAOjpeKjlBuI*j7 zaLX2vbuXTupI`9p>}>O?Q>I)9W&Tp00i_>zopr E0J(*Ck44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSVF5FO4N|zKE$K5*S*53oV~7WD za)JcwVnv7V0uLTN5)u$tuyE^av)rox|Mu?PYrFQ1McJDh|NsB5|MNpoPR>u*T0xBA z?T_#8<2^k&zrJmVX4t~aq2@d5$dMy1ve^}tm1obK$-A?I(NM~7UG(<8$&)A7SW8Gs zE?%^#PsWnTTyQeumuVX|7+98hczC?IwUzs_i_gT_=J{HhniJF7r%bu>_V#wevxiha zeR}FGEG(S#mZ9y(*VoqzXSRCFyx=$CE>LT*EPj@ek+EQ<+6mk8cQTHq3asnat=n;@ z!@cI@B-Nap9GA#~KR*g>*b=8^<>#|6GhgHr9v*%?>&Wx-^BXUAXnqCKXU_O6>S@zh zwQgP8>`y?iBp97Naf0C%*F@LPcdoCGudS{1G>~0Ua(bGs0Qa`MyQ`KiZCxh0b4A71 zSE2^_i!~L_)c*TpdEsGYWo5+FL%IxUf~l#gYqB^v-re18Ze%1hU8#fhK!cE=;K8MB wN+0jsxg%+u77(&4Fy;S>XBPz)IC3yBczu7pRm%NwGAJ@UUHx3vIVCg!0F>F#Hvj+t literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mini_forward@3x.png b/Telegram/Resources/icons/mini_forward@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..19cac4700ebfa851de3026975d9f17e08b7da48b GIT binary patch literal 772 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HOqx8!BWP0D z>BjCN2a%2M*O%W{J8PXbFHLT1`^@IFc|ZT{yWfA`=lth0mxb#;$Ud+>P~PzV!25Rx zjP-0*U!8UOX^PR!43k4oPo7*Jpi%SR_R`BO4hj#Rv@YEdwDJ$b!Tg;u)4Y~OSovx^%P4yPD>t+MStS~UB3#Xkpy6W6k~ z%FD~=ZJ#}nc{W3w$nwjQJZ#4w8-5I$?04?@=KJrDi+N_MO!T;S?_Si}YhSBWkKW(y zqarjVOoGi;?tIqPUE)5*^UgnaRT5-lI^?7ymcBW1mdCN^UN>jG>B4Pu{2rXYnq_*- z!|h;#!G#QyIROhKGFDyHN|spk;Pq?owPD3cr&5eM5<50U=p2)K@%5{yAzSRT0*eTy zl_9InrZvwyvchJrpWXa^Ro*G8lRb~|lpHMEUAi;oO=iM7dl|kLm0wOhEy^^Tee<$I zs*T+8^A7v1XZpm&#aUc*Fnr_wQh8zh<(DNJBQBhtb#|H4!UtZ-1`-;{42$B{@87>) zy4P*thx>JnY16c(dTsbtxU}(CfQAdxtg~qw@`BI(T_UR-IKyk{hTM%0wVOWNeOuP( z@Zjgqcj2f0J4`>VD#MqY!INkx!&l$%>+im}_3Fno{XHB$MC^^zUpndUgS!3f3KjC2 z^94_S7t7cicRR;y62r$ydF4SmVu`-JE=tEA3tr?)nLmI2hQwLtpTAJ$4|H1`n32By x_S0QG$xE6uWfx259|gug!+pkm%=@=6*E2M!wx{e$eFjQ^44$rjF6*2UngE@2PssoP literal 0 HcmV?d00001 diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index 622016bb8..c2d287b31 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -436,6 +436,11 @@ dialogsMiniPreviewSkip: 2px; dialogsMiniPreviewRight: 3px; dialogsMiniPlay: icon{{ "dialogs/dialogs_mini_play", videoPlayIconFg }}; +dialogsMiniForwardIcon: icon {{ "mini_forward", dialogsTextFg, point(0px, 1px) }}; +dialogsMiniForwardIconOver: icon {{ "mini_forward", dialogsTextFgOver, point(0px, 1px) }}; +dialogsMiniForwardIconActive: icon {{ "mini_forward", dialogsTextFgActive, point(0px, 1px) }}; +dialogsMiniForwardIconSkip: 2px; + dialogsUnreadMention: icon{{ "dialogs/dialogs_mention", dialogsUnreadFg }}; dialogsUnreadMentionOver: icon{{ "dialogs/dialogs_mention", dialogsUnreadFgOver }}; dialogsUnreadMentionActive: icon{{ "dialogs/dialogs_mention", dialogsUnreadFgActive }}; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp index b1f59fb43..af4d0d3c3 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp @@ -16,7 +16,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/spoiler_mess.h" #include "ui/text/text_options.h" #include "ui/text/text_utilities.h" -#include "ui/image/image.h" #include "ui/painter.h" #include "ui/power_saving.h" #include "core/ui_integration.h" @@ -159,6 +158,7 @@ void MessageView::prepare( options.ignoreTopic = true; options.spoilerLoginCode = true; auto preview = item->toPreview(options); + _displayMiniForwardIcon = preview.forwardedMessage; const auto hasImages = !preview.images.empty(); const auto history = item->history(); const auto context = Core::MarkedTextContext{ @@ -169,7 +169,7 @@ void MessageView::prepare( const auto senderTill = (preview.arrowInTextPosition > 0) ? preview.arrowInTextPosition : preview.imagesInTextPosition; - if (hasImages && senderTill > 0) { + if ((hasImages || _displayMiniForwardIcon) && senderTill > 0) { auto sender = Text::Mid(preview.text, 0, senderTill); TextUtilities::Trim(sender); _senderCache.setMarkedText( @@ -314,6 +314,18 @@ void MessageView::paint( rect.setLeft(rect.x() + skip); } } + + if (_displayMiniForwardIcon) { + const auto &icon = context.active + ? st::dialogsMiniForwardIconActive + : context.selected + ? st::dialogsMiniForwardIconOver + : st::dialogsMiniForwardIcon; + icon.paint(p, rect.topLeft(), rect.width()); + rect.setLeft(rect.x() + + icon.width() + + st::dialogsMiniForwardIconSkip); + } for (const auto &image : _imagesCache) { if (rect.width() < st::dialogsMiniPreview) { break; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.h b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.h index 87b69b435..a23dbea49 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.h @@ -92,6 +92,7 @@ private: mutable std::vector _imagesCache; mutable std::unique_ptr _spoiler; mutable std::unique_ptr _loadingContext; + mutable bool _displayMiniForwardIcon = false; }; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 27727f94d..3357ed3ba 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -2958,6 +2958,9 @@ ItemPreview HistoryItem::toPreview(ToPreviewOptions options) const { ? tr::lng_from_you(tr::now) : sender->shortName(); }; + if (!options.ignoreForwardedMessage) { + result.forwardedMessage = Get() != nullptr; + } const auto fromForwarded = [&]() -> std::optional { if (const auto forwarded = Get()) { return forwarded->originalSender diff --git a/Telegram/SourceFiles/history/view/history_view_item_preview.h b/Telegram/SourceFiles/history/view/history_view_item_preview.h index 7ac0a2b18..cb15afb6e 100644 --- a/Telegram/SourceFiles/history/view/history_view_item_preview.h +++ b/Telegram/SourceFiles/history/view/history_view_item_preview.h @@ -28,6 +28,7 @@ struct ItemPreview { int arrowInTextPosition = -1; int imagesInTextPosition = 0; std::any loadingContext; + bool forwardedMessage = false; }; struct ToPreviewOptions { @@ -37,6 +38,7 @@ struct ToPreviewOptions { bool generateImages = true; bool ignoreGroup = false; bool ignoreTopic = true; + bool ignoreForwardedMessage = false; bool spoilerLoginCode = false; bool translated = false; }; diff --git a/Telegram/SourceFiles/window/notifications_manager.cpp b/Telegram/SourceFiles/window/notifications_manager.cpp index 5a52f4480..c03080c7e 100644 --- a/Telegram/SourceFiles/window/notifications_manager.cpp +++ b/Telegram/SourceFiles/window/notifications_manager.cpp @@ -66,7 +66,15 @@ constexpr auto kSystemAlertDuration = crl::time(0); return result; } -QString TextWithPermanentSpoiler(const TextWithEntities &textWithEntities) { +[[nodiscard]] QString TextWithForwardedChar( + const QString &text, + bool forwarded) { + static const auto result = QString::fromUtf8("\xE2\x9E\xA1\xEF\xB8\x8F"); + return forwarded ? result + text : text; +} + +[[nodiscard]] QString TextWithPermanentSpoiler( + const TextWithEntities &textWithEntities) { auto text = textWithEntities.text; for (const auto &e : textWithEntities.entities) { if (e.type() == EntityType::Spoiler) { @@ -1175,9 +1183,11 @@ void NativeManager::doShowNotification(NotificationFields &&fields) { ? tr::lng_forward_messages(tr::now, lt_count, fields.forwardedCount) : item->groupId() ? tr::lng_in_dlg_album(tr::now) - : TextWithPermanentSpoiler(item->notificationText({ - .spoilerLoginCode = options.spoilerLoginCode, - })); + : TextWithForwardedChar( + TextWithPermanentSpoiler(item->notificationText({ + .spoilerLoginCode = options.spoilerLoginCode, + })), + (fields.forwardedCount == 1)); // #TODO optimize auto userpicView = item->history()->peer->createUserpicView();