From 4fcfbed7d2067747feef8a997c8a310a60976d64 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 13 Mar 2026 11:41:37 +0400 Subject: [PATCH] Allow filtering resale gifts by-stars-only. --- Telegram/Resources/icons/menu/star.png | Bin 0 -> 652 bytes Telegram/Resources/icons/menu/star@2x.png | Bin 0 -> 1383 bytes Telegram/Resources/icons/menu/star@3x.png | Bin 0 -> 2066 bytes Telegram/Resources/langs/lang.strings | 4 ++ .../boxes/star_gift_resale_box.cpp | 42 ++++++++++++++++-- .../SourceFiles/boxes/star_gift_resale_box.h | 3 +- Telegram/SourceFiles/data/data_star_gift.cpp | 3 +- Telegram/SourceFiles/data/data_star_gift.h | 1 + Telegram/SourceFiles/ui/menu_icons.style | 1 + 9 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 Telegram/Resources/icons/menu/star.png create mode 100644 Telegram/Resources/icons/menu/star@2x.png create mode 100644 Telegram/Resources/icons/menu/star@3x.png diff --git a/Telegram/Resources/icons/menu/star.png b/Telegram/Resources/icons/menu/star.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb1ea334b886bc4b69779cb0d3a6394136fc998 GIT binary patch literal 652 zcmV;70(1R|P)*lh4a3VHC$_cx@)P~-b}*EL>au%%(>l}Uau?W%IeN)3p`<~}KKM>?U z!{_t;Q1SVE`bt!%W-^&(vst&>1%PNYN>SADczk6$48trIi#L_UV!<%XD=r9v@I245 zthQ!Zmgo6bT*Be-;c&olTnlj=KO7F>aQKn_?XohP%>+Tt71D+bzqo-|xpT?D^R-4D))u=kwX)@gN9dKoCSx6ae^8dEV$l1w~O=mcO#aVo{Q$ zL?ZFLQ7jhQ?RMpI`L>Wwr%$I-qtWpD{dT+k{rx?c%hhVN@pv4GM6Q)6istkA)9IAW zX74wlX}aBRACE^+*=#nIN<}+@3r3@{-EObf>tHbWmpzwCrR{dhFwEVvw_2?LaN~Xl zhr@9`pIt7Oj%Kx5C6mdUl@I-Tiss$(=94g-OJ!C=rc3WY-be*Y3;81`M| zdd$&i6buFxMS0lDVzB^#&1TcWcswo$!cP@J5aRK;mbck#0AR6L9vV>;1pqWnJDtwK zU?52n%d+28SeBI}X)qW#olcsj0f3??o$--ov#C9Fj^hY|xGoU{!Eqb_D2mc*we(yx mTrStmcfE!rN&P$hXZQtEDj~}tD6tR#0000Q|o=`N?=Xo!;EsoS&ah5X8pD#^~s%*=#0$N^Ca!`1lx{q*kjr z9L|pcO-xK6$HvCS_VzaZo}8Tg8JeV|B)i=X0E2^rXi+Ma0ARPCR6 zy}dnfG&CCR;^G1TR#sMAM^{!>0N~={f<~hS2&lHU7Rw+KiCjlTA`y<(*473HXl-o` z05lqn+ZxblG>t|B0BdV&fuIozg;;>Lwl+^bZEbDnBNPh1;OJm57@3)wJRXnhP6B~| z!{HbV27y3eG#cF|4GRm?YPI3v;g64xTCG;^PCA`VtyVujKYOENFc?au5_^ev$z(F` z3zf-a?FEIg ztyUYb{y~!D<>e&+3=9l7jQ`Dz9Dn}&2@Vbp3{Y@zFg^s5baySw&CSIE&d$ySLuqL#;ge!xV;2_}-|e;rgJE=ZG$$v=do~`Ax4yoPAtxs%iHV7Xf2ydcn36O#3vOI5pi;I;@IqceSJPHv8t*HW94$W z`%{7y16GXnto`}?1zVYAs5iv<9>y1G7-r?s^e0Bkl}L`1}=fJFb^*x!8a_^PzD zG|W>|Q{&z9ots8cQ4v89I-TzH^wf)6@?UvzI6XbRySpO@!s9vmK^-0*0)R@T^5l@1 zn7FX8fU93vSn$#gR4Nq!9336`Ps8DGY&IJJNF);1Q5K6Om&;#XUYr}|%gc*gE@!b= zuKq18E!a^bBP0C;Dl03)X;M;Bob4n@HZ(L`Uti;>$z+oKmE-H+`ue(|q2WyrOioV5 z(Xz5KKY{A&>oJA%`H-ERy|c69D2Ym?ijR-Sq4@ZCd@iV+ot^CLY)2rI$wYfyU7epm zjt<+^)kTsdpUAA$#N{Q+yo5@A@X}Jd zf@Ohe?1MEhOu>{Qq3DZ-lrZyBC_$3TS`cY?E&DK>v#go0ux6q%b+x72oO_`|&wJjv zyPNL@`+Yi`=YM_9vvdB>{}})tJb3Wn;a>>A`OxX~^z`)T=x7Rs^6As3r%#{CWHR8^ zAPB#nwpw`fB*`GQe9mQZ%U<7B9RE(i~Rh2m_U1bJASCWy&Vqa=jQ|WVqjnZMjsUw zg&&HFih@G}0|UT~h>3}Tq4)OoZWQS4?S%p{F)_ehXl-pZ|At_**-)UhwH3GpG#YJn zbrlPGYHA8Wkc~13f=o?KVKS?$t27$T;b9;Sx5(jeP!z?k8yXtc*Vi}7tgo*(G&Eq> zD2j489N^-RNTk`>S?p0L6bgTTe^ZkF{{9Mu0+XDboh6Y-z?CU1EQCLvy1F{^!gY0Z zP`I$L5V$fzp%4pHr_+Ung_#!)4-ePrbeOzQC@lGcz;tzo^w}rzA$9P-0?Ym`rAn3CLu!QN`lo;^yXNDTWclgaFGq*klj+S&pF0<85E z5)v{tHfDz>EUScs1lwj2fP{nu`*PFk^%99>_wL=6mm-No5{X2Sk tP%4$C)`naz zpPQQ#i^WDu4T~TM5*;1AefxG(%RVS5$j{HusIEvPijR-C;P>Lii*PdJa(Q`qd0JW; zi^ZbT>9A1xzd%uxPN%b2thBVWva+(dxj7hWQBjcv54bRy znVGQdB@hTKNM~eZz{J#Qb#ZYqa7oUbIkU2|0z*A@>Xc=jmX;R$hvNSI``+H(z-1s3 ziFfYY!AIE9(P5P)iA3t}@5gHn4h}kF_ihJND)rT?SNPaQMn-HXbWjvEcy8ane~*uk z2mdR3_U!rc+5^>?p@fQ zuob0J+0xQ-=+Gfs{f35yip65QDS<#hp-_NhNlZ*MaAT3-;o+j9B2!hlc~VnT7Zw)q z)^6RpWwib37!nf`c|6|C%#4|Qe*E}x`}S?4+axPtFc^!Ai_oA-r8<53v_tbSO>Ar| z-nU+_*Jw0dU0p|x9NGM-S7~V}G&?;#9UB`9wgxJdIz2rNeQUK^9*@UhFdStcpP0oL zpd-N_-YqOF96Wf?q2|H<{rjQ)8#iu%tsyrz7oXM6ojV=wf=DF7&i>%wAlMrE`ubpE z$BrFyl9v}RUSKZNYPCIeldXh@hr=S^<;$1AXiWbW&0hJbJ`06(`Z(-;Z5*dwbh@$b{G=jbH25Cx)VEMMZ_^4;2*^)^EwS?q~My z-8*b;EG{luS&!!BPdeB~vTO0DdF5eNjiT#jjtjErnLd=vQj`N0h}pU<}_9~l|h z)6-+BQ10pJF?B+Kr>munJ9g{{3k&1(`36Jt^YbMo zC8icOi^YPH)z#HbN$mRd>(GbM8Yd+sWps4ZAnu8YiHwX4yjVs?#>B*gf!OHiXi7@T zMw`CAzEGyIvC%1s)zs8L9|o;B27}Sj(P0ql($W%_%QgBD_ww@Ma=GyP3+d?SFxdO- z+qVyn-n@C!>HldHi^WVP6Kl3qRaGgKN_>1eosP%j1qTP4Hy9io%;WJ4S}97UvZ|^I z`y4ZwOp!iGFTKpLb#^mIr9XoV_9T53Q=S}!TaddSeparator(); + const auto starsOnly = state->filter.current().starsOnly; + actionWithIcon(tr::lng_gift_resale_all_listings(tr::now), [=] { + modify([&](ResaleGiftsFilter &filter) { + filter.starsOnly = false; + }); + }, &st::menuIconTopics, !starsOnly); + actionWithIcon(tr::lng_gift_resale_stars_only(tr::now), [=] { + modify([&](ResaleGiftsFilter &filter) { + filter.starsOnly = true; + }); + }, &st::menuIconStar, starsOnly); } else { const auto now = state->filter.current().attributes; const auto type = IndexToType(index); @@ -503,7 +515,12 @@ void GiftResaleBox( const auto countLabel = titleWrap->add( object_ptr( titleWrap, - tr::lng_gift_resale_count(tr::now, lt_count, descriptor.count), + (descriptor.count + ? tr::lng_gift_resale_count( + tr::now, + lt_count, + descriptor.count) + : tr::lng_gift_resale_count_none(tr::now)), st::defaultFlatLabel), QMargins( st::boxRowPadding.left(), @@ -547,7 +564,17 @@ void GiftResaleBox( peer, content, std::move(descriptor), - state->ton.value()); + state->ton.value(), + nullptr, + false, + [=](int count) { + countLabel->setText(count + ? tr::lng_gift_resale_count( + tr::now, + lt_count, + count) + : tr::lng_gift_resale_count_none(tr::now)); + }); } } // namespace @@ -559,7 +586,8 @@ void AddResaleGiftsList( Data::ResaleGiftsDescriptor descriptor, rpl::producer forceTon, Fn)> bought, - bool forCraft) { + bool forCraft, + Fn countChanged) { struct State { rpl::event_stream<> updated; ResaleGiftsDescriptor data; @@ -606,7 +634,11 @@ void AddResaleGiftsList( state->data.offset = slice.list.empty() ? QString() : slice.offset; + state->data.count = slice.count; state->data.list = std::move(slice.list); + if (countChanged) { + countChanged(state->data.count); + } state->updated.fire({}); }); }, container->lifetime()); @@ -712,7 +744,9 @@ void AddResaleGiftsList( container, object_ptr( container, - tr::lng_gift_craft_search_none(), + (forCraft + ? tr::lng_gift_craft_search_none() + : tr::lng_gift_resale_search_none()), st::craftYourListEmpty), (st::boxRowPadding + QMargins(0, 0, 0, skip))), style::al_top); diff --git a/Telegram/SourceFiles/boxes/star_gift_resale_box.h b/Telegram/SourceFiles/boxes/star_gift_resale_box.h index ef45be3f8d..5804dc59a0 100644 --- a/Telegram/SourceFiles/boxes/star_gift_resale_box.h +++ b/Telegram/SourceFiles/boxes/star_gift_resale_box.h @@ -48,6 +48,7 @@ void AddResaleGiftsList( Data::ResaleGiftsDescriptor descriptor, rpl::producer forceTon, Fn)> bought = nullptr, - bool forCraft = false); + bool forCraft = false, + Fn countChanged = nullptr); } // namespace Ui diff --git a/Telegram/SourceFiles/data/data_star_gift.cpp b/Telegram/SourceFiles/data/data_star_gift.cpp index 06b0bc5f60..4ecc85f4bb 100644 --- a/Telegram/SourceFiles/data/data_star_gift.cpp +++ b/Telegram/SourceFiles/data/data_star_gift.cpp @@ -236,7 +236,8 @@ rpl::producer ResaleGiftsSlice( | (filter.attributes.empty() ? Flag() : Flag::f_attributes) - | (filter.forCraft ? Flag::f_for_craft : Flag())), + | (filter.forCraft ? Flag::f_for_craft : Flag()) + | (filter.starsOnly ? Flag::f_stars_only : Flag())), MTP_long(filter.attributesHash), MTP_long(giftId), MTP_vector_from_range(filter.attributes diff --git a/Telegram/SourceFiles/data/data_star_gift.h b/Telegram/SourceFiles/data/data_star_gift.h index 7cd0b73cca..8a9f8be81e 100644 --- a/Telegram/SourceFiles/data/data_star_gift.h +++ b/Telegram/SourceFiles/data/data_star_gift.h @@ -397,6 +397,7 @@ struct ResaleGiftsFilter { base::flat_set attributes; ResaleGiftsSort sort = ResaleGiftsSort::Price; bool forCraft = false; + bool starsOnly = false; friend inline bool operator==( const ResaleGiftsFilter &, diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index 92f863dfb9..543e3afc0f 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -208,6 +208,7 @@ menuIconTagEdit: icon{{ "menu/tag_edit-24x24", menuIconColor }}; menuIconDownloadOff: icon {{ "menu/download_off-24x24", menuIconColor }}; menuIconShareOff: icon {{ "menu/share_off-24x24", menuIconColor }}; menuIconShareOn: icon {{ "menu/share_on-24x24", menuIconColor }}; +menuIconStar: icon {{ "menu/star", menuIconColor }}; menuIconTTLAny: icon {{ "menu/auto_delete_plain", menuIconColor }}; menuIconTTLAnyTextPosition: point(11px, 22px);