From edb7cf197ac2531d31a2f6a540c2867867c04ed7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 13 Nov 2023 10:07:46 +0400 Subject: [PATCH] Improve reply preview above the field. --- .../Resources/icons/chat/input_forward.png | Bin 402 -> 759 bytes .../Resources/icons/chat/input_forward@2x.png | Bin 858 -> 1393 bytes .../Resources/icons/chat/input_forward@3x.png | Bin 1305 -> 1881 bytes .../icons/chat/input_link_settings.png | Bin 0 -> 829 bytes .../icons/chat/input_link_settings@2x.png | Bin 0 -> 1507 bytes .../icons/chat/input_link_settings@3x.png | Bin 0 -> 2213 bytes Telegram/Resources/icons/chat/input_reply.png | Bin 593 -> 0 bytes .../Resources/icons/chat/input_reply@2x.png | Bin 1257 -> 0 bytes .../Resources/icons/chat/input_reply@3x.png | Bin 1894 -> 0 bytes .../icons/chat/input_reply_quote.png | Bin 0 -> 676 bytes .../icons/chat/input_reply_quote@2x.png | Bin 0 -> 1156 bytes .../icons/chat/input_reply_quote@3x.png | Bin 0 -> 1770 bytes .../icons/chat/input_reply_settings.png | Bin 0 -> 711 bytes .../icons/chat/input_reply_settings@2x.png | Bin 0 -> 1358 bytes .../icons/chat/input_reply_settings@3x.png | Bin 0 -> 1887 bytes Telegram/Resources/langs/lang.strings | 2 + .../chat_helpers/chat_helpers.style | 8 +- .../SourceFiles/history/history_widget.cpp | 229 ++++++++---------- Telegram/SourceFiles/history/history_widget.h | 3 - .../history_view_compose_controls.cpp | 72 +++--- .../controls/history_view_draft_options.cpp | 2 + .../history/view/history_view_reply.cpp | 82 +++++-- .../history/view/history_view_reply.h | 8 + 23 files changed, 215 insertions(+), 191 deletions(-) create mode 100644 Telegram/Resources/icons/chat/input_link_settings.png create mode 100644 Telegram/Resources/icons/chat/input_link_settings@2x.png create mode 100644 Telegram/Resources/icons/chat/input_link_settings@3x.png delete mode 100644 Telegram/Resources/icons/chat/input_reply.png delete mode 100644 Telegram/Resources/icons/chat/input_reply@2x.png delete mode 100644 Telegram/Resources/icons/chat/input_reply@3x.png create mode 100644 Telegram/Resources/icons/chat/input_reply_quote.png create mode 100644 Telegram/Resources/icons/chat/input_reply_quote@2x.png create mode 100644 Telegram/Resources/icons/chat/input_reply_quote@3x.png create mode 100644 Telegram/Resources/icons/chat/input_reply_settings.png create mode 100644 Telegram/Resources/icons/chat/input_reply_settings@2x.png create mode 100644 Telegram/Resources/icons/chat/input_reply_settings@3x.png diff --git a/Telegram/Resources/icons/chat/input_forward.png b/Telegram/Resources/icons/chat/input_forward.png index c04e20ceb36fcc112bb8177c773f554fad0ec04b..2d9c78335437873d77d777240c7cec1597533844 100644 GIT binary patch delta 701 zcmV;u0z&l|*jX4XM2Hp^qS%Oya)tl@_u;!U%hP?lK)Q2^ z$L!2E-^|XwoxQj?%m38@gTe4?e=ktJYv%%zsNHTin@w2EX7kh2(~p1h@$peEmq{dl z{WF0?A{mWFcXxLPu2d@BZg)1DEf$OAa#<)8lF1~0QYtc^&;Q;F6e?)%z}}crxM6Is zP$>Ml7buL+;c&np7K>TXKp?Q&?NX_fK=9cE7UskfXsJ{x5{VdJJRV1Xe+Gj=wOYNr zyd(p{;V=?Fvf1pR8WM0?kHun4*mk>}&*$s)IvR~C6pGDeW3$=Fm_q{KaY9#DSEQG! zqfEVCZ!(!I7K`0(e}8|+&y&eyrqiifttP`FkqA=?^DUK1GMS77@X|FJO)i%!7K``y z_e=oNghHWoI*osfOaQ%Bf2*;I;FaS5(&=>1&(Am#7B9JMwOW83LcX8`gTcvULUPgc zUaw~~8oxjdD9#gSPGdZ_4~IjQO2s#a)oSH#%W(o&Zf|dSCBU_4G#V!rEb+6G_VIZ9`ud7JVFEgxPM6C?e|j+)y&LkT)3^Oh`hfL7#_it`)Xr$B@;mtwJ z%gc-3@5c^k@tsZw_Z%-34M0tx)oRgkpU;PpM+>gk>kkhP*Z~c|Wyh1kG3zlB@EFMD jaxRLq@7#fJ>cAgk6P6JjO>|%L4TpoEqI1ryJf$ZB?6)@GoUcbI6vH zMu(gGx3k~%2^1;d+4xo1yR1o5p}h5qW9fv~4B_h~L)bO>D&A{u+AsCyXrz0O;I4Jd z$v%C*pS2#YpT2k1`)ZBTlemA%DKz`Cw|+Z$Den5R zbc3y`N$1{uy;(nj$)a!Z9Y3XQ;@$Vp%KSd4{ou{bIXkV?W-irkS9`Z>Me{3#>x}E- kj92g#$v${>G`)b`ZHm#7-75dBfg!=*>FVdQ&MBb@09tv8N&o-= diff --git a/Telegram/Resources/icons/chat/input_forward@2x.png b/Telegram/Resources/icons/chat/input_forward@2x.png index c500804d00c95acedb1168d6edb3fca389c357d8..26e435458b38ec40a6ec13bf079158b6090c20b7 100644 GIT binary patch delta 1340 zcmV-C1;hH<2Js3ZiBL{Q4GJ0x0000DNk~Le0000$0000$2m$~A03{3NiIE{le?XuE z00aO40096106+i$002f&La+b;1lvhOK~!i3?O91EZc!XJKSSm*LdFt8G87gl$wIO* zWg`nxR!U0AuuwKON-1H1l2T;Yu)qQdnL?(BEQ~$FGrjkF@6>s>d(XY!b?^PY&*I+2 z*E#?DAAjHfob&&mYhj^3Is!TZe>ws>0y+XZ0_H=&QrdK4Vq#ia8h92L7gtwTrJ29i zTU%S(-rnBdoCi}7zn7O1-n6#166b&Zd&sz@rA0!-EU(xpWMyUb@bKW|+6b&ioLx(vxLDn8Xg`_AkWOqB=0cbe`FJTSW{EO zS7iLT4b#Ns<>kl6hqbkJQc}{~+#Gn4lauia#}^hBo}Qk537)gFv%bDQrZ)2sr>3Uh zF2X?a;K2aX$;nCcc%#5-P*4y+<>m^eASzJB6$uRu?e6X_Dk|a+6f;ff*bQR8etpG4XzPcXxPr z`2PMLQyc}}-rkglIp75VsrmVNS65divnnDyK0Q4pUeaG2WRH)Je>XQb&(F^wZftCj z;vzOS_Ve=-l+w~tX{*8jAho`}?&s$xEhzT(Kd3wo9Jd}G9y}sW21iFncXxMtdwaav z-rjzDd&6LJa})4m5E2r?6Ol8Gi;KfPfelIyGml4f4IwMS!om^~5(GuVUjmQ@>KPds z{{H?K7Z-(vge^9-(wZ$_aa|&B1cyn@cfQ3vERcxrS$Qyig|&4-ezx)_kaARnIRGMgd3j=b zG^R&HMAX*Sc64-I&RaKQ7+bVfbvs71Cs|8yqkCN{E{9L7T2E|`rUyap30~Lej zRWjgC5cR1LI}Iq<)P(JhN_TnUXfRS!Q#J6FsUkl=pJz{OiX9dW18UWyqocdKJ25sM z9myFT9nCbY4G~)>&m?b(yLeP%D6rAlQIlxsPEJmEf1JW8`ikJ-U@E2k0J}c^U!h?_ z85tQtvnFPh*%NbBA#xudA2D%l=-JuXT$6N+o-idPMcRgR0Jw*BadDB>puyX=wl?ZC z8DO((XlRgAHcAA5t9)`-pn;3hD(Lkf@g55fU!tT%=v%P>@c9QTgt8fTz&*dv00agG z%D2Z1e*o>9>F!B!eM0kRd3pJ(H@?CE>g(&}$FBh={ZzBFv*YRM`BjbF0C3M&Sy}m2 z4QlygVq#$U`1m*=AV7hxrKKhE2cmDrorMAo8i?TjQ1Nvv`g8<>si_og5cm(%fp*IW6o5^A(rX)BbY*;s3`_wbg53=&KMBDM6)ovnOx= zyvg#UQTln=&yQ>KjjXG$TTY&N-d4Oi-RPLa>)ed}B0qkl%3a#W!mvVzm4PWhbAgXL zD@ByQ4=W!Vv$0&iuiE6mxJ|!HcInIfep|LXGHdhAGijS|TFlM=^D(1g|Ms6Xd7ppQ z#0X4g_n2||=_N6)Rtp6+;RyoatEcLUbq6Y|iBAwPpWUlF{dAy`n)C#L?YGyi4bciz zRFj_|P`-Qa+OXAu3d@)$2z>v&ckR`z_ijAw1x7P(oPO$b{p+B?-+v7R zFY|hI^dCRm=eBr*z-4}qjw@Dk`-+boS;M|7{%CQz%k#yDrqBP^S6^ap*ed$%hd|(i zi`QqwtrtJVvpDkG*1x}x{%@YV_tCDoOVs{#fBFAueatoO!~Xfj_x4EJFT0pABS!D} zpBv}-Ds1F@S6?-H{q_xy8C5 zq~|E}ghr3u3{$!`RxlU|WQsQg8H({cuqnM|3eYqY*X?k{w&P9ac(o ovnw!9EMwFVP5#J`LX2Vm*`L=Pi_?&QpbARYp00i_>zopr0ADj!5dZ)H diff --git a/Telegram/Resources/icons/chat/input_forward@3x.png b/Telegram/Resources/icons/chat/input_forward@3x.png index 9df3f2369c21a0899785b8ae95eeb6f50cdf51a4..488f8e1e109bc5b097eaab02c711b5829e44103e 100644 GIT binary patch delta 1831 zcmV+?2iW+T3fT@JiBL{Q4GJ0x0000DNk~Le0001B0001B2m$~A0B!oHLe_)^k z00aO4009610AK(B005~oUrqo32E$22K~#7F?ORDm98DBfiT-iJH5fNg6c-TpLqz1) zn8X!9K@brIgCTk{c=IBPSv*Qa#DfPxK`-J#A;zE=S5*8_Tq3w2;)dcHjY|Ii!-k?6 zr+ccWXL`!{YYxNfs#mYx`?~5?f4x`LHa7gn5#R`L1ULd50geDifFr;W;0SO8I0762 zjsQo%st~YMYK^b2Z&+9uTK)X_b9Z-FX>)7l4-E|+9v=Sl=g+_QKM;6Cp*7n~Z(C7O z(dFf(0FC$`g{Y#JW1XBBCVJ5kkV2Iek0UA{gsGICo-Vxn+1c6l_IA+kf8M=INJtP0 zfBg9I>eVY-TU!SQhrjgwgmN%XPEMYmp9`(5`kTEhUDR^83b z&AGWb)5@v z$=5Q}aCUZv|02`;>({SjVbvG}!`;DW|9$@hVVK*-=K1sIQBhGoe?C4m%u+nj(a{7Q zf#~Y$qTEgQk$RWhw;GmO}lW_tq+zP=)PfriAL`P3He?*}=f)GjE-Q5YGz>#-%ch}U^;GcMR)GCcOWB@`(>+9Pjdv#|rJ{=JxH|x7^%ZolaFgKA~)1Utf=07p6MaAgQdFkSW947QE)OXU|eoQwg$Z zX=#ChfkJm{YipGK3T%|yLPtl(zP`S_VCbv3IAf>l$n{S zNGF;pMmoi6e^6artw_Gs%t(C@bsrL_RjLqjEDz<#mwf#AQE4yQ@nZ+DxVWg-0F1R5AfG{83X=lQ>Zg8YMK_XryHe3JMw<8wUmka5gEA zf_yDT>%*Oz3CuH<2zPh)oSdApvNHUGmKPfr7uV9#e?qnb@|M%r4h;>txVXr7&2%l6 z=c=kIBy;I)R?0awHRa{y#WV_fm3#X1>8DShe*OBT)LT=%{LH?mW&bye_<6XFE5u+T&rT_D`Zr(U={X3NT+B8 zgG4__Zm_fK5x)%Vq+h;#DWSE7#dURcVzn5dk!)fj7Q>0_@$oSupb#|}isox;Yl&Kn z5Nzdxa21RZTm&`LWE5!+4(Z(&E+!!BPR~y`5$OMO|65*OhATy;5w`)5a>sGt`}gm0 zf4D|C6%pURe@E<&SVvJSGcqe(-LY3f;#J;v;!2xwLz2Z)4a{~*W3baNE-t1yr&n~c zN_uDUTnx8|h<-8zZmU#QRz7(`JHd?rh|!Z(gX@6! zl=n4Ku8|%f`1R7#QYkr>FUPTg6hN)5f2~GeN~Ht{_m50|Kgg7r`uX|kMF%&j;EdJu zL<5kSZkVZ2Teod?cJ@Pn5VEQd4h;eXuMZwwg;;xj=%Mi)6%NAG>nRTqZn-{=k7ji) zj{_ZC7*>xCB**~7&^>8`refnqrWoP|e4=5n2_=IRK#%OEJ-MfWBd`}QUQilOeZ!^~ zpvU*E2Esy&Agr~oU%#d?o1Vu?zV^X32XV7Gz6!w38)sN#{xbc&82xKEEhoM>#23^1 z`}?e4@ind4TpCA!Bft^h2yg^A0vrL307rl$z!BgGa0EC490861M}Q;15wIo%{sTO3 V7T;0;X<7gP002ovPDHLkV1huROdS9K literal 1305 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1ASip>6gA{T+3Vp}Gz|!pL;uuoF z`1a05eVss&;~#hXFS?KsVztz%F-%EHii_*w2lfl6|FNn_as6ko&5DYWS|l`=jkT%e z!M>gPdveUIv&+iQo!gnde{#;Ivb1w|e*Zp``u5(;NyX>X`NbA<{xQ6zzw7Hgk6M7ruY_a$_4$f$Eo!A2+^#`*v#!kX=wwS5@`u_pe`T6qsXpW$O0r z+4JS^-@jrL7}v4N#O>a zUcN3fQ&a58qsHUMkN>@THFUA1_^!X#uTPJUjO=9GS@GaTf%f?|MLXBX0@({@O-kQmKz{zp`oH;vQzI<6*}uE_Q{EL_n$55 zy>-!t3l}Cx%gU~;Si0ArQS99BM~@Dv7Vl~4pA;we;7d+aobW$3e;*%_Z?7#&7#>WM z%ogW(zlb?+V*Un(b-9;6t$z6b!H0K0U%p)VG-|C_0?YPU30MD}R5i#;OLIHgF0(L` zA)ImRr^oN!t(!f6e)wm@r~dI={|ju^^Z)K%b9lRF>AD0RA+`SG^=sFP+IdX6IO|&5 z712!VC;zOBtz39ry3?&Bljcs|x@XUvmGz}=;nv^u<#w!KnDzIoOj@X(p58WQ_5Ngr zI~*l5#OKyrpY8tP?JCBCu!MCv9`)+i*KOXq@Nr5j@9o0epp+dC-`8DhUCph0k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSVF5FO4N|zKE$K4@1JiO(7sn6} z-nY|EduIiT9Qz!oX?w(>K%kFnmPpEr3k!oC3zRtgmUeJ_<~NYy@NIDrR1&y2^TB~- zFD*VWo?~%zcWSf!c3@u=qc?y4d}SLO zo0^)MKYupI#m9?_i7h*w7}CBqYORApLt15}r3@cXm;C(KA3qja$gHwmKILp$vC_l` zG6kv%&z?VTwMjmhv@v9L=#EF-HnP7sTwlL_{jx;rnP}R!ZQIs_tv>$vWQq|xJ9~P1 zy3+Ay&z7Bke*5m-+WPwSSF?^LZM^=Pb9I!2XF+{^eQ~ifvzYz$W5?KL23%rroN_S1 z!p^Sm_+z!nFMs}wTz|dYY2oF|mm_qhc`dzi;nt?JY1wA8WjgeY7#E0hv6@WvN=;99 zUw(PwfwyHq|1RorQM$F@u^iWyMgD4&83HvgWclauSXxXt{4n74ex3Pq<~a1VtXojP zS0pbhTPs;|h+)U0(vxYMC+&~B)t~=RHf=?0F4Mb5j~@N{6{Vp$zwuaPhKQpwBje7P zcOO0!q^7#MG}TpB?%cos{>zerDme2$gV>%yll+x zj=SvW625mtKy%kG^O9#>Q-peN&0KU*Bk|1cg4XhtWj<#_z23E3O!#nJ;M31PmoHD& zkk8-c#mCukXlB#LZ&?eH)1J++;qjg@>p00i_>zopr E00J9n(*OVf literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/chat/input_link_settings@2x.png b/Telegram/Resources/icons/chat/input_link_settings@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb12d2033a21267742df7b62a3ba3d14892153f GIT binary patch literal 1507 zcmV<91swW`P)00001b5ch_0Itp) z=>Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuBO-V#SRA>e5noB5lT@=S(_xmN} zewnyMxeZP9DP~3#i2)-6rHmOUbCfA!%7lrMi4=(<$t@}5l1n7yBfjs~yKBGaJ;y%J zd7kgt&*!ak22cB}v-V#9wf5R;|M%v{5BG5+;6}iWfExjQ5vZ!Fnw*^6+}xa-o9pQ4 z&}T@?$Zc(H@9*#b7@q0rX)Tui!=NFmzL}Ys^YimjQBl{|*Hcqdc#)NrRZ>!NdV0FG zwG|#79vvMWA0MBXn3$51lAfN<*Qci^999h&XnA{kJD@*4KJxSPu^k*7yuQ9JB%hz3 zhFSU5yt%oFi;D{|&|sCloSYm!-QV9I9UajCv}oW-P*9Mn7iy|cn&hFXaksa(`IMZT z+}YVVK0eMo)YjG_VIIcD#{T~5+1uNDetuRB7-%_Jjt?R~Zf|eNCEBDobt%wLe709q zR3v=>{o~^!b;;+^G<8&Fv#`fJ)YsRSm6e^Hoh>ddUS3{Wam2*LApAzjV}+=aR99DT zY;2HSJT!P!X?{m}O-&8Be-+W6H5XxkvD&3jL_|bOOG{Exk}NrIZ*Q_aF)@*smv?n_ z)z{Yt=)u83wlfM5o1MK6RN;z>io(J|^a%lJxwEr#aByJX%a^ZRU0ucif7!-EF*FUK zkeZsRGM15%F)}i8adBZCicMxuW6GpkFUMGy)q>@2{}w_=0WBXb;+X@ zjSAh}-NFIq=mi?qgXky-yhe!jL&KvuMzcRSjJ+I%IN;5$G2d7DS5UgUT5Dw9sj8ZdU2|O>RVwRY~ux28`&@WFD+KNZ6+ZdVVV_E5Fq7 zn-HF3+^uXXrU^asfaFUYa1G%Ayw&CgX4#2&=1LUo?3>EhL zf*!5`UlQoy-X2Skw}5}sXLQN$v8v)Z&NGMo4!$JN^GkGov*-60=2sYF##J2CXY^#I z_UxA@Lvbdy2FPdhR0ZvKtW-BS*QV2n^n@xYb!=)5`tm%DKIo~-au8h&_7?$;9YeJROscH&JkNRS<}=dSzC?h;jM6QO{WvPKQUQRI+3u) zm6nzQmm3lO0CjkH$p2R0kCVQxjvE0t0&WD{2)Ge&Bk+es;9tDSDA2t=B%S~O002ov JPDHLkV1mdizZC!g literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/chat/input_link_settings@3x.png b/Telegram/Resources/icons/chat/input_link_settings@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..851858fafd273a93da6f4f3c777f7b7542e36b7d GIT binary patch literal 2213 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%0Dk-4V%BRT182&(SH zvb;yZe*pMwEw0%>!`@Nic5M8|na*8YFZq#{L#Bd>eG&GK@;ljy1{Qht-o1NSud$|8 z*Zm-cC!(HB%^!11$WkkICmjePrz&yJoQ%U&i?|-h;yO4490Cpjhk!%CA>a^j2si{B n0uBL(fJ49`;1F;KL`L90y_~>SyPuzN00000NkvXXu0mjfp578n literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/chat/input_reply.png b/Telegram/Resources/icons/chat/input_reply.png deleted file mode 100644 index f20b997732252fb8460a49a83b8826649e0a6243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(k>KRV@2c%6Yf@~BLxkQ3oKHinkQIG&snv~VD?#|9WhL| zw$-+umR*oJ%fH}9p^e?S8f_^n833%blu_|R`T^YqiLQ|G7TZ@;}~LWx7moA19>1g1@Xz3afv%pVMb zMHVvqp70+QSantFN|vbsk8)tO)!e4%mHPY6rcHKtt#fFR=|Aq@dHGyY?DfRmcklhx zJ^jm0!O2f;a`hz>hc8DvZELLNChWiepDp0BNr8-d;}Qm?l*JbrY>ww&Xi48DbYDzQ ztlMDz`NX|(pH)?@wx2#O2Kj3CGiNf4+15W8CxCL%>k+y#**b NJzf1=);T3K0RSy>^9BF_ diff --git a/Telegram/Resources/icons/chat/input_reply@2x.png b/Telegram/Resources/icons/chat/input_reply@2x.png deleted file mode 100644 index e44f5f79eb0d624cb436d5b4bd0b266f074245c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1257 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-euz(rC1}QXr;N#E0z!L1~;uuoF z`1aOWZPP#rh7XV9=KtjBw0F=DD?8+ra)0- z|LVVj2@Yoi5**mBh+J56PVhv-ET&mkEtw<(f*m$nxhpVdab<)(=SXqzWjy;zrjcib z=7Pw%$`cq(Sxr_KvluN{){s`(hpxGqDIzFHDJ(qv=*N#6GxGAT%?V3d{kXd{e)^$9 zP8L>HOxCh8GC!>5S=jzLdiwO~=D&YyZ=Z{rKX)SeY>eLk#JU{pk6j<<;$1# zkN%n**sv$+-=yx3CWeNJzkdDl_^YC>&Ry9mwsYssNAKSG+1T1neDyQ*#1Gr+Cr)r^ zeo7LxvbEjn_jlSfF%M5qL%X<2g-0)y*B$z3k~39SN~-JWqpbg5znb>+_dC0~y533d z6mGk<&+sN@L^^iKE7X-S=IbE z?%m^)mzQ7mR_1MfPL6}4W8+GV;H|H96M}<<_w3zksWyE@@8rqC8v6R-zSmslZEvVJ z`o;L}{rk?ozP+3)R^(Rw>;Cfg?b`V5$zl5|-tXA6N9WY3Q$l8aD>min|15gYuwANd z`RC7{U1AsRwQUvLw`-TwhmcR!5B2Txm=*h~?lC7l-@0|Hg8achW-aH=`CaZvV-Vc9 za3Nz{TwIOoo}D`lYpav_1Oz|+{QCFr-S8t9F9uEy%n%b0+`Vg;(5Dcg*BTGM7pA2x z6Fj0aXF*KQ@_+y83@t4^Up@c%Gt#4^u(VY5iMGGue1kQnb;n%embj#*s;<=C9Z+7r zea7tBo6T)wr7ew$S_I$n@$(<&5;|UYD%$do;KId=nbXqJ9z1$|X6od$VNgR#S%qs57vEj7 zb=v)d2N{ldp877gVat{$GZyT9$g1!yFf{b(kGeazZ*%i0_!-#R+P>N^yoc$CT~}9E zLUr|RE3@g-rypcG!kLzye)!$Hb+R?rZh1SrQP$Pvt*WkGxMhn;MT5n`KYwa0Y;68? zcl^J0=&yasPkXkm@1?V6&sO-Kz}ef|YtPCr^i4%+vF3!6pW~M>uUs-igjuUVBa+7> zFlb7m11q0uH>0Lkml4m30}E3O6zopr E0NQ6L4*&oF diff --git a/Telegram/Resources/icons/chat/input_reply@3x.png b/Telegram/Resources/icons/chat/input_reply@3x.png deleted file mode 100644 index 97688789f3449d4230f8628d4b4a4dceead488eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1894 zcmd6o`#;l*AICo*n@uxP4jZvZ!virixsJqF9*lD5IPByyLRL~_8Fg3}r1MS1%uy1` z<*0Z#Q+!a{an0q-ZMltHlDU*L*YEst&VO(o-ydG@*ZcDP>HT=TAMcx|+??c4swe;e zTD z3mXsZ?Gd{8ourFK-^kiBw&80l!gsR!hr60?AUIb)}NHwIniHQeVPHsuSay}g}$m&JAGPKp?xix=NerQkOxY zdVO9_MZ`znuj>942yURy9dYSvkBy0Gnw{0PW^AjWP$)Yb!rcA``8rr#Ie~qt8iQA>ytA1AM+1 z&OOM;%gs#{3eNEl^L*Vxr8R+AKU^1DU>MhLs(NWyE z^BDiR?;D~o^W%c_=6DlqaBOUc`m`%pTSsSNx|3yT_eC4A0nE(Iw1`BNU9RqLYhS-c z4-E~CVx!kyd;{*c{0LS#vHg;_)}_6@y)Rui6*SnSG$wC-a;W8O=AQw?4q2fZbGE5zkeh*qW*q0@^`f>Fv*G@LD(e|lsi@&^p#h%qi8FzP+h3HLEzHA&|u$ALGQ!Dq}Ft zcH9C&$Rt1XtS#l}AtF&}O6#{QW`-{^FW%}Ch}EQqg*9=x>64m`No#H;2K`8aeFI~M z6dfCDrD_snSzJ;wFXe9p$^21T`e*#yL}=T{$Oszy^D|O$adE(9&4QZc2})yKop~`S z=iKvo*mmV9x3Bs{BC&EUdVFc<%e|~Dd1Es(?dIlYIBEOZ;sO+T@#3p&9S8eMAm`~o zRWQa}Uhr&Xs#Q^Q<8DO&`~7_NRsH|o)enh?h%ndpx9;L;zT97aVM`Pf!b}bd!dWM8 zVwW7|cy|us2CnvZ#Ev!Oo*l43*wTGj^Gq&%|A*e*3-=$ii6w_Zs<}D*v7m*&cDu+T zoJ!4!NyxjKn>!b`p)9VlrTnn|iLdWY(wku;mv#^{Q&V*&0@j3MXJ;q+J44I6v7W=Z zr{Qf{4v&7DcFbg0ARx;T*Ow+>FtZG+s9WwDUsqSl{0agV_d@^4Z*6T&DKfOlDJs%} z+>|D5&0N{lx6Ly4?AZf~73y@{?{t3Ap=fEV*}i%8>SFm%YX|XoJbIAO-r*HA4SoM! zSI=x)#DLh4tjx@`iHQl%$%v?^5GWkt7=>JdAV-ipxTJ7lSjCn!JB{0rW?b$!93D|i zERuR!QsUmJTC{QqJW$Q=@0Y?QWxlAb<)+BRy=DtjQpMuLmUcx?E1)Rd=??A>QOP6? z$3jk99J`*GdAtElwxB?U5SB%U9Sp3$)Yk44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSVF5FO4N|zKE$K4@0~4R8i(`lf z@7qw@6OM@@{~n$8H z)AbrP{&#o1tG)ZXaQ)YPhi_Y+uRK?LuX@k9-=CFrS2Eu(bI|iUkhJke&bG5@%_Uo- z-hTe6H~nLkVe{(iE+4hoK585Kk1Ma56jEqcvaqAnLWYNpIW^gT z`Q`OZo5DMU3oT@{rgm|a?v6ci@ZQ_9+i%OvW(QitoV)Wq!ESzgl8MyPm3iBxPgK~j zExMR->#f-x2L%V=jK|ZrS@3Sz5w!Bi<3g90`VF}zQX9*yWZ%5lcQxzi$M(aDF-d>J z9ae^zN%a<3_&hmq^<~NHue+kw9%A!d7$DMp^zzFur=GZOiOSu7|9Jal?WtZLH?^`A z9C%scW+tZ?(Pm4H3Q$G5tUC!F7bcM5gV?>8e^L%de{t1su-hZ!Fo17^7 zRyciUOwp;2jVDt+3Exy-elzD&X5ph5_EmfT&HR7u(A?~;QFEed6xMx;judm$n|?jZ z)XvgRrnyD+V`s322*=u>l__Sk-{h(mxb@R# zs-7vcnp+|Jx6VF3%0S{s$-{219akFltv|5qEahhZTKy>%ltMgR{an^LB{Ts5Q0Eys literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/chat/input_reply_quote@2x.png b/Telegram/Resources/icons/chat/input_reply_quote@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c7bcb7d8eb746bf32d3e0fa1962bad88c36ac1d8 GIT binary patch literal 1156 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/chat/input_reply_settings@2x.png b/Telegram/Resources/icons/chat/input_reply_settings@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4aef116e3608f9e1029df99888c99af59a5e10 GIT binary patch literal 1358 zcmV-U1+n^xP)00001b5ch_0Itp) z=>Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuAxJg7oRA>e5Sz9PAQ5Zh#&Ea^F zOC&_@N=SH+kXtE2x#vZSC|*2x5%K6n;z8t6aw*CSN}@#aAmmQUEpja!my^pm-?2_( zH?#NJvu9@Q^D^_WTWihwzyJIH`DgzBU;EoP^-?{cdO-Dn>H*aQst5j`2Q18~IwB$> zCME_N7Zw(lmzT|{TCOfDE35AA?%z5WrdX7VYc~0&rY1uE=jTPnjg5`+378{9?n>*VC5 zx3^cOUM0mRCnrG{W*~TQVSwqx#DtPMm|}T)dcvu?v4SZUgwu9kW5cc zn~K%h*{K^~c(Y-TsUXt#BQ#oDTR8?RD=R`QtyYVmcX4sCx3{;owMBB^_T=a16WQ(U z?V+I|#2cna1fXZ*QNUpD|rqTO-9q zNJz-X#|Ksl3k!|%mYWBVUy)5yQ&Z`hkZv6u9C&+>8Gd|TWPNjU^Y!%=1_mA9w0b4m^I-qd_4E|_I6WQ()S~% zN=r+>bg&yCgCczCY$V^UuC8Xs{2wyDB$D}w5v;APWorW|48>59yeBO!jiC*Ti;I$( zi4?rNymWPSWo1J^Kmes=5J}PKHnjY#3;?c&hX?u$qag#XamaTrKKgA6zSq~ zb8`$005qzrsi`SC37L1}guXc6KXgFNq>JodU-?QSy@>^ zK_)8|6%~}ql-`ly(~R*~?dO>q@a}D(dbOQ)lTwEO5U!DOtb=0ei)grpH zhld9q2~5Qp08V&4+S=N9;`n5r7QjhmY^&r zC+GC^6u%N=l@UR?fj_qJCBfOCGKeaQ>H*aQss~gLs2)%~pn5>{0M!G3010L20?tMn QLjV8(07*qoM6N<$f)1%&*Z=?k literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/chat/input_reply_settings@3x.png b/Telegram/Resources/icons/chat/input_reply_settings@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f131d6aa4356e090975a845a10d10747d31a39 GIT binary patch literal 1887 zcmZ8ieK^zW8~+Z?!bnzPJ4m4wDypqID;qI+TdOATquFvziKhJ&t^E}UW-ya6S-wSGBX#fBK z)En#Hdzy96I2A*v}7GtBoN5=)y5TZ=pmBODzCE zw;TlMY8kX}R<85kY-G9a|Kf#0p=*Rc0Dxb5dtmp`L0>~d@cVsM$Y^)hAYE9EI9_2o z!E!avBqp61(Er$na7i6W4Zoy(DOjpE^-MpaL+2VSnGnI-@SS@Kv<$Y$&(Cf`5~6(j zy*Sr(1GymSb@=b9SN%R5jYvJBifG#WrHqp@|1hA0Xnj5v=eDwZ2?4T352j-P`j>Pt z0OdwUxhT!3x*^+>=9j8y9HkG=S<0I~CG|9VNv(#$! z#7OG|cEVh-p@%Oz92K(!S-4$aUq1tky}lGl9O#}6ZHRZWx6kbJs+RMBQDIBq&#&+A zua9UN&$)NQux#JMRSqmcg1YgmpG1)h5;uwQmsy;{|{`_#(>%^oSwKlog6kMw3)nPRx* zYRdeadhmq_^w!`WM@Prd;Nak(p!%fgsslMR8ciS&2ov;kENg5lX-RW48#e=ncdM(b zm$1>~#>6S+NwFOvm$Z^N_T<`zo zcCP@MY%zu72tphA=;-fmFv_t&qKM{k{N2=ieK-PvsAR@Kz-}6ihAT5>rTRwy+UeqA@WIqCpUs<;t|ci=tam(p@dEzV zvwcMKW14GuVHZ8wudJ^xj2JzxthN{vB3Vuci>5!lhS!FgR^J@ZVGsF$y8wa`91cJTTaj)?= zsf!ijCZv<$RJdeX+*kx8!QS#TMigXK$i|-Em z9_!%C>*h};EjKrBcUrukjm^@5kR;afj*f2dO)UR8?!D3>pmc*s^nP+cqFWPS)WFQn z&Q6*h`vAXt;L}`hZ1#;?w`vVR4NDDafq{WRK^7#0VUIL7;~^XE*?2~M37R44tgo+^ z$z)6>Gc^@R;$4jDtEY|3&dwUWqc*}3K~(DcIgA3_y4G!WX2u8#wLlf|9k%R6vm)wZ zC2P09yL73Nr%&}RyhgY;rTo0u^IIrtdiv?GgYyvDH|{V#Apw0RNK}@%q$%{ z_QZ6uwQOhN?uMqOJ9pYJZc1;>%s2j*J&``Jv&6TxeFV(O)!m;TG%c&AcU4EADlvf$ zw3S^#A<`MSR6ojE(cgb|vef-@^CQ2FPq2$o&`r}V9S2UAn3AVdDo=7?Da5R}wzl@f ze7xq?(}JvBPzhjm82|ONDmgDql;>$LkD#-FjHO1_8r1t7_GGHT;p5=`~p(d`e zk~OpU?%i94QsRdmpEWscbJaOa`vbU6!?8cMszP(EFfn9uM@?6zR!EbmIfFyFrO*=XEmfD0j(xbN8tT6aC?CrY3ih|R7zGc*; zU3Jvjr)&JsyCN6l%9UyJ9ab5_ngV6^U{<3dW{IJxtF*?ry1To((2o3xz`J>qxy>-+ z{&_*5r>Ez~JHF@;V;}Ve7!2my() - st::historySendPadding - st::historyReplyHeight, - width() - skip - _fieldBarCancel->width(), + width() - _fieldBarCancel->width(), st::historyReplyHeight); const auto hasWebPage = !!_previewDrawPreview; const auto inDetails = detailsRect.contains(pos) @@ -4418,10 +4418,6 @@ void HistoryWidget::leaveToChildEvent(QEvent *e, QWidget *child) { // e -- from } void HistoryWidget::mouseReleaseEvent(QMouseEvent *e) { - if (_replyForwardPressed) { - _replyForwardPressed = false; - update(0, _field->y() - st::historySendPadding - st::historyReplyHeight, width(), st::historyReplyHeight); - } } void HistoryWidget::sendBotCommand(const Bot::SendCommandRequest &request) { @@ -6243,20 +6239,7 @@ bool HistoryWidget::cornerButtonsHas(HistoryView::CornerButtonType type) { void HistoryWidget::mousePressEvent(QMouseEvent *e) { const auto isReadyToForward = readyToForward(); - const auto hasSecondLayer = (_editMsgId - || _replyTo - || isReadyToForward - || _kbReplyTo); - _replyForwardPressed = hasSecondLayer && QRect( - 0, - _field->y() - st::historySendPadding - st::historyReplyHeight, - st::historyReplySkip, - st::historyReplyHeight).contains(e->pos()); - if (_replyForwardPressed - && !_fieldBarCancel->isHidden() - && !isReadyToForward) { - updateField(); - } else if (_inPhotoEdit && _photoEditMedia) { + if (_inPhotoEdit && _photoEditMedia) { EditCaptionBox::StartPhotoEdit( controller(), _photoEditMedia, @@ -7486,7 +7469,6 @@ void HistoryWidget::cancelEdit() { void HistoryWidget::cancelFieldAreaState() { controller()->hideLayer(); - _replyForwardPressed = false; if (_previewDrawPreview) { _preview->apply({ .removed = true }); } else if (_editMsgId) { @@ -7818,25 +7800,23 @@ void HistoryWidget::updateForwarding() { } void HistoryWidget::updateReplyToName() { - if (_editMsgId) { + if (!_history || _editMsgId) { return; } else if (!_replyEditMsg && (_replyTo || !_kbReplyTo)) { return; } - const auto from = [&] { - const auto item = _replyEditMsg ? _replyEditMsg : _kbReplyTo; - if (const auto from = item->displayFrom()) { - return from; - } - return item->author().get(); - }(); - _replyToName.setText( - st::msgNameStyle, - from->name(), - Ui::NameTextOptions()); - _replyToNameVersion = (_replyEditMsg - ? _replyEditMsg - : _kbReplyTo)->author()->nameVersion(); + const auto context = Core::MarkedTextContext{ + .session = &_history->session(), + .customEmojiRepaint = [] {}, + .customEmojiLoopLimit = 1, + }; + const auto to = _replyEditMsg ? _replyEditMsg : _kbReplyTo; + const auto replyToQuote = _replyTo && !_replyTo.quote.empty(); + _replyToName.setMarkedText( + st::fwdTextStyle, + HistoryView::Reply::ComposePreviewName(_history, to, replyToQuote), + Ui::NameTextOptions(), + context); } void HistoryWidget::updateField() { @@ -7856,12 +7836,6 @@ void HistoryWidget::drawField(Painter &p, const QRect &rect) { auto hasForward = readyToForward(); auto drawMsgText = (_editMsgId || _replyTo) ? _replyEditMsg : _kbReplyTo; if (_editMsgId || _replyTo || (!hasForward && _kbReplyTo)) { - if (!_editMsgId - && drawMsgText - && (_replyToNameVersion - < drawMsgText->author()->nameVersion())) { - updateReplyToName(); - } backy -= st::historyReplyHeight; backh += st::historyReplyHeight; } else if (hasForward) { @@ -7871,12 +7845,11 @@ void HistoryWidget::drawField(Painter &p, const QRect &rect) { backy -= st::historyReplyHeight; backh += st::historyReplyHeight; } - auto drawWebPagePreview = _previewDrawPreview && !_replyForwardPressed; p.setInactive( controller()->isGifPausedAtLeastFor(Window::GifPauseReason::Any)); p.fillRect(myrtlrect(0, backy, width(), backh), st::historyReplyBg); - const auto media = (!drawWebPagePreview && drawMsgText) + const auto media = (!_previewDrawPreview && drawMsgText) ? drawMsgText->media() : nullptr; const auto hasPreview = media && media->hasReplyPreview(); @@ -7890,86 +7863,11 @@ void HistoryWidget::drawField(Painter &p, const QRect &rect) { }); } - if (_editMsgId || _replyTo || (!hasForward && _kbReplyTo)) { - const auto now = crl::now(); - const auto paused = p.inactive(); - const auto pausedSpoiler = paused || On(PowerSaving::kChatSpoiler); - auto replyLeft = st::historyReplySkip; - (_editMsgId ? st::historyEditIcon : st::historyReplyIcon).paint(p, st::historyReplyIconPosition + QPoint(0, backy), width()); - if (!drawWebPagePreview) { - if (drawMsgText) { - if (hasPreview) { - if (preview) { - const auto overEdit = _photoEditMedia - ? _inPhotoEditOver.value(_inPhotoEdit ? 1. : 0.) - : 0.; - auto to = QRect( - replyLeft, - backy + (st::historyReplyHeight - st::historyReplyPreview) / 2, - st::historyReplyPreview, - st::historyReplyPreview); - p.drawPixmap(to.x(), to.y(), preview->pixSingle( - preview->size() / style::DevicePixelRatio(), - { - .options = Images::Option::RoundSmall, - .outer = to.size(), - })); - if (_replySpoiler) { - if (overEdit > 0.) { - p.setOpacity(1. - overEdit); - } - Ui::FillSpoilerRect( - p, - to, - Ui::DefaultImageSpoiler().frame( - _replySpoiler->index(now, pausedSpoiler))); - } - if (overEdit > 0.) { - p.setOpacity(overEdit); - p.fillRect(to, st::historyEditMediaBg); - st::historyEditMedia.paintInCenter(p, to); - p.setOpacity(1.); - } - } - replyLeft += st::historyReplyPreview + st::msgReplyBarSkip; - } - p.setPen(st::historyReplyNameFg); - if (_editMsgId) { - paintEditHeader(p, rect, replyLeft, backy); - } else { - _replyToName.drawElided(p, replyLeft, backy + st::msgReplyPadding.top(), width() - replyLeft - _fieldBarCancel->width() - st::msgReplyPadding.right()); - } - p.setPen(st::historyComposeAreaFg); - _replyEditMsgText.draw(p, { - .position = QPoint( - replyLeft, - backy + st::msgReplyPadding.top() + st::msgServiceNameFont->height), - .availableWidth = width() - replyLeft - _fieldBarCancel->width() - st::msgReplyPadding.right(), - .palette = &st::historyComposeAreaPalette, - .spoiler = Ui::Text::DefaultSpoilerCache(), - .now = now, - .pausedEmoji = paused || On(PowerSaving::kEmojiChat), - .pausedSpoiler = pausedSpoiler, - .elisionLines = 1, - }); - } else { - p.setFont(st::msgDateFont); - p.setPen(st::historyComposeAreaFgService); - p.drawText(replyLeft, backy + (st::historyReplyHeight - st::msgDateFont->height) / 2 + st::msgDateFont->ascent, st::msgDateFont->elided(tr::lng_profile_loading(tr::now), width() - replyLeft - _fieldBarCancel->width() - st::msgReplyPadding.right())); - } - } - } else if (hasForward) { - st::historyForwardIcon.paint(p, st::historyReplyIconPosition + QPoint(0, backy), width()); - if (!drawWebPagePreview) { - const auto x = st::historyReplySkip; - const auto available = width() - - x - - _fieldBarCancel->width() - - st::msgReplyPadding.right(); - _forwardPanel->paint(p, x, backy, available, width()); - } - } - if (drawWebPagePreview) { + if (_previewDrawPreview) { + st::historyLinkIcon.paint( + p, + st::historyReplyIconPosition + QPoint(0, backy), + width()); const auto textTop = backy + st::msgReplyPadding.top(); auto previewLeft = st::historyReplySkip; @@ -7998,6 +7896,87 @@ void HistoryWidget::drawField(Painter &p, const QRect &rect) { previewLeft, textTop + st::msgServiceNameFont->height, elidedWidth); + } else if (_editMsgId || _replyTo || (!hasForward && _kbReplyTo)) { + const auto now = crl::now(); + const auto paused = p.inactive(); + const auto pausedSpoiler = paused || On(PowerSaving::kChatSpoiler); + auto replyLeft = st::historyReplySkip; + (_editMsgId + ? st::historyEditIcon + : (_replyTo && !_replyTo.quote.empty()) + ? st::historyQuoteIcon + : st::historyReplyIcon).paint( + p, + st::historyReplyIconPosition + QPoint(0, backy), + width()); + if (drawMsgText) { + if (hasPreview) { + if (preview) { + const auto overEdit = _photoEditMedia + ? _inPhotoEditOver.value(_inPhotoEdit ? 1. : 0.) + : 0.; + auto to = QRect( + replyLeft, + backy + (st::historyReplyHeight - st::historyReplyPreview) / 2, + st::historyReplyPreview, + st::historyReplyPreview); + p.drawPixmap(to.x(), to.y(), preview->pixSingle( + preview->size() / style::DevicePixelRatio(), + { + .options = Images::Option::RoundSmall, + .outer = to.size(), + })); + if (_replySpoiler) { + if (overEdit > 0.) { + p.setOpacity(1. - overEdit); + } + Ui::FillSpoilerRect( + p, + to, + Ui::DefaultImageSpoiler().frame( + _replySpoiler->index(now, pausedSpoiler))); + } + if (overEdit > 0.) { + p.setOpacity(overEdit); + p.fillRect(to, st::historyEditMediaBg); + st::historyEditMedia.paintInCenter(p, to); + p.setOpacity(1.); + } + } + replyLeft += st::historyReplyPreview + st::msgReplyBarSkip; + } + p.setPen(st::historyReplyNameFg); + if (_editMsgId) { + paintEditHeader(p, rect, replyLeft, backy); + } else { + _replyToName.drawElided(p, replyLeft, backy + st::msgReplyPadding.top(), width() - replyLeft - _fieldBarCancel->width() - st::msgReplyPadding.right()); + } + p.setPen(st::historyComposeAreaFg); + _replyEditMsgText.draw(p, { + .position = QPoint( + replyLeft, + backy + st::msgReplyPadding.top() + st::msgServiceNameFont->height), + .availableWidth = width() - replyLeft - _fieldBarCancel->width() - st::msgReplyPadding.right(), + .palette = &st::historyComposeAreaPalette, + .spoiler = Ui::Text::DefaultSpoilerCache(), + .now = now, + .pausedEmoji = paused || On(PowerSaving::kEmojiChat), + .pausedSpoiler = pausedSpoiler, + .elisionLines = 1, + }); + } else { + p.setFont(st::msgDateFont); + p.setPen(st::historyComposeAreaFgService); + p.drawText(replyLeft, backy + (st::historyReplyHeight - st::msgDateFont->height) / 2 + st::msgDateFont->ascent, st::msgDateFont->elided(tr::lng_profile_loading(tr::now), width() - replyLeft - _fieldBarCancel->width() - st::msgReplyPadding.right())); + } + } else if (hasForward) { + st::historyForwardIcon.paint(p, st::historyReplyIconPosition + QPoint(0, backy), width()); + const auto x = st::historyReplySkip; + const auto available = width() + - x + - _fieldBarCancel->width() + - st::msgReplyPadding.right(); + _forwardPanel->paint(p, x, backy, available, width()); } } diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index 87b7edde9..10a54c858 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -647,7 +647,6 @@ private: MTP::Sender _api; FullReplyTo _replyTo; Ui::Text::String _replyToName; - int _replyToNameVersion = 0; FullReplyTo _processingReplyTo; HistoryItem *_processingReplyItem = nullptr; @@ -688,8 +687,6 @@ private: Ui::Text::String _previewTitle; Ui::Text::String _previewDescription; - bool _replyForwardPressed = false; - PeerData *_peer = nullptr; bool _canSendMessages = false; diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index 540d4ca5f..f697baf00 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -51,6 +51,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/controls/history_view_voice_record_bar.h" #include "history/view/controls/history_view_ttl_button.h" #include "history/view/controls/history_view_webpage_processor.h" +#include "history/view/history_view_reply.h" #include "history/view/history_view_webpage_preview.h" #include "inline_bots/bot_attach_web_view.h" #include "inline_bots/inline_results_widget.h" @@ -192,7 +193,6 @@ private: Ui::Text::String _shownMessageText; std::unique_ptr _shownPreviewSpoiler; Ui::Animations::Simple _inPhotoEditOver; - int _shownMessageNameVersion = -1; bool _shownMessageHasPreview : 1 = false; bool _inPhotoEdit : 1 = false; bool _photoEditAllowed : 1 = false; @@ -245,7 +245,6 @@ void FieldHeader::init() { updateVisible(); }, lifetime()); - const auto leftIconPressed = lifetime().make_state(false); paintRequest( ) | rpl::start_with_next([=] { Painter p(this); @@ -253,21 +252,29 @@ void FieldHeader::init() { p.fillRect(rect(), st::historyComposeAreaBg); const auto position = st::historyReplyIconPosition; - if (isEditingMessage()) { + if (_preview.parsed) { + st::historyLinkIcon.paint(p, position, width()); + } else if (isEditingMessage()) { st::historyEditIcon.paint(p, position, width()); } else if (readyToForward()) { st::historyForwardIcon.paint(p, position, width()); - } else if (replyingToMessage()) { - st::historyReplyIcon.paint(p, position, width()); + } else if (const auto reply = replyingToMessage()) { + if (!reply.quote.empty()) { + st::historyQuoteIcon.paint(p, position, width()); + } else { + st::historyReplyIcon.paint(p, position, width()); + } } - (_preview.parsed && !*leftIconPressed) - ? paintWebPage( + if (_preview.parsed) { + paintWebPage( p, - _history ? _history->peer : _data->session().user()) - : (isEditingMessage() || !readyToForward()) - ? paintEditOrReplyToMessage(p) - : paintForwardInfo(p); + _history ? _history->peer : _data->session().user()); + } else if (isEditingMessage() || !readyToForward()) { + paintEditOrReplyToMessage(p); + } else { + paintForwardInfo(p); + } }, lifetime()); _editMsgId.value( @@ -359,13 +366,9 @@ void FieldHeader::init() { updateOver(inPreviewRect, inPhotoEdit); return; } - const auto isLeftIcon = (pos.x() < st::historyReplySkip); const auto isLeftButton = (e->button() == Qt::LeftButton); if (type == QEvent::MouseButtonPress) { - if (isLeftButton && isLeftIcon && !inPreviewRect) { - *leftIconPressed = true; - update(); - } else if (isLeftButton && inPhotoEdit) { + if (isLeftButton && inPhotoEdit) { _editPhotoRequests.fire({}); } else if (isLeftButton && inPreviewRect) { const auto reply = replyingToMessage(); @@ -384,11 +387,6 @@ void FieldHeader::init() { _editOptionsRequests.fire({}); } } - } else if (type == QEvent::MouseButtonRelease) { - if (isLeftButton && *leftIconPressed) { - *leftIconPressed = false; - update(); - } } }, lifetime()); } @@ -431,9 +429,21 @@ void FieldHeader::setShownMessage(HistoryItem *item) { st::msgNameStyle, tr::lng_edit_message(tr::now), Ui::NameTextOptions()); + } else if (item) { + const auto context = Core::MarkedTextContext{ + .session = &_history->session(), + .customEmojiRepaint = [] {}, + .customEmojiLoopLimit = 1, + }; + const auto replyTo = _replyTo.current(); + const auto quote = replyTo && !replyTo.quote.empty(); + _shownMessageName.setMarkedText( + st::fwdTextStyle, + HistoryView::Reply::ComposePreviewName(_history, item, quote), + Ui::NameTextOptions(), + context); } else { _shownMessageName.clear(); - _shownMessageNameVersion = -1; } updateVisible(); update(); @@ -545,19 +555,6 @@ void FieldHeader::paintEditOrReplyToMessage(Painter &p) { return; } - if (!isEditingMessage()) { - const auto user = _shownMessage->displayFrom() - ? _shownMessage->displayFrom() - : _shownMessage->author().get(); - if (_shownMessageNameVersion < user->nameVersion()) { - _shownMessageName.setText( - st::msgNameStyle, - user->name(), - Ui::NameTextOptions()); - _shownMessageNameVersion = user->nameVersion(); - } - } - const auto media = _shownMessage->media(); _shownMessageHasPreview = media && media->hasReplyPreview(); const auto preview = _shownMessageHasPreview @@ -692,12 +689,11 @@ FullReplyTo FieldHeader::getDraftReply() const { void FieldHeader::updateControlsGeometry(QSize size) { const auto isReadyToForward = readyToForward(); - const auto skip = isReadyToForward ? 0 : st::historyReplySkip; _cancel->moveToRight(0, 0); _clickableRect = QRect( - skip, 0, - width() - skip - _cancel->width(), + 0, + width() - _cancel->width(), height()); _shownMessagePreviewRect = QRect( st::historyReplySkip, diff --git a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp index 850ecfe6b..6812cb273 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp @@ -642,6 +642,8 @@ void DraftOptionsBox( if (const auto current = state->quote.current()) { result.messageId = current.item->fullId(); result.quote = current.text; + } else { + result.quote = {}; } return result; }; diff --git a/Telegram/SourceFiles/history/view/history_view_reply.cpp b/Telegram/SourceFiles/history/view/history_view_reply.cpp index 6899a0832..10877d5c1 100644 --- a/Telegram/SourceFiles/history/view/history_view_reply.cpp +++ b/Telegram/SourceFiles/history/view/history_view_reply.cpp @@ -394,10 +394,11 @@ void Reply::updateName( viaBotUsername = bot->username(); } } + const auto history = view->history(); const auto &fields = data->fields(); const auto sender = resolvedSender.value_or(this->sender(view, data)); const auto externalPeer = fields.externalPeerId - ? view->history()->owner().peer(fields.externalPeerId).get() + ? history->owner().peer(fields.externalPeerId).get() : nullptr; const auto displayAsExternal = data->displayAsExternal(view->data()); const auto groupNameAdded = displayAsExternal @@ -415,38 +416,20 @@ void Reply::updateName( + st::historyReplyPreviewMargin.right() - st::historyReplyPadding.left()) : 0; - const auto peerIcon = [](PeerData *peer) { - using namespace std; - return !peer - ? pair(&st::historyReplyUser, st::historyReplyUserPadding) - : peer->isBroadcast() - ? pair(&st::historyReplyChannel, st::historyReplyChannelPadding) - : (peer->isChannel() || peer->isChat()) - ? pair(&st::historyReplyGroup, st::historyReplyGroupPadding) - : pair(&st::historyReplyUser, st::historyReplyUserPadding); - }; - const auto peerEmoji = [&](PeerData *peer) { - const auto owner = &view->history()->owner(); - const auto icon = peerIcon(peer); - return Ui::Text::SingleCustomEmoji( - owner->customEmojiManager().registerInternalEmoji( - *icon.first, - icon.second)); - }; auto nameFull = TextWithEntities(); if (displayAsExternal && !groupNameAdded && !fields.storyId) { - nameFull.append(peerEmoji(sender)); + nameFull.append(PeerEmoji(history, sender)); } nameFull.append(name); if (groupNameAdded) { - nameFull.append(' ').append(peerEmoji(externalPeer)); + nameFull.append(' ').append(PeerEmoji(history, externalPeer)); nameFull.append(externalPeer->name()); } if (!viaBotUsername.isEmpty()) { nameFull.append(u" @"_q).append(viaBotUsername); } const auto context = Core::MarkedTextContext{ - .session = &view->history()->session(), + .session = &history->session(), .customEmojiRepaint = [] {}, .customEmojiLoopLimit = 1, }; @@ -813,6 +796,61 @@ void Reply::stopLastRipple() { } } +TextWithEntities Reply::PeerEmoji( + not_null history, + PeerData *peer) { + using namespace std; + const auto icon = !peer + ? pair(&st::historyReplyUser, st::historyReplyUserPadding) + : peer->isBroadcast() + ? pair(&st::historyReplyChannel, st::historyReplyChannelPadding) + : (peer->isChannel() || peer->isChat()) + ? pair(&st::historyReplyGroup, st::historyReplyGroupPadding) + : pair(&st::historyReplyUser, st::historyReplyUserPadding); + const auto owner = &history->owner(); + return Ui::Text::SingleCustomEmoji( + owner->customEmojiManager().registerInternalEmoji( + *icon.first, + icon.second)); +} + +TextWithEntities Reply::ComposePreviewName( + not_null history, + not_null to, + bool quote) { + const auto sender = [&] { + if (const auto from = to->displayFrom()) { + return not_null(from); + } + return to->author(); + }(); + const auto toPeer = to->history()->peer; + const auto displayAsExternal = (to->history() != history); + const auto groupNameAdded = displayAsExternal + && (toPeer != sender) + && (toPeer->isChat() || toPeer->isMegagroup()); + const auto shorten = groupNameAdded || quote; + + auto nameFull = TextWithEntities(); + using namespace HistoryView; + if (displayAsExternal && !groupNameAdded) { + nameFull.append(Reply::PeerEmoji(history, sender)); + } + nameFull.append(shorten ? sender->shortName() : sender->name()); + if (groupNameAdded) { + nameFull.append(' ').append(Reply::PeerEmoji(history, toPeer)); + nameFull.append(toPeer->name()); + } + return (quote + ? tr::lng_preview_reply_to_quote + : tr::lng_preview_reply_to)( + tr::now, + lt_name, + nameFull, + Ui::Text::WithEntities); + +} + void Reply::unloadPersistentAnimation() { _text.unloadPersistentAnimation(); } diff --git a/Telegram/SourceFiles/history/view/history_view_reply.h b/Telegram/SourceFiles/history/view/history_view_reply.h index 5322d5c09..4b30a842d 100644 --- a/Telegram/SourceFiles/history/view/history_view_reply.h +++ b/Telegram/SourceFiles/history/view/history_view_reply.h @@ -63,6 +63,14 @@ public: return _link; } + [[nodiscard]] static TextWithEntities PeerEmoji( + not_null history, + PeerData *peer); + [[nodiscard]] static TextWithEntities ComposePreviewName( + not_null history, + not_null to, + bool quote); + private: [[nodiscard]] Ui::Text::GeometryDescriptor textGeometry( int available,