From 452257dcd58c99317c0d93adeef7c15c6111c761 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 28 Dec 2023 17:13:30 +0000 Subject: [PATCH] Show special name/userpic for "Author Hidden". --- .../Resources/icons/hidden_author_userpic.png | Bin 0 -> 1074 bytes .../icons/hidden_author_userpic@2x.png | Bin 0 -> 2165 bytes .../icons/hidden_author_userpic@3x.png | Bin 0 -> 3431 bytes Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/dialogs/dialogs.style | 1 + .../SourceFiles/dialogs/ui/dialogs_layout.cpp | 33 +++++++++-- Telegram/SourceFiles/ui/empty_userpic.cpp | 55 ++++++++++++++++++ Telegram/SourceFiles/ui/empty_userpic.h | 16 +++++ 8 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 Telegram/Resources/icons/hidden_author_userpic.png create mode 100644 Telegram/Resources/icons/hidden_author_userpic@2x.png create mode 100644 Telegram/Resources/icons/hidden_author_userpic@3x.png diff --git a/Telegram/Resources/icons/hidden_author_userpic.png b/Telegram/Resources/icons/hidden_author_userpic.png new file mode 100644 index 0000000000000000000000000000000000000000..37acae5ab95aeffb0c9779cdda5c0a166459d164 GIT binary patch literal 1074 zcmV-21kL-2P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K5oJmAMR9Fe^m`iL8Q5eU2wc=5I zcqXb!5JeFoL{d#?Y_Vu!DQvJR3nCs1B!aMFB@OLDuo1Cp2q|Jwq#h9=T~s_$Qg1EV zG+MuZ-MKw8ch20-tFlg4W>8^(U-wbFlDpjk9?(Tz1cagUtrCKJh&UT znahL72UCOi0NrM1L;sBa-Pn88X<>&<=jL5O6Wje%fNxa55ETJFUspNwLI4f)uBR<-DkUPGVW;2b3Vbzj&jj(z4cnX$79kjxq64g@8 za(m|#9+HdUCPXdjQJi9&WH(8TQBP*nZ%m%xw`oNgLF{*x;=2UTW&pvl0%24jI=W+gr(X z1qskSSqmFHft&br`rXn&;S#)p*YFnFp+kFOYFM*~t7e%9x-$8oD?JrTU^#J5h-pG! z45l2%x6?GZbdq#m_{n7j;;8a-#%+(BV(ecA#P!{G_@7#0);o1vE5X|=2{P-9HyZMx z8T=%1V#c}4F96#^==(`wwGG&TPxrW6FwTYhV3V!Nz*z(}psUml`aw_n)Yvvc6R6>H zI0+M+uIRP_^`}CW6X#lS=*Yeu)YvO;Fyy)t(%4X=5Dvl*Fr|ylX(&xumLR={FM?P0 zrA)R2P^bX*gPvHg=m}2z(Pb%-Y$j!LKL&3Is_f&Mjf)O2m>F zgFWy8{Nx74!bF0hV4n<+{gQladTPU;2c3Q->y@+@-h)>(gsV7v{Sw^r2Kww@U^@b3 zPOm|&6w;u(!F#HCjxF&HMLz^K>B6D6RRy?Svx6GWOs4P{(3`>;^qS+xRtY`e6+LLj zK=0(gBQ(o}O`tP6NObeB%8aSvQ!vnQ s(EkYQKPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91P@n?<1ONa40RR91Pyhe`05RZ9PXGW1-$_J4RCodHoNI^{RT#&2y{wsQ zcrDaQw2Nh_m_}(@Y*{J z&wyhFDjoGoQmd=0tHQwjFc@~jipt8$TDHc5jnP!T0lLFaFdrKS*p{~tco$d?L78h3 zIZ9RVNl=;NZE%%|jm*{|z!tC^qGV#R;81)kN}2L4(4m-(%$_H>dkO@vQ(K``RDhi8 z3#Xuv%!<;_bU6|0>f2Z-^7?akM+M6Hg$DYEsdIjmjm(x4)GY?VtI8&56AYBHp-}AV zqsnQS7SzxDF=5TG56)z>m`c@N(Cl9e+f5Yf>#X&3lisE>j3KBN1hNl0S_E{Qx<5iE z=xw3rRqe^JX1jNg)K-C|Ap>c|CVBEnx3R{FF3FSrP5P6xq?N#$qyq`DKRl!?_M)^B zcw_9I7dNO`O5&2%GjIoyT$p$?4I4PgVLP6K|28a+_bBlzkPbwhK-$SumNX#mqn#ur z@dV<0|0Dw_V!LmV^Ch27BY{mh!7qy|uy@Hnv%7(d+*Qpq)3^egGJzMHrNO;cxhF93 zD=>2D$o)5|sG#RP2mL`X1THJZR*Aa3@MStSR>L}mG@2g9DzS|Naa6zdIM7nNrcsSn zR48joIY#4O!7^A(GBq}BS|Mp#;~NjP@E>GFz$<$8L+2d?V%W7{2or~4j(d7Y} z$k3;m{0uE^{cuU(9NR`RRR7gfeC0NNrCc6*zBp#5l02^w8Xf^_eGX)GcMXo;?8TM( zmd5XZ&*21QMda%;7+Y$>tb5_8263h<=f=Yr7z*v7Imtns(VX~WSVV8D*Q_N=Yzg#x zLNe8x4S->AJzNQw!?}=#9HEiTumQe?mGA>eJH<9uu}UC`Q3CFTy|5gI4x4&|uG-Rq z!xhjAE&zSQqOIr*Z9$6=LMuAnf`nF4v>2eRI10Lg{(?RAXn!kg1dZqF*jfob>P_A; zbk|uanpDPkHLLS~VASha3IM2k3qO%GN>9$=8g?$bO)bq6()Jb{hvk|>I)gwYvF>O7@Vs|;mp3GxsvUd=%?L+xHv~{P;qu`89477z6 zU?Sh1QLNuVsnFM`VK(*o+CQ)$#MWxc_3fXn%=Ozs`6CMhPy2Pl_9LfqG@^(25-=TP z4n#*CfnU1#4-EF@k8YjbA$9d?KzDH zq8`yj!t^$|7(&NYPt7T&1>_^_2i5s-LE%GikyU<+7^rbDq7F#|@diTKeGaycqjQPh z5XUyRu-D}G?3i8sRP5?$Ic^*LTG)8m(#}kO!2W&gn0zDcZ%&<91L34g0%h~v28Ie9 zP}$Z|HQ>ohLED^|3VXZ?5!>CAPYLS!k2&8Go&|L@h2%F*1|KJw6?!0Z;mFm*e_4A4M+3&@skvkyQ6`_{qsy<^U~ zBvAIJdNz!=D7A;z;3U{c(eB^aiI^(lyav#B!8VIP)>HQ(Fd9@xx{85o;2SWNy;N*; z6-G9Y;0gTb1W&;ZFcn?RqhoaogL;Yn25fHb@s8H2pYa5 zBN*=n??W-stYT0yUPN1^P2H-G!rx#cUr;%{MG+bs1?uez$vRF}MTZ;j8QK~FKNoT+ z;+%SR&F9k<8tn)>Bb@SzUr*XA8maC<2vaG4S*;NPK_RfE3D=sqqZ z2}q5vnRIpu;yU=uAsEdHv}|rA=xBVGglMjNwUsk*R;F>ir1{h`GEMh}oBBcBkzhL~ zFXob-fiFUA&t}tjLhIqkU*!?U7FaWf08kNYqdE(nto6l$4X|A!%$undr#31OL|>^tZerjwWX zGC-161`?<-;tP|3z4VY&oyc-yB&!Pab*RRPnyOGFfj;^^_6?2 z<8#UD+d!5|2+`fv>aY|2=@wBNrOI$xIlJZ8SD9r{n~lOmrn%jlQ3M)sclDiB2q2Bj4M?2%QfO zMD?|sI8V&p>FDpg+Vk*qbwD;%SLmAKm4`36p#p&Vk+YAkon3mravuTsXR773e7935 z<{r)8k#hLUe#|MOzm&2^@`510URV0mJX4_Hzp^;>s3I*&H8zsY1D0{CLHT$oq?nu2 zrmx)VCHqjECRV>zUUQXhGP(=wG*AZZ`LZF4A|6ekup3rN`7yHHabjHtnXO4Y(y!1% zbq*;eOT0pn#8Qn($yP|0REdh+-ocm0YkWQ;XS$iiB658!Eihl7XRq;FQ z@K($2M~Z9i;JRXx-ArmxtEk={k88GrDpF)Dkb-;j9$pTYY%l9;q0(gZ~rj-V0kuWQHx>sjHP@3%Sxhp z_~I(VjpDr|1i?=6#uC+Mb9UsK6KO752wXj<@F0QtQKs6Qw!s@tco!`ogLnrpD-gTcQ_3YW8IhyK;kZ+;}1-^%2a^?N&K)pVe-Y(ppqz8 z!@H+#0R;`uJ}8_Xzc=8?QYsg{&;xpKe%GIN@+qs!t3@4sK`fV}YO5;9c(Iaa9Hr1l z+B>BzJ3GP4m(lhB_SQu@49JAOGP-AmXQb+|dQmKHdA6WgZI&Mi`#O#%T#Ct2W8XV0 zVsgtu`cD48-a*Enro~=l)all6W_&4*jF4nboKu^HG@1@;%SYMPTC$;=oEc-SwIOOW z+H`67_|M=MO%Kq`USjWjNLU8gT9AxVru$>6tL7FQ(n}JulV~v7+_~a<#+Js9k^|^C zdhtEB;uBl-b5g2!>@AxeOG%lp18C(mf`AA+C-PfL$u}Myv0N9a*5a9z+0F4}pr)#d zaLG7SO$R~?_K8X!$#`6lS7Sq28|gBalkQQ9PT>N1V}d?D9}Ke0N2)D}9*-z=hB>Ly zVEFc+RWYMbwGss-w{&%x-q5*Zl%~2(d1G7aa0~@B*z%^uN(=PW!Zqbh(CJco`N%3% zVn{7RdP?y~o_5T#?x%6*cT$&@QmA-s+J|NC5cf7IlKgEs}xHJazV-LamX85CdlL zPeRsOqcjD`o#6erN4J!F52|P=@KpZ!n%}2mCLMg((T2jUpPA1y`<5f7{LV)g4r%0S zv!q#jd^>Rp*#+VbPac|?vX3u1vIrXn8*tLqj>2MQUz6x6f2cs&*EQ{#Z;7Ehz$tjq zk!^6|8mp9Vxj8UD2E^R1NFMcTDm$aIG$)rSs`fGR2D=VMwM`fODEn^y7uQ92^f$)z zvHdU>by@c~pB=q*k04OgH7fCBzL0eKpvCyjG&+Wnw~k{y(-|%R*-mpYxXR+A``-xJ zz4o*3J}bGhw%9j%`()+Rm|=yeuj%cCoCJbKt;C{04csKx-_-qLQ9mu&VU(ahwEg{3 zP$cDmy=>;{WaMxSKh?f|em71Q&s(K~efB0EtX2lRdQ`nJe!SJ#=1XHf7_@673Mt;p zC8dRo-;}K~q>{Li(B32KhPPujF>7{T#8Q1_^5m51*tiP_))d~rj#WBP$!BCT7tnlyAVc3gC&`hUPR%Py+2BXP6%P;34#WFLw;%h+ zJi*01xLOMDvkR&?zYFh_OTZw&+}G8i{X6Rjb7Fo?zsu)Wd54R0(d1MHPlcr8`~~ve zkcr!OK-1#ana@=btyQ1>03u=Lo%wy_S<4#lsLqITL)j$vLQYSIN*l}dPWg6JXdjQ# zsJ4z^QiZr9b%feuLd~mcU!Dka-|v`vAJsvzL9|cb@5i(h)%OnEluGEy=YW>IvKHna zsgQ5WTdEwjG`@6TR{PbpKy$#3brIBrPqIdsAN$Z|iqIdi*SLoxbM3IN(rEN<>ym1) zhjB8q9{xf#U^rq>$C|m05B+YDCtYGm3gnJ@aHwHhm?L89ESQHq0nZ+JL5>&DuOED^ zx!Ntb=n;4#OoUt#?WA^WrOZVtiZeen(y@Q{a$z=3Q%mAw{jeTCan>1^eed0E2}%qX zeMW!rW3e*E96wgkzI$E~jz#aSawTSh>rItFr&JRIo$Ht<_Q%5dM%<{R7!7DcoY{x?Dx! z9a)=Lam?gpWcqDSo8fAx9p}fpZc>HB?sYxmqGt4U(IpNBXCQ}Fw(tTEU8(;Dke>RK zt1O`={?K^C3~{;}fcolRH{$6BVS?h#2&cyQww$Wf$TQ?XvLMGoHZrtSxJ2?A^|V1N z3yBcKf3k%LRBe{$W<3Z7?EVe((YI3JoS1Ex7g1^NfmfPu7wgQ1X(B|6>&=~M@(Xg(}-Vd0}HP|3ecCuAJ|Ms$q>!Vp{j>A`NakD z935;@)zN&hAN#NXqWnSWUqdL-ApmCQUR1l{Z{hm(qi&Q&q`KKqO*>RAfg@Ow!yA<1 zTRI1Z`1GSfczV}C-e)Opcj<2PJU_l`l>URqAx`|EnD-oW|XBWH(DV3>=Sj?4fN zbnXW>LO_snH>bcNf6hmMr-Na|QLDrSsu%edapoD~LW~$tOT|aU%sAIVG>W3{zr_K+ zT#&lAD~yZppP$KPmyg}w7n>X+SlwoGdN!1H_a};o`fe|d;WGD55j{{h{_@*gX=7@n z?tuG%e*MS=d6d%?T3a>vZuImQi|m0mC9=Tg8QOKY_zyowt&l%rxdj1xSVI~tVeB4#T66v{5N@1 z;r-V*aA^ZtAT2|<@E9{g=IV^N(i7yK2=njSx_dIAfqIgSe9Ch-DKDS?c(Ha~CD+2; zQ!k)u{*6T6?a~N1#~}Fuyv60Aqttt3*-N8=c?m*r+4^#`TThT=r(bE5J>Sn!1w4#> z>*2P0-8zh(go@DZ^kko?R6&1!B*l>tzZb7_1QFXtZcMcC=@3#BI|#|?z2zk#jIVDWchNATuZM|8c;pJMHA$t{C)kmP zTO41C?`2pnV>oPLUAjalQ^1MtE@oRe(qe^Am5Uu_@_4a&>8@f&5w)}#Er!L{oH%%c ztZWKbPiAMWawi0IU z9b%gsC>iYRWteg!{*}v~^ZiEH4lrF?=#WQO{KFvtLKjE6^y^<2=+-*DUf>UTNQ;x{ zF)W*Jya6Vjli1!Kut7>}iGyOJ=O#|=e!hSw_N#}hrCvZ;9(rXA#O$4UbD9Sa26j!=Q z;GeQ4>lNh7jCrC*8Zv+S1Q;IbNK0ccK!^UqSsx47Y^_NIU|)LIKP~aX3(DODKC*i< x0a6P%XD;+wK8>3^=|C_N{a?!=5^O5AD=n@vE6uh2Yva$z!J65k8Kwl%e*jm)Kkonl literal 0 HcmV?d00001 diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 203700224..6793380b7 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2525,6 +2525,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_comments_open_none" = "Leave a comment"; "lng_replies_view_original" = "View in chat"; "lng_replies_messages" = "Replies"; +"lng_hidden_author_messages" = "Author Hidden"; "lng_replies_discussion_started" = "Discussion started"; "lng_replies_no_comments" = "No comments here yet..."; diff --git a/Telegram/SourceFiles/dialogs/dialogs.style b/Telegram/SourceFiles/dialogs/dialogs.style index da0d60b56..4d379e4fb 100644 --- a/Telegram/SourceFiles/dialogs/dialogs.style +++ b/Telegram/SourceFiles/dialogs/dialogs.style @@ -347,6 +347,7 @@ dialogsForumIcon: ThreeStateIcon { dialogsArchiveUserpic: icon {{ "archive_userpic", historyPeerUserpicFg }}; dialogsRepliesUserpic: icon {{ "replies_userpic", historyPeerUserpicFg }}; dialogsInaccessibleUserpic: icon {{ "dialogs/inaccessible_userpic", historyPeerUserpicFg }}; +dialogsHiddenAuthorUserpic: icon {{ "hidden_author_userpic", historyPeerUserpicFg }}; dialogsSendStateSkip: 20px; dialogsSendingIcon: ThreeStateIcon { diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp index a2086bdde..5640ad8a2 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp @@ -270,6 +270,7 @@ enum class Flag { RepliesMessages = 0x10, AllowUserOnline = 0x20, TopicJumpRipple = 0x40, + HiddenAuthor = 0x80, }; inline constexpr bool is_flag_type(Flag) { return true; } @@ -312,6 +313,7 @@ void PaintRow( const auto history = entry->asHistory(); const auto thread = entry->asThread(); + const auto sublist = entry->asSublist(); if (flags & Flag::SavedMessages) { EmptyUserpic::PaintSavedMessages( @@ -327,6 +329,13 @@ void PaintRow( context.st->padding.top(), context.width, context.st->photoSize); + } else if (flags & Flag::HiddenAuthor) { + EmptyUserpic::PaintHiddenAuthor( + p, + context.st->padding.left(), + context.st->padding.top(), + context.width, + context.st->photoSize); } else if (!from && hiddenSenderInfo) { hiddenSenderInfo->emptyUserpic.paintCircle( p, @@ -548,7 +557,7 @@ void PaintRow( // Empty history } } else if (!item->isEmpty()) { - if (thread && !promoted) { + if ((thread || sublist) && !promoted) { PaintRowDate(p, date, rectForName, context); } @@ -607,10 +616,15 @@ void PaintRow( } p.setFont(st::semiboldFont); - if (flags & (Flag::SavedMessages | Flag::RepliesMessages)) { + if (flags + & (Flag::SavedMessages + | Flag::RepliesMessages + | Flag::HiddenAuthor)) { auto text = (flags & Flag::SavedMessages) ? tr::lng_saved_messages(tr::now) - : tr::lng_replies_messages(tr::now); + : (flags & Flag::RepliesMessages) + ? tr::lng_replies_messages(tr::now) + : tr::lng_hidden_author_messages(tr::now); const auto textWidth = st::semiboldFont->width(text); if (textWidth > rectForName.width()) { text = st::semiboldFont->elided(text, rectForName.width()); @@ -622,7 +636,7 @@ void PaintRow( : st::dialogsNameFg); p.drawTextLeft(rectForName.left(), rectForName.top(), context.width, text); } else if (from) { - if (history && !context.search) { + if ((history || sublist) && !context.search) { const auto badgeWidth = fromBadge.drawGetWidth( p, rectForName, @@ -773,11 +787,18 @@ void RowPainter::Paint( ? (history->peer->migrateTo() ? history->peer->migrateTo() : history->peer.get()) + : sublist + ? sublist->peer().get() : nullptr; const auto allowUserOnline = true;// !context.narrow || badgesState.empty(); const auto flags = (allowUserOnline ? Flag::AllowUserOnline : Flag(0)) - | (peer && peer->isSelf() ? Flag::SavedMessages : Flag(0)) - | (peer && peer->isRepliesChat() ? Flag::RepliesMessages : Flag(0)) + | ((peer && peer->isSelf()) ? Flag::SavedMessages : Flag(0)) + | ((from && from->isRepliesChat()) + ? Flag::RepliesMessages + : Flag(0)) + | ((sublist && from->isSavedHiddenAuthor()) + ? Flag::HiddenAuthor + : Flag(0)) | (row->topicJumpRipple() ? Flag::TopicJumpRipple : Flag(0)); const auto paintItemCallback = [&](int nameleft, int namewidth) { const auto texttop = context.st->textTop; diff --git a/Telegram/SourceFiles/ui/empty_userpic.cpp b/Telegram/SourceFiles/ui/empty_userpic.cpp index 7c46b7826..2e3d9cbf0 100644 --- a/Telegram/SourceFiles/ui/empty_userpic.cpp +++ b/Telegram/SourceFiles/ui/empty_userpic.cpp @@ -151,6 +151,22 @@ void PaintRepliesMessagesInner( fg); } +void PaintHiddenAuthorInner( + QPainter &p, + int x, + int y, + int size, + const style::color &fg) { + PaintIconInner( + p, + x, + y, + size, + st::defaultDialogRow.photoSize, + st::dialogsHiddenAuthorUserpic, + fg); +} + void PaintExternalMessagesInner( QPainter &p, int x, @@ -397,6 +413,45 @@ QImage EmptyUserpic::GenerateRepliesMessages(int size) { }); } +void EmptyUserpic::PaintHiddenAuthor( + QPainter &p, + int x, + int y, + int outerWidth, + int size) { + auto bg = QLinearGradient(x, y, x, y + size); + bg.setStops({ + { 0., st::historyPeerSavedMessagesBg->c }, + { 1., st::historyPeerSavedMessagesBg2->c } + }); + const auto &fg = st::historyPeerUserpicFg; + PaintHiddenAuthor(p, x, y, outerWidth, size, QBrush(bg), fg); +} + +void EmptyUserpic::PaintHiddenAuthor( + QPainter &p, + int x, + int y, + int outerWidth, + int size, + QBrush bg, + const style::color &fg) { + x = style::RightToLeft() ? (outerWidth - x - size) : x; + + PainterHighQualityEnabler hq(p); + p.setBrush(bg); + p.setPen(Qt::NoPen); + p.drawEllipse(x, y, size, size); + + PaintHiddenAuthorInner(p, x, y, size, fg); +} + +QImage EmptyUserpic::GenerateHiddenAuthor(int size) { + return Generate(size, [&](QPainter &p) { + PaintHiddenAuthor(p, 0, 0, size, size); + }); +} + std::pair EmptyUserpic::uniqueKey() const { const auto first = (uint64(0xFFFFFFFFU) << 32) | anim::getPremultiplied(_colors.color1->c); diff --git a/Telegram/SourceFiles/ui/empty_userpic.h b/Telegram/SourceFiles/ui/empty_userpic.h index f71335a6a..5fc559818 100644 --- a/Telegram/SourceFiles/ui/empty_userpic.h +++ b/Telegram/SourceFiles/ui/empty_userpic.h @@ -81,6 +81,22 @@ public: const style::color &fg); [[nodiscard]] static QImage GenerateRepliesMessages(int size); + static void PaintHiddenAuthor( + QPainter &p, + int x, + int y, + int outerWidth, + int size); + static void PaintHiddenAuthor( + QPainter &p, + int x, + int y, + int outerWidth, + int size, + QBrush bg, + const style::color &fg); + [[nodiscard]] static QImage GenerateHiddenAuthor(int size); + ~EmptyUserpic(); private: