From 7877cb0b3a60d1274b26fba3f3197fb1e57307a7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 4 Aug 2023 08:07:37 +0200 Subject: [PATCH] Implement stories premium promo. --- .../settings/premium/stories_caption.png | Bin 0 -> 372 bytes .../settings/premium/stories_caption@2x.png | Bin 0 -> 512 bytes .../settings/premium/stories_caption@3x.png | Bin 0 -> 657 bytes .../icons/settings/premium/stories_links.png | Bin 0 -> 467 bytes .../settings/premium/stories_links@2x.png | Bin 0 -> 883 bytes .../settings/premium/stories_links@3x.png | Bin 0 -> 1356 bytes .../icons/settings/premium/stories_order.png | Bin 0 -> 835 bytes .../settings/premium/stories_order@2x.png | Bin 0 -> 1637 bytes .../settings/premium/stories_order@3x.png | Bin 0 -> 2339 bytes .../icons/settings/premium/timer.png | Bin 0 -> 608 bytes .../icons/settings/premium/timer@2x.png | Bin 0 -> 1250 bytes .../icons/settings/premium/timer@3x.png | Bin 0 -> 1883 bytes Telegram/Resources/langs/lang.strings | 26 ++++ .../SourceFiles/boxes/premium_preview_box.cpp | 147 ++++++++++++++++-- .../SourceFiles/boxes/premium_preview_box.h | 6 + .../media/stories/media_stories_stealth.cpp | 7 +- .../media/view/media_view_overlay_widget.cpp | 5 +- Telegram/SourceFiles/settings/settings.style | 12 ++ .../SourceFiles/settings/settings_premium.cpp | 63 ++------ .../ui/effects/premium_graphics.cpp | 134 ++++++++++------ .../SourceFiles/ui/effects/premium_graphics.h | 5 +- 21 files changed, 292 insertions(+), 113 deletions(-) create mode 100644 Telegram/Resources/icons/settings/premium/stories_caption.png create mode 100644 Telegram/Resources/icons/settings/premium/stories_caption@2x.png create mode 100644 Telegram/Resources/icons/settings/premium/stories_caption@3x.png create mode 100644 Telegram/Resources/icons/settings/premium/stories_links.png create mode 100644 Telegram/Resources/icons/settings/premium/stories_links@2x.png create mode 100644 Telegram/Resources/icons/settings/premium/stories_links@3x.png create mode 100644 Telegram/Resources/icons/settings/premium/stories_order.png create mode 100644 Telegram/Resources/icons/settings/premium/stories_order@2x.png create mode 100644 Telegram/Resources/icons/settings/premium/stories_order@3x.png create mode 100644 Telegram/Resources/icons/settings/premium/timer.png create mode 100644 Telegram/Resources/icons/settings/premium/timer@2x.png create mode 100644 Telegram/Resources/icons/settings/premium/timer@3x.png diff --git a/Telegram/Resources/icons/settings/premium/stories_caption.png b/Telegram/Resources/icons/settings/premium/stories_caption.png new file mode 100644 index 0000000000000000000000000000000000000000..d73bc90686c44b5b3b693f2a7ff6b9ea68f0bbb5 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlfU-Sc#D46zV= z8?=$n#X;nV?0yBO#oxHSrs{uC-Ir$Xuztx`)tI z^hs0CmbhM%bzn)8MPIYR0%=ycwuPCqf)Dh(+SRw{#gi)wUhh)zyfW*5LZrKEV8y)c z?>6U3?>qjJZ^Qg$n&*oH+y%>Txrc`Cdw>7iMxE}a>G1)5k7uZzc3fM>usP>M{_SmP zt5PE`Oo_R(?X7dQ!ZJObK#8_>uY;l*j~BlA9jExi?C82_sgiO_OfK1+cj6GyNZpv? qmKyoU(QB!J*JY9AQ}#}a;@D5C5z4qW_Y@umdq$(csIerl9`oBONB+lyKGCQ z$F)AO=HNBQSf%XWeEi{Dx9P^)4T_8^4J;E52s1uhY5w}gHrcj?i!_XLXBWsEH}U;! z6F==;jotm7rXGH)-Ind`c>JTlqCjbi3TJNYm5B^O4}2T4dX{Bc^)a9Jzx?Iv<+!Hl zdOVdH^%vJ)&%V8l`~=aFje}oR%f#9 z%wH#;y=FAKb!D|pGND9SM>)f6WD%7cNk zK-IzaTc8N5vD6=Te3Z?XfI{EX)z4*}Q$iB}kvqdZ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/premium/stories_caption@3x.png b/Telegram/Resources/icons/settings/premium/stories_caption@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..373884acea3047ca580662a60a7285959c2f99c2 GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbAj}_S@6NF(iZa z?M%Z}ha5y)ed`=pyCtNxyK@d6x^_-4L48NV4i@W;n~Ovhr)CG}uy7YLi#09a5bNq) z@$;8Fmsr#p=^2KN^~-1VTsQwNE3sqdk{}5M1||ghaGpcrOdapx6KR`$Hrm~MS+eW? z`%|y3XKlTk=PsHopVE9rBRj`z_R)KnPBYAWXp&asGW%?s^6$R1y>Z26Npm+QZM^Za z#A~V0@X+&X{!eV(scTy?|)wz(kqQ%a8+&GgwD v7yg^gcaPiRi%A6DFKEeTO`hM!>Hd~&X)P{egw zsuqX-jm3+*JlJ;?2nt^<-J2`DHN@=7%NK8R8{|b;@2*<4qA4`Ape~Wc{>oMUn6QWQ zeO5X4>#C;y61{#Pp){R2-o>BY?OIO6Lar`)wb_R7On*G#1griD9oJmcrr mnSa@Jhpoh9ubS=e)qmONRV;V*TIIb46ri52elF{r5}E)ed$2_S literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/premium/stories_links@2x.png b/Telegram/Resources/icons/settings/premium/stories_links@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..26dfa285efff645450e8e87a5b0874ec3bab64df GIT binary patch literal 883 zcmV-(1C0EMP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NE-AP12R9Fe^m@%p*zfLkonnLsj`%xpH3i64*0a=GmH`{i=^!)tVS z#Kc@#8=({&15pucDrpf8bN5h!a;Ega(l_{XR}(Za=Dxt4u|!6Eu7wRcH{9_ z(AlJHHfv@hZ{Z~SL_EbGiL;Y(VuuaOaA(7bbM6uVgTcUnsegrx%3xwp?-6EiU?ZUe zCRq{$XtI-&LWnHY`jOS-Ha_N@lCkK8pg{{A(E?hGs1^_?7&@kPMfW`Y`{dNL4$6p@ zqNt!bvWdhum7)SvDiw;r`FvJ$YdiS#dcA73I-k#3q1MN4v>urqBC3b}MEIT(z*egj z6*=y4E@>Y$r?mzL4K&%gWfF;2VSIuh!^tV4*zvCNG~D#)UOE(tUvIcSDSK=kRb2Uk zF_$x@#6fAXV}?f|s;(dAPeH1teB!w4O%yhaL0AZkmY3cI6;f3gF~4*b|1_zNQzqDTLv`#Asr002ov JPDHLkV1gwNgiZhe literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/premium/stories_links@3x.png b/Telegram/Resources/icons/settings/premium/stories_links@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fef135b0dbd2215849e7011f6c91eac4e4905b5c GIT binary patch literal 1356 zcmY*ZeK->c7~hA_xy59uNo}*CO_-0CL#(hVcI+{940CSdlxZP7DTlHf))bY{CGvUq zbiQXLjQLzi4BIZbp6)C{sHt8b-stXmZQ}ENxIZf}5P;Lh1^^&00id%rq9sC0003M81c0>) z+^SW8{_9dI!2icvgM|dYHvoW6yT1=9Bwlx^^s&7i$!t))EtZLD;_4b1rR_kYB}Pb? z@JAhEWT;0@cuZfZc_R{S8jHH}ljVW%4h(uxs{Z8LFLw2;QKzH|_Yhr;8Xkp;fgsE+o12@tOeTt~eE(i1llAxaZ*Fc53=A|h;4ZG*IKV;H5WS5F+`P-0 z^E$4st`QLt?bprC&8w=a;BYwV=$N~c6R7%eM^jUOL zByu1t3mA;G##QA#v|a_C(wv^-a5%)lGw8aYoKMzl!_C0?2YuUYi6@9eB9FJV)x^X^ zSy@@q;S=|!r^7O4#>Pw>T9kH*gP4=qd!Mmp^D?dGHYAiay2$b&%a!%kw^&`K(WD0d zDiVdME+M@16sxOEG4b*7g=u$k-5sYqZQR*0sHekS>VV$-oi{Za%`oJ%jX=?x&ZMqO zB$73yu9`byo%-*7VdX<6Ti(4?4#-- zl~8?tE*238fJb%I*4kV(uz)K{h*0;l0)kE^o5gamgT)V7E(S1J#zZueP8)UT&C`V8uClgnf$0ioeJ5wL$5>jT0k5-@8&{p z<6+x7TP5{Ov(lbO7#tHFR(|UiJVxs3lt#(1^$*`21glcw3pX&QB8QSMGfYpK}o#qIQb#?ec8%&DoVM~-n&U(_y;6ReTI89C^PyzViivli!vy@_}JxvxOi zEHxdIiOrw9-LvgT-0t-fnWO((GY4oSgE3q&8){GpyJgXzwY0RvPr1%({mjda`16WA zm!2UXA0MBY5mdIdwW-x=GMUV`6?B)DmiE4_S+Djkf7MlJh-v>L?wixE2ZjgNnhbF- zQ4`PZKkHELN-3B118|+m37_a)3@~R==9?5W(|9FXDf$gtPy$l%yj0cbP?&Jz1Y!hm zPFw+UCOO_nGQBfiLF<_|dXdPFT1ygNb6Jc-V++82YPBq?QTHohW!%)o;tdWBNj=oP zL7S;_P{ynuk9~p~Jo6#U$B_LYnC@`&i5uUzaN(L@Np_%k%qCK>uc6u**!94pTYhZu zNPr19XM|xT;?Dg(^7?h66FBx&QPFmG-&sEn@C#(Uvs*FuNPeUuybJHy`egpTRG)i? HW3vARc8g%i literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/premium/stories_order.png b/Telegram/Resources/icons/settings/premium/stories_order.png new file mode 100644 index 0000000000000000000000000000000000000000..3051561dfe05210a7ae8e69b0d9df5a38b360414 GIT binary patch literal 835 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfoZL$i(`m| z;N1{!@1j7Fy(=Zd+NNZDQBdUOWHNST@6~Z^YFaQ~fm6{>Hl(?&aq@(sD@!I?2&%YG z1V2?Dw1Fp9fr-A8R{jCNDq#Y#+5& zCqoO18Rwrr{#aom_4n7Wq!U$p|2=!Q>}HOU$MyvwTDEfMj~_pN`0(MMKX;yg-pnnL zki9kPXN{fVj=g)oR_(R5y;B%4d-m+BSy$hG2g-cobar;Wefu_tt^`kCPme>Yfkf8U zTYvu8%>Jgke*OB#Pu8y0<%{K>bTVc7^ywQTd{l%OU%Y=W&cU*G?_SwI7cX8c+L^QY zrqzZ2W*oY6{p984g?lf*bdj}+aCdi~=&^)((Ta^54HsX$!K$?K`}glRZ$>_lmX^-X z&sT|@)yCny^wO-S&GSP=a9@#7qsA`6+eX%g?=zEyNTVe{uo*479ew|<4m zM<0I-@Sddk@NdS8_cw3e{Pf9)#pL^wCoUQyPRnF{eS8)uTgV$l&YwS@ot@p^-{0Qh z`1g13@`{QkIjp$;?wwxBEkUtMYKQXwP1HAbFx9Iy>)e?$TR4MOiU>25=dMs)SeuiQkf1QrXHhWAotrmLrftq) z(w%)a%}2aMVs&0@cK-!EJw2f6c`Qx`B7n@I359p#;^QYizH~|GviJvqj-yGAmIc?J z6j=(`Fz0QLUVgc-LQ%k~sH&<<%f{Y*a{7~3ueg+_oqqbJ%(~ds@TP|RJ(**I-t zdW40AEnB|a@MEi!;zW;_`1r-^dS)Jec;GEB3lq<$_SSk9SE+TKzc(d=60oPMpUXO@ GgeCwpK4DP+ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/settings/premium/stories_order@2x.png b/Telegram/Resources/icons/settings/premium/stories_order@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4f64ceb6a11804a5053b8126454e61a74cc447 GIT binary patch literal 1637 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 V`I`(6M6v(?002ovPDHLkV1l-wa@YU> literal 0 HcmV?d00001 diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 70306ad8f..a5cf29ecd 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1828,6 +1828,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_premium_summary_subtitle_gift#other" = "{user} has gifted you a {count}-months subscription for Telegram Premium."; "lng_premium_summary_subtitle_gift_me#one" = "You gifted {user} a {count}-month subscription for Telegram Premium."; "lng_premium_summary_subtitle_gift_me#other" = "You gifted {user} a {count}-months subscription for Telegram Premium."; +"lng_premium_summary_subtitle_stories" = "Upgraded Stories"; +"lng_premium_summary_about_stories" = "Priority order, stealth mode, permanent views history and more."; "lng_premium_summary_subtitle_double_limits" = "Doubled Limits"; "lng_premium_summary_about_double_limits" = "Up to 1000 channels, 20 folders, 10 pins, 20 public links, 4 accounts and more."; "lng_premium_summary_subtitle_more_upload" = "4Gb Upload Size"; @@ -1861,6 +1863,30 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_premium_success" = "You've successfully subscribed to Telegram Premium!"; "lng_premium_unavailable" = "This feature requires subscription to **Telegram Premium**.\n\nUnfortunately, **Telegram Premium** is not available in your region."; +// Upgraded Stories. +"lng_premium_stories_subtitle_order" = "Priority Order"; +"lng_premium_stories_about_order" = "Get more views as your stories are always displayed first."; + +"lng_premium_stories_subtitle_stealth" = "Stealth Mode"; +"lng_premium_stories_about_stealth" = "Hide the fact that you viewed other people's stories."; + +"lng_premium_stories_subtitle_views" = "Permanent Views History"; +"lng_premium_stories_about_views" = "Check who opens your stories – even after they expire."; + +"lng_premium_stories_subtitle_expiration" = "Expiration Durations*"; +"lng_premium_stories_about_expiration" = "Set custom expiration durations like 6 or 48 hours for your stories."; + +"lng_premium_stories_subtitle_download" = "Download Stories"; +"lng_premium_stories_about_download" = "Save other people's unprotected stories to your disk."; + +"lng_premium_stories_subtitle_caption" = "Longer Captions*"; +"lng_premium_stories_about_caption" = "Add ten times longer captions to your stories – up to 2048 symbols."; + +"lng_premium_stories_subtitle_links" = "Links and Formatting*"; +"lng_premium_stories_about_links" = "Add links and formatting in captions of your stories."; + +"lng_premium_stories_about_mobile" = "* Available when posting stories from Telegram apps for iOS and Android."; + // Doubled Limits. "lng_premium_double_limits_subtitle_channels" = "Groups and Channels"; "lng_premium_double_limits_about_channels#one" = "Join up to {count} channels and large groups"; diff --git a/Telegram/SourceFiles/boxes/premium_preview_box.cpp b/Telegram/SourceFiles/boxes/premium_preview_box.cpp index 20581a726..6505e31e6 100644 --- a/Telegram/SourceFiles/boxes/premium_preview_box.cpp +++ b/Telegram/SourceFiles/boxes/premium_preview_box.cpp @@ -32,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/padding_wrap.h" #include "ui/boxes/confirm_box.h" #include "ui/painter.h" +#include "settings/settings_common.h" #include "settings/settings_premium.h" #include "lottie/lottie_single_player.h" #include "history/view/media/history_view_sticker.h" @@ -92,6 +93,10 @@ void PreloadSticker(const std::shared_ptr &media) { [[nodiscard]] rpl::producer SectionTitle(PremiumPreview section) { switch (section) { + case PremiumPreview::Stories: + return tr::lng_premium_summary_subtitle_stories(); + case PremiumPreview::DoubleLimits: + return tr::lng_premium_summary_subtitle_double_limits(); case PremiumPreview::MoreUpload: return tr::lng_premium_summary_subtitle_more_upload(); case PremiumPreview::FasterDownload: @@ -122,6 +127,10 @@ void PreloadSticker(const std::shared_ptr &media) { [[nodiscard]] rpl::producer SectionAbout(PremiumPreview section) { switch (section) { + case PremiumPreview::Stories: + return tr::lng_premium_summary_about_stories(); + case PremiumPreview::DoubleLimits: + return tr::lng_premium_summary_about_double_limits(); case PremiumPreview::MoreUpload: return tr::lng_premium_summary_about_more_upload(); case PremiumPreview::FasterDownload: @@ -1117,6 +1126,56 @@ void Show(std::shared_ptr show, QImage back) { } } +void DecorateListPromoBox( + not_null box, + std::shared_ptr show, + const Descriptor &descriptor) { + const auto session = &show->session(); + + box->addTopButton(st::boxTitleClose, [=] { + box->closeBox(); + }); + + Data::AmPremiumValue( + session + ) | rpl::skip(1) | rpl::start_with_next([=] { + box->closeBox(); + }, box->lifetime()); + + if (const auto &hidden = descriptor.hiddenCallback) { + box->boxClosing() | rpl::start_with_next(hidden, box->lifetime()); + } + + if (session->premium()) { + box->addButton(tr::lng_close(), [=] { + box->closeBox(); + }); + } else { + const auto button = Settings::CreateSubscribeButton({ + .parent = box, + .computeRef = [] { return u"double_limits"_q; }, + .show = show, + }); + + box->setShowFinishedCallback([=] { + button->startGlareAnimation(); + }); + + box->setStyle(st::premiumPreviewDoubledLimitsBox); + box->widthValue( + ) | rpl::start_with_next([=](int width) { + const auto &padding = + st::premiumPreviewDoubledLimitsBox.buttonPadding; + button->resizeToWidth(width + - padding.left() + - padding.right()); + button->moveToLeft(padding.left(), padding.top()); + }, button->lifetime()); + box->addButton( + object_ptr::fromRaw(button)); + } +} + void Show( std::shared_ptr show, Descriptor &&descriptor) { @@ -1128,6 +1187,18 @@ void Show( descriptor.shownCallback(raw); } return; + } else if (descriptor.section == PremiumPreview::DoubleLimits) { + show->showBox(Box([=](not_null box) { + DoubledLimitsPreviewBox(box, &show->session()); + DecorateListPromoBox(box, show, descriptor); + })); + return; + } else if (descriptor.section == PremiumPreview::Stories) { + show->showBox(Box([=](not_null box) { + UpgradedStoriesPreviewBox(box, &show->session()); + DecorateListPromoBox(box, show, descriptor); + })); + return; } auto &list = Preloads(); for (auto i = begin(list); i != end(list);) { @@ -1240,11 +1311,13 @@ void PremiumUnavailableBox(not_null box) { void DoubledLimitsPreviewBox( not_null box, not_null session) { + box->setTitle(tr::lng_premium_summary_subtitle_double_limits()); + const auto limits = Data::PremiumLimits(session); auto entries = std::vector(); { const auto premium = limits.channelsPremium(); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_channels(), tr::lng_premium_double_limits_about_channels( lt_count, @@ -1256,7 +1329,7 @@ void DoubledLimitsPreviewBox( } { const auto premium = limits.dialogsPinnedPremium(); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_pins(), tr::lng_premium_double_limits_about_pins( lt_count, @@ -1268,7 +1341,7 @@ void DoubledLimitsPreviewBox( } { const auto premium = limits.channelsPublicPremium(); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_links(), tr::lng_premium_double_limits_about_links( lt_count, @@ -1280,7 +1353,7 @@ void DoubledLimitsPreviewBox( } { const auto premium = limits.gifsPremium(); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_gifs(), tr::lng_premium_double_limits_about_gifs( lt_count, @@ -1292,7 +1365,7 @@ void DoubledLimitsPreviewBox( } { const auto premium = limits.stickersFavedPremium(); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_stickers(), tr::lng_premium_double_limits_about_stickers( lt_count, @@ -1304,7 +1377,7 @@ void DoubledLimitsPreviewBox( } { const auto premium = limits.aboutLengthPremium(); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_bio(), tr::lng_premium_double_limits_about_bio( Ui::Text::RichLangValue), @@ -1314,7 +1387,7 @@ void DoubledLimitsPreviewBox( } { const auto premium = limits.captionLengthPremium(); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_captions(), tr::lng_premium_double_limits_about_captions( Ui::Text::RichLangValue), @@ -1324,7 +1397,7 @@ void DoubledLimitsPreviewBox( } { const auto premium = limits.dialogFiltersPremium(); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_folders(), tr::lng_premium_double_limits_about_folders( lt_count, @@ -1336,7 +1409,7 @@ void DoubledLimitsPreviewBox( } { const auto premium = limits.dialogFiltersChatsPremium(); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_folder_chats(), tr::lng_premium_double_limits_about_folder_chats( lt_count, @@ -1350,7 +1423,7 @@ void DoubledLimitsPreviewBox( const auto till = (nextMax >= Main::Domain::kPremiumMaxAccounts) ? QString::number(Main::Domain::kPremiumMaxAccounts) : (QString::number(nextMax) + QChar('+')); - entries.push_back(Ui::Premium::ListEntry{ + entries.push_back({ tr::lng_premium_double_limits_subtitle_accounts(), tr::lng_premium_double_limits_about_accounts( lt_count, @@ -1366,6 +1439,60 @@ void DoubledLimitsPreviewBox( std::move(entries)); } +void UpgradedStoriesPreviewBox( + not_null box, + not_null session) { + using namespace Ui::Text; + + box->setTitle(tr::lng_premium_summary_subtitle_stories()); + + auto entries = std::vector(); + entries.push_back({ + .title = tr::lng_premium_stories_subtitle_order(), + .about = tr::lng_premium_stories_about_order(WithEntities), + .icon = &st::settingsStoriesIconOrder, + }); + entries.push_back({ + .title = tr::lng_premium_stories_subtitle_stealth(), + .about = tr::lng_premium_stories_about_stealth(WithEntities), + .icon = &st::settingsStoriesIconStealth, + }); + entries.push_back({ + .title = tr::lng_premium_stories_subtitle_views(), + .about = tr::lng_premium_stories_about_views(WithEntities), + .icon = &st::settingsStoriesIconViews, + }); + entries.push_back({ + .title = tr::lng_premium_stories_subtitle_expiration(), + .about = tr::lng_premium_stories_about_expiration(WithEntities), + .icon = &st::settingsStoriesIconExpiration, + }); + entries.push_back({ + .title = tr::lng_premium_stories_subtitle_download(), + .about = tr::lng_premium_stories_about_download(WithEntities), + .icon = &st::settingsStoriesIconDownload, + }); + entries.push_back({ + .title = tr::lng_premium_stories_subtitle_caption(), + .about = tr::lng_premium_stories_about_caption(WithEntities), + .icon = &st::settingsStoriesIconCaption, + }); + entries.push_back({ + .title = tr::lng_premium_stories_subtitle_links(), + .about = tr::lng_premium_stories_about_links(WithEntities), + .icon = &st::settingsStoriesIconLinks, + }); + + Ui::Premium::ShowListBox( + box, + st::defaultPremiumLimits, + std::move(entries)); + + Settings::AddDividerText( + box->verticalLayout(), + tr::lng_premium_stories_about_mobile()); +} + object_ptr CreateUnlockButton( QWidget *parent, rpl::producer text) { diff --git a/Telegram/SourceFiles/boxes/premium_preview_box.h b/Telegram/SourceFiles/boxes/premium_preview_box.h index 51f9bcfbd..dbe2be446 100644 --- a/Telegram/SourceFiles/boxes/premium_preview_box.h +++ b/Telegram/SourceFiles/boxes/premium_preview_box.h @@ -41,7 +41,13 @@ void DoubledLimitsPreviewBox( not_null box, not_null session); +void UpgradedStoriesPreviewBox( + not_null box, + not_null session); + enum class PremiumPreview { + Stories, + DoubleLimits, MoreUpload, FasterDownload, VoiceToText, diff --git a/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp b/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp index 8bacca224..04a78c7f2 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/timer_rpl.h" #include "base/unixtime.h" +#include "boxes/premium_preview_box.h" #include "chat_helpers/compose/compose_show.h" #include "data/data_peer_values.h" #include "data/data_session.h" @@ -295,7 +296,7 @@ struct Feature { label->resizeToWidth(width); label->move(added / 2, top); const auto inner = std::min(label->textMaxWidth(), width); - const auto right = (added / 2) + (width - inner) / 2 + inner; + const auto right = (added / 2) + (outer - inner) / 2 + inner; const auto lockTop = (label->height() - lock->height()) / 2; lock->move(right + lockLeft, top + lockTop); }; @@ -351,9 +352,7 @@ struct Feature { data->requested = false; const auto usage = ChatHelpers::WindowUsage::PremiumPromo; if (const auto window = show->resolveWindow(usage)) { - Settings::ShowPremium( - window, - u"stories__stealth_mode"_q); + ShowPremiumPreviewBox(window, PremiumPreview::Stories); window->window().activate(); } } else if (now.mode.cooldownTill > now.now) { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 1c010e0f0..990936b29 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_peer_photo.h" #include "lang/lang_keys.h" #include "mainwindow.h" +#include "boxes/premium_preview_box.h" #include "core/application.h" #include "core/click_handler_types.h" #include "core/file_utilities.h" @@ -1252,8 +1253,8 @@ void OverlayWidget::showPremiumDownloadPromo() { const auto filter = [=](const auto &...) { const auto usage = ChatHelpers::WindowUsage::PremiumPromo; if (const auto window = uiShow()->resolveWindow(usage)) { - const auto ref = u"stories__save_stories_to_gallery"_q; - Settings::ShowPremium(window, ref); + ShowPremiumPreviewBox(window, PremiumPreview::Stories); + window->window().activate(); } return false; }; diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index 2fd6327a4..ebb44cf0a 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -109,6 +109,7 @@ settingsIconTopics: icon {{ "settings/topics", settingsIconFg }}; settingsIconTTL: icon {{ "settings/ttl", settingsIconFg }}; settingsIconPhoto: icon {{ "settings/photo", settingsIconFg }}; +settingsPremiumIconStories: icon {{ "settings/stories", settingsIconFg }}; settingsPremiumIconChannelsOff: icon {{ "settings/premium/channels_off", settingsIconFg }}; settingsPremiumIconDouble: icon {{ "settings/premium/double", settingsIconFg }}; settingsPremiumIconStatus: icon {{ "settings/premium/status", settingsIconFg }}; @@ -120,6 +121,14 @@ settingsPremiumIconVoice: icon {{ "settings/premium/voice", settingsIconFg }}; settingsPremiumIconFiles: icon {{ "settings/premium/files", settingsIconFg }}; settingsPremiumIconTranslations: icon {{ "settings/premium/translations", settingsIconFg }}; +settingsStoriesIconOrder: icon {{ "settings/premium/stories_order", premiumButtonBg1 }}; +settingsStoriesIconStealth: icon {{ "menu/stealth", premiumButtonBg1 }}; +settingsStoriesIconViews: icon {{ "menu/show_in_chat", premiumButtonBg1 }}; +settingsStoriesIconExpiration: icon {{ "settings/premium/timer", premiumButtonBg1 }}; +settingsStoriesIconDownload: icon {{ "menu/download", premiumButtonBg1 }}; +settingsStoriesIconCaption: icon {{ "settings/premium/stories_caption", premiumButtonBg1 }}; +settingsStoriesIconLinks: icon {{ "settings/premium/stories_links", premiumButtonBg1 }}; + settingsTTLChatsOff: icon {{ "settings/ttl/autodelete_off", windowSubTextFg }}; settingsTTLChatsOn: icon {{ "settings/ttl/autodelete_on", windowActiveTextFg }}; @@ -473,6 +482,9 @@ settingsPremiumRowAboutPadding: margins(59px, 0px, 46px, 6px); settingsPremiumPreviewTitlePadding: margins(24px, 13px, 24px, 3px); settingsPremiumPreviewAboutPadding: margins(24px, 0px, 24px, 11px); settingsPremiumPreviewLinePadding: margins(18px, 0px, 18px, 8px); +settingsPremiumPreviewIconTitlePadding: margins(62px, 13px, 24px, 1px); +settingsPremiumPreviewIconAboutPadding: margins(62px, 0px, 24px, 0px); +settingsPremiumPreviewIconPosition: point(20px, 7px); settingsPremiumTitlePadding: margins(0px, 18px, 0px, 11px); settingsPremiumAboutTextStyle: TextStyle(defaultTextStyle) { diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index 2b359b984..75eb85370 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -203,13 +203,14 @@ struct Entry { const style::icon *icon; rpl::producer title; rpl::producer description; - std::optional section; + PremiumPreview section = PremiumPreview::DoubleLimits; }; using Order = std::vector; [[nodiscard]] Order FallbackOrder() { return Order{ + u"stories"_q, u"double_limits"_q, u"more_upload"_q, u"faster_download"_q, @@ -228,12 +229,22 @@ using Order = std::vector; [[nodiscard]] base::flat_map EntryMap() { return base::flat_map{ + { + u"stories"_q, + Entry{ + &st::settingsPremiumIconStories, + tr::lng_premium_summary_subtitle_stories(), + tr::lng_premium_summary_about_stories(), + PremiumPreview::Stories, + }, + }, { u"double_limits"_q, Entry{ &st::settingsPremiumIconDouble, tr::lng_premium_summary_subtitle_double_limits(), tr::lng_premium_summary_about_double_limits(), + PremiumPreview::DoubleLimits, }, }, { @@ -1318,55 +1329,7 @@ void Premium::setupContent() { _setPaused(false); }); - if (section) { - ShowPremiumPreviewToBuy(controller, *section, hidden); - return; - } - controller->show(Box([=](not_null box) { - DoubledLimitsPreviewBox(box, &controller->session()); - - box->addTopButton(st::boxTitleClose, [=] { - box->closeBox(); - }); - - Data::AmPremiumValue( - &controller->session() - ) | rpl::skip(1) | rpl::start_with_next([=] { - box->closeBox(); - }, box->lifetime()); - - box->boxClosing( - ) | rpl::start_with_next(hidden, box->lifetime()); - - if (controller->session().premium()) { - box->addButton(tr::lng_close(), [=] { - box->closeBox(); - }); - } else { - const auto button = CreateSubscribeButton({ - controller, - box, - [] { return u"double_limits"_q; } - }); - - box->setShowFinishedCallback([=] { - button->startGlareAnimation(); - }); - - box->setStyle(st::premiumPreviewDoubledLimitsBox); - box->widthValue( - ) | rpl::start_with_next([=](int width) { - const auto &padding = - st::premiumPreviewDoubledLimitsBox.buttonPadding; - button->resizeToWidth(width - - padding.left() - - padding.right()); - button->moveToLeft(padding.left(), padding.top()); - }, button->lifetime()); - box->addButton( - object_ptr::fromRaw(button)); - } - })); + ShowPremiumPreviewToBuy(controller, section, hidden); }); iconContainers.push_back(dummy); diff --git a/Telegram/SourceFiles/ui/effects/premium_graphics.cpp b/Telegram/SourceFiles/ui/effects/premium_graphics.cpp index a7ce3f922..693279537 100644 --- a/Telegram/SourceFiles/ui/effects/premium_graphics.cpp +++ b/Telegram/SourceFiles/ui/effects/premium_graphics.cpp @@ -1018,79 +1018,123 @@ QGradientStops GiftGradientStops() { }; } +QGradientStops StoriesIconsGradientStops() { + return { + { 0., st::premiumButtonBg1->c }, + { .33, st::premiumButtonBg2->c }, + { .66, st::premiumButtonBg3->c }, + { 1., st::premiumIconBg1->c }, + }; +} + void ShowListBox( not_null box, const style::PremiumLimits &st, std::vector entries) { + box->setWidth(st::boxWideWidth); const auto &stLabel = st::defaultFlatLabel; const auto &titlePadding = st::settingsPremiumPreviewTitlePadding; - const auto &descriptionPadding = st::settingsPremiumPreviewAboutPadding; + const auto &aboutPadding = st::settingsPremiumPreviewAboutPadding; + const auto iconTitlePadding = st::settingsPremiumPreviewIconTitlePadding; + const auto iconAboutPadding = st::settingsPremiumPreviewIconAboutPadding; auto lines = std::vector(); lines.reserve(int(entries.size())); + auto icons = std::shared_ptr>(); + const auto content = box->verticalLayout(); for (auto &entry : entries) { - content->add( + const auto title = content->add( object_ptr( content, - base::take(entry.subtitle) | rpl::map(Ui::Text::Bold), + base::take(entry.title) | rpl::map(Ui::Text::Bold), stLabel), - titlePadding); + entry.icon ? iconTitlePadding : titlePadding); content->add( object_ptr( content, - base::take(entry.description), + base::take(entry.about), st::boxDividerLabel), - descriptionPadding); - - const auto limitRow = content->add( - object_ptr( - content, - st, - entry.rightNumber, - TextFactory([=, text = ProcessTextFactory(std::nullopt)]( - int n) { - if (entry.customRightText && (n == entry.rightNumber)) { - return *entry.customRightText; - } else { - return text(n); - } - }), - entry.leftNumber, - kLimitRowRatio), - st::settingsPremiumPreviewLinePadding); - lines.push_back(limitRow); + entry.icon ? iconAboutPadding : aboutPadding); + if (const auto outlined = entry.icon) { + if (!icons) { + icons = std::make_shared>(); + } + const auto index = int(icons->size()); + icons->push_back(QColor()); + const auto icon = Ui::CreateChild(content.get()); + icon->resize(outlined->size()); + title->topValue() | rpl::start_with_next([=](int y) { + const auto shift = st::settingsPremiumPreviewIconPosition; + icon->move(QPoint(0, y) + shift); + }, icon->lifetime()); + icon->paintRequest() | rpl::start_with_next([=] { + auto p = QPainter(icon); + outlined->paintInCenter(p, icon->rect(), (*icons)[index]); + }, icon->lifetime()); + } + if (entry.leftNumber || entry.rightNumber) { + auto factory = [=, text = ProcessTextFactory({})](int n) { + if (entry.customRightText && (n == entry.rightNumber)) { + return *entry.customRightText; + } else { + return text(n); + } + }; + const auto limitRow = content->add( + object_ptr( + content, + st, + entry.rightNumber, + TextFactory(std::move(factory)), + entry.leftNumber, + kLimitRowRatio), + st::settingsPremiumPreviewLinePadding); + lines.push_back(limitRow); + } } content->resizeToWidth(content->height()); - // Color lines. - Assert(lines.size() > 2); - const auto from = lines.front()->y(); - const auto to = lines.back()->y() + lines.back()->height(); + // Colors for icons. + if (icons) { + box->addSkip(st::settingsPremiumPreviewLinePadding.bottom()); - const auto partialGradient = [&] { - auto stops = Ui::Premium::FullHeightGradientStops(); - // Reverse. - for (auto &stop : stops) { - stop.first = std::abs(stop.first - 1.); + const auto stops = Ui::Premium::StoriesIconsGradientStops(); + for (auto i = 0, count = int(icons->size()); i != count; ++i) { + (*icons)[i] = anim::gradient_color_at( + stops, + (count > 1) ? (i / float64(count - 1)) : 0.); } - return PartialGradient(from, to, std::move(stops)); - }(); - - for (auto i = 0; i < int(lines.size()); i++) { - const auto &line = lines[i]; - - const auto brush = QBrush( - partialGradient.compute(line->y(), line->height())); - line->setColorOverride(brush); } - box->addSkip(st::settingsPremiumPreviewLinePadding.bottom()); - box->setTitle(tr::lng_premium_summary_subtitle_double_limits()); - box->setWidth(st::boxWideWidth); + // Color lines. + if (!lines.empty()) { + box->addSkip(st::settingsPremiumPreviewLinePadding.bottom()); + + const auto from = lines.front()->y(); + const auto to = lines.back()->y() + lines.back()->height(); + + const auto partialGradient = [&] { + auto stops = Ui::Premium::FullHeightGradientStops(); + // Reverse. + for (auto &stop : stops) { + stop.first = std::abs(stop.first - 1.); + } + return PartialGradient(from, to, std::move(stops)); + }(); + + for (auto i = 0; i < int(lines.size()); i++) { + const auto &line = lines[i]; + + const auto brush = QBrush( + partialGradient.compute(line->y(), line->height())); + line->setColorOverride(brush); + } + box->addSkip(st::settingsPremiumPreviewLinePadding.bottom()); + } } void AddGiftOptions( diff --git a/Telegram/SourceFiles/ui/effects/premium_graphics.h b/Telegram/SourceFiles/ui/effects/premium_graphics.h index 089758d93..7f932a9bd 100644 --- a/Telegram/SourceFiles/ui/effects/premium_graphics.h +++ b/Telegram/SourceFiles/ui/effects/premium_graphics.h @@ -88,11 +88,12 @@ void AddAccountsRow( [[nodiscard]] QGradientStops GiftGradientStops(); struct ListEntry final { - rpl::producer subtitle; - rpl::producer description; + rpl::producer title; + rpl::producer about; int leftNumber = 0; int rightNumber = 0; std::optional customRightText; + const style::icon *icon = nullptr; }; void ShowListBox( not_null box,