From 5ca7b95cdbe2ef9d02c6dadbf5d3a24eb80bdb60 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 14 Mar 2023 17:30:50 +0400 Subject: [PATCH] Implement new voice speed change control design. --- Telegram/CMakeLists.txt | 2 - .../Resources/icons/player/panel_close.png | Bin 284 -> 265 bytes .../Resources/icons/player/panel_close@2x.png | Bin 410 -> 412 bytes .../Resources/icons/player/panel_close@3x.png | Bin 593 -> 556 bytes .../icons/player/player_backward.png | Bin 314 -> 328 bytes .../icons/player/player_backward@2x.png | Bin 524 -> 557 bytes .../icons/player/player_backward@3x.png | Bin 736 -> 764 bytes .../Resources/icons/player/player_forward.png | Bin 297 -> 307 bytes .../icons/player/player_forward@2x.png | Bin 510 -> 556 bytes .../icons/player/player_forward@3x.png | Bin 775 -> 804 bytes .../icons/player/player_mini_full.png | Bin 540 -> 622 bytes .../icons/player/player_mini_full@2x.png | Bin 995 -> 1075 bytes .../icons/player/player_mini_full@3x.png | Bin 1506 -> 1628 bytes .../icons/player/player_mini_half.png | Bin 412 -> 534 bytes .../icons/player/player_mini_half@2x.png | Bin 665 -> 847 bytes .../icons/player/player_mini_half@3x.png | Bin 951 -> 1175 bytes .../icons/player/player_mini_off.png | Bin 306 -> 532 bytes .../icons/player/player_mini_off@2x.png | Bin 450 -> 825 bytes .../icons/player/player_mini_off@3x.png | Bin 647 -> 1208 bytes .../Resources/icons/player/player_order.png | Bin 314 -> 391 bytes .../icons/player/player_order@2x.png | Bin 527 -> 581 bytes .../icons/player/player_order@3x.png | Bin 772 -> 832 bytes .../Resources/icons/player/player_pause.png | Bin 229 -> 230 bytes .../icons/player/player_pause@2x.png | Bin 306 -> 310 bytes .../icons/player/player_pause@3x.png | Bin 422 -> 427 bytes .../Resources/icons/player/player_play.png | Bin 298 -> 295 bytes .../Resources/icons/player/player_play@2x.png | Bin 437 -> 478 bytes .../Resources/icons/player/player_play@3x.png | Bin 609 -> 646 bytes .../Resources/icons/player/player_repeat.png | Bin 396 -> 534 bytes .../icons/player/player_repeat@2x.png | Bin 606 -> 888 bytes .../icons/player/player_repeat@3x.png | Bin 1011 -> 1222 bytes .../icons/player/player_repeat_single.png | Bin 449 -> 531 bytes .../icons/player/player_repeat_single@2x.png | Bin 731 -> 902 bytes .../icons/player/player_repeat_single@3x.png | Bin 1233 -> 1291 bytes .../Resources/icons/player/player_reverse.png | Bin 198 -> 0 bytes .../icons/player/player_reverse@2x.png | Bin 212 -> 0 bytes .../icons/player/player_reverse@3x.png | Bin 298 -> 0 bytes .../Resources/icons/player/player_shuffle.png | Bin 514 -> 396 bytes .../icons/player/player_shuffle@2x.png | Bin 924 -> 568 bytes .../icons/player/player_shuffle@3x.png | Bin 1419 -> 815 bytes .../Resources/icons/player/player_speed.png | Bin 0 -> 152 bytes .../icons/player/player_speed@2x.png | Bin 0 -> 208 bytes .../icons/player/player_speed@3x.png | Bin 0 -> 255 bytes .../player/speed/audiospeed_menu_0.5.png | Bin 0 -> 536 bytes .../player/speed/audiospeed_menu_0.5@2x.png | Bin 0 -> 1120 bytes .../player/speed/audiospeed_menu_0.5@3x.png | Bin 0 -> 1667 bytes .../player/speed/audiospeed_menu_1.0.png | Bin 0 -> 478 bytes .../player/speed/audiospeed_menu_1.0@2x.png | Bin 0 -> 947 bytes .../player/speed/audiospeed_menu_1.0@3x.png | Bin 0 -> 1372 bytes .../player/speed/audiospeed_menu_1.2.png | Bin 0 -> 502 bytes .../player/speed/audiospeed_menu_1.2@2x.png | Bin 0 -> 939 bytes .../player/speed/audiospeed_menu_1.2@3x.png | Bin 0 -> 1351 bytes .../player/speed/audiospeed_menu_1.5.png | Bin 0 -> 522 bytes .../player/speed/audiospeed_menu_1.5@2x.png | Bin 0 -> 1020 bytes .../player/speed/audiospeed_menu_1.5@3x.png | Bin 0 -> 1408 bytes .../player/speed/audiospeed_menu_1.7.png | Bin 0 -> 475 bytes .../player/speed/audiospeed_menu_1.7@2x.png | Bin 0 -> 889 bytes .../player/speed/audiospeed_menu_1.7@3x.png | Bin 0 -> 1295 bytes .../player/speed/audiospeed_menu_2.0.png | Bin 0 -> 463 bytes .../player/speed/audiospeed_menu_2.0@2x.png | Bin 0 -> 817 bytes .../player/speed/audiospeed_menu_2.0@3x.png | Bin 0 -> 1215 bytes .../player/voice_speed/voice_speed0.5.png | Bin 559 -> 0 bytes .../player/voice_speed/voice_speed0.5@2x.png | Bin 1045 -> 0 bytes .../player/voice_speed/voice_speed0.5@3x.png | Bin 1745 -> 0 bytes .../player/voice_speed/voice_speed1.5.png | Bin 542 -> 0 bytes .../player/voice_speed/voice_speed1.5@2x.png | Bin 1017 -> 0 bytes .../player/voice_speed/voice_speed1.5@3x.png | Bin 1599 -> 0 bytes .../icons/player/voice_speed/voice_speed2.png | Bin 530 -> 0 bytes .../player/voice_speed/voice_speed2@2x.png | Bin 928 -> 0 bytes .../player/voice_speed/voice_speed2@3x.png | Bin 1454 -> 0 bytes Telegram/Resources/langs/lang.strings | 2 + Telegram/SourceFiles/history/history_item.cpp | 3 + .../SourceFiles/media/audio/media_audio.cpp | 4 +- .../media/player/media_player.style | 139 +++++--- .../media/player/media_player_button.cpp | 115 ++++++- .../media/player/media_player_button.h | 51 ++- .../media/player/media_player_dropdown.cpp | 306 ++++++++++++++++++ .../media/player/media_player_dropdown.h | 14 + .../media/player/media_player_widget.cpp | 167 +++++----- .../media/player/media_player_widget.h | 21 +- .../streaming/media_streaming_player.cpp | 5 +- .../SourceFiles/media/view/media_view_pip.cpp | 29 -- Telegram/cmake/td_ui.cmake | 2 + Telegram/lib_ui | 2 +- 84 files changed, 671 insertions(+), 191 deletions(-) delete mode 100644 Telegram/Resources/icons/player/player_reverse.png delete mode 100644 Telegram/Resources/icons/player/player_reverse@2x.png delete mode 100644 Telegram/Resources/icons/player/player_reverse@3x.png create mode 100644 Telegram/Resources/icons/player/player_speed.png create mode 100644 Telegram/Resources/icons/player/player_speed@2x.png create mode 100644 Telegram/Resources/icons/player/player_speed@3x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_0.5.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@2x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@3x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.0.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@2x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@3x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.2.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@2x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@3x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.5.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@2x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@3x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.7.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@2x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@3x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_2.0.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_2.0@2x.png create mode 100644 Telegram/Resources/icons/player/speed/audiospeed_menu_2.0@3x.png delete mode 100644 Telegram/Resources/icons/player/voice_speed/voice_speed0.5.png delete mode 100644 Telegram/Resources/icons/player/voice_speed/voice_speed0.5@2x.png delete mode 100644 Telegram/Resources/icons/player/voice_speed/voice_speed0.5@3x.png delete mode 100644 Telegram/Resources/icons/player/voice_speed/voice_speed1.5.png delete mode 100644 Telegram/Resources/icons/player/voice_speed/voice_speed1.5@2x.png delete mode 100644 Telegram/Resources/icons/player/voice_speed/voice_speed1.5@3x.png delete mode 100644 Telegram/Resources/icons/player/voice_speed/voice_speed2.png delete mode 100644 Telegram/Resources/icons/player/voice_speed/voice_speed2@2x.png delete mode 100644 Telegram/Resources/icons/player/voice_speed/voice_speed2@3x.png diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 04122b039..8165566f1 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -946,8 +946,6 @@ PRIVATE media/audio/media_audio_track.h media/audio/media_child_ffmpeg_loader.cpp media/audio/media_child_ffmpeg_loader.h - media/player/media_player_button.cpp - media/player/media_player_button.h media/player/media_player_float.cpp media/player/media_player_float.h media/player/media_player_instance.cpp diff --git a/Telegram/Resources/icons/player/panel_close.png b/Telegram/Resources/icons/player/panel_close.png index 2e333de4293b357bccf4e7eb51952f866bf8f627..9e7594b693281e40ed59461f465945374ba5191b 100644 GIT binary patch delta 144 zcmV;B0B`@C0*L~Ufq!#JL_t(I5$#ez3cxT3limAM|9=vhFz^sv=td7?v?onWtfI(% zf7!qo<8Bl}p(IMpOjVH(2{5P!ULkOI@M^)@3=xn)iq$+%aR$7ev6n?1vuchCtw(aA y4BqqrF{HDOt*ix^Za|25tb9k(=Ax R%dr3e002ovPDHLkV1nYIP?P`w diff --git a/Telegram/Resources/icons/player/panel_close@2x.png b/Telegram/Resources/icons/player/panel_close@2x.png index 1a70b887fac6777a6e073a692b4cf325e92f4e0e..eb6e710bcc5f2ace24bfada49753fd2ea7e5be43 100644 GIT binary patch delta 292 zcmV+<0o(qX1Dpepfqw=`L_t(o3GG%}4ul{OGkc9ancV*rV&XQtkr0B+V+Z{yAIhVh z)~bYMVPgVJfC(@GCcp%qO5pu%R&^gsRzclu+j7q9y2|Ji0Wc^af_}~g-BA&xkK@?) zUFiuhfI$H<-VmOv2xvT+!2ZybGD?`=N6i$)L_l3FrazDzEPuslUsdS}cPFnZ#LqYK z%`je1Q!%CV`>}B?9XQi)XJLvb(-t*w^BSyamf%AJy9rZ&H_yMa+70^6@TN$LOjo`; zStt`b1L48aEJLEC2#9p16jQ?fb!L(=fj!O~2eh(hPC1~#kmCpoPjEBk2#ZwV3C$X> qk7ZRMo(V7kCLO>8m;e*FOyC3J;fTj61Z4UE0000k1eAahPy$Nekp#wZ{H|k~Cf)$Rl?6J_qLBFSvW|J4ODPNoFn}uybcT|^ z?1mt~csjZP<$gm5f1hsX>Es5))Izg4Ss7F;nS@zlOC=Nw0e>y3KF5)CTK+$KyO+Y3 z#a<e_hfs`ZD|lETRiOkg~=jjS6~ zE{iR5&2k)Jr~<^orN;fQ)ez)nJLwK zWE;EEgeHX)#eK0l71v5-ebyYesXu=#C!_tu`g=?tn*z5jW+-LNIls-D^`><>k70RR z$?s=Mn^NBurfo^h`R-A$ZlT%oJe%*2_Ac76BI9G(+-2%UT3UXy=Wo`!n3ojkx4h`> zikBIUHEApRxL=EVFTHc~84ELu{;g+sF4p#Z{NL&MJ+#if@4}hbZTp`eNM9Z`S#I;x zde5(-OlPwVnU25R^q;Te?3w-hyj!gWjz6|fJ07w_XwQuK8}7GsGl+ZFeg3TBy4Ich z(~nIn)n@tWY_9zHTI{B%=G#h7cS(p80_T%cZ@`IoKg~C1b8dy9q(St&kItKCJPTn;IId>R< Nz|+;wWt~$(697|y%D?~s delta 474 zcmZ3(a*<_1WBqPV7srqc*0(bcPHZ;daoxO|UGIvMxQK)9mLpTO#dj@Wh*F&O^}$D# zgC{2SGS}!8cI^A}znDkzQ^f-YMgdH;!?4jl_1ms>vzKX}E}EB~s;%6AFW}Lt*Sk_} zf9=!na=Mgyb;6ukYyOI5?W-$#qrI?xtJ;|a3ARErp-F$1D*6`YEc<`+*0$P@j`^uK z?UpUdGjVN8c(0vS)RuPJ%k}Q3H4+<3wzqhS&N@4}YgT%Mp7GM-V(E9MeA=?{=(8h- zwp8AE$JEW#Y5lnHvBF}{rB~LANb-H+`q%rUcv6&_MHA5`+w#y zkw0j9c&fmaRjZa|N*%vwt1suCuTjRN$kD)nfev(X+Auy;sAu_dCo7i$2s~Z=T-G@y GGywopGUI6g diff --git a/Telegram/Resources/icons/player/player_backward.png b/Telegram/Resources/icons/player/player_backward.png index d2cac60d1b643a37da2fbc20fae2645b431f8df1..6dd0e15780b528dd59ad9701125cacbe2f061439 100644 GIT binary patch delta 207 zcmV;=05Jc$0>}c8fq$||L_t(I5$%#O3dA53M8htoGD42y1+3C~1aGZ{2Z)u8g6zr) zgYYp}Y!iq@7~agEBtKb}=iF}t@9RevLaghWb4G06cg9#xU=4+o@;py#EfST45PAY@ zD3nq$#?SAx5GBK57+UL;QfsN#$|*s3D2y?s6tq-9$#59PaY!6}#YiI$@q+rlpf5tn z>|N<(i9JV@ygZ#)t$HSW988%{jk5XM~t6 zhhcc{ODUtJUpr@l@KS^jT5D+Og2{3ihI4MNSZU-T9#H=m{5m2`cJIooWwP7FADhW; v*ZBR;^TYrXSU-f6QYkfun9T02ueE_ULl53sGacY{00000NkvXXu0mjf++RA_xnBPW-x>><_^TlBuSd4QMjQcgb_8( z$LI68ZCkY)T7N|t#Dt}WXfLMUgzLI$3|zG=O*_)D)mrq`)xhGbdPA4XrRzFvV}#L) zpaAlNMHsXn!XbZYgh6_t46^AV4B8LjkYfR1kX|T*9GnP)_Cq-2YJo6FFO-okU$56| zTq!Y=m$-42`HXmlP1AHzNMz=&xl*BiFP93$S2|dtC@-P|;d;H!ZHx#bYVw#9-~>1U gPJk2O1Qt%<5Aec1ys<`!%>V!Z07*qoM6N<$f_;zH3IG5A delta 405 zcmV;G0c!rO1dIfbfq!;ML_t(o3GJ34u7f}rgbNlykXST$xBvn)iYss>jzPi=@Sw3s z6bY#)eVa$pYZs67iEE6}|w(~p}4o%Z+ z+jeS&FsH(wZ#s_Cw(a}>s_Xhxk1(ggpKp4e*LB^VMtrX8dVjP)n4?PPj_><@-+$8V z17d_QM4~wjf?ym+l15BrJA{#W{c#wE(=;8^$bk?>KY^@_<9MFu(=?wz2qSyykJB_= zmgQTTJrKg^Cy#rth3_1aa|YjQZkmM z_&VWWU%QB(et!+z{!|^Ps;Y1Ml$-`(WZr0uys!vk6oQD6zcj)STcc@`B+7*mVT?i$ zaTG<$tpj0*tb0B*)XiPT}+MwCAI{uDdgH@W2s&r&uhP{_I}gtU08EE%Uh!V_%ylfk3VbnNGE8#pLJ{9vBw`zrX+Pv z6wAvsm=bOJ_oIuF;q0?2hTqmEdpFKH|NNUt=G%@%+{=Pi9!*j#oU~0#x-m*`deE#b z^`U_!6HBc2My*wGdKISBvT%u#V4m^JGiAF&Q&$LDb2i?3Tb9))wQ=!_Yd3Ss_TOKf zBcm*)%aeLgIliO$=);17D-R@0I61F;tSIp*;BnJ)&I-_*u0Oq7S#)la^l@UQgXZu%&b|t9}L(f z7=dzZ^_db~QL|sP_u3hXY_%zk&~-E4rxJ1{ZSzOhK=qE}+>at#DtC!4KN7ZDw572n z%WSq|Kvv(vHWN3lR;TsXjd_x-=CbWfPRr(5I?-%;68jCtvIf}%OzOdUs}Ic0-AYlb S_Pkil00f?{elF{r5}E+HRw=9i delta 618 zcmeyv`haypW4)KBi(^Oz>)Xh^T}*}&CEp!bw7sLb1+T<;OK%Mqc=L8`4SW1Sae*4< zcn5FS>}YOQ?St_E`h$a%+5?9Z@KsBF?HS zbJEUam{fUAy1)ABtK3YUuiMsaWPJQF;?=~1pMUnK9|-tp+I#nFZN1S<55q=$g(x+ZHZMYSBDpuPTQm<*P7EdSK7^A%;NIYa7wA+qy?8>-pSj( z;$8A539nDLc)gZhdRo-^^414)@?q<*XIGjhYaIv(yqfd$=xf%GdXG%6cZVkJzUz0WW#N}o^X3`N(42ny zZ{7XRdtR1k%`4^9PF~S+)UpR7cA-&Sf3s2k!we;9)j!&z3_#%N>gTe~DWM4fR@fs2 diff --git a/Telegram/Resources/icons/player/player_forward.png b/Telegram/Resources/icons/player/player_forward.png index 9a28263a77bcca07db5cbb6dd2569bab0184b9d6..adda5406f30229f8e70ca3f95accc7fdb9ad3d7b 100644 GIT binary patch delta 186 zcmV;r07d_)0C zMPmo@cpp-VF3Vq^n80=xzlvnIdW&O>IcKdk9Fl=F0{dB|6k|;HNoJIX)?>8RTD|wg zO9ti9{md=zV$RiQ*v>iX5i>_){Er&%u?f$gQo4MQ ol6lk-{SZniZj}sIfBfDF97dqnkbFt^aD<=KEYq>6Wm-JqzwvkCn;L3rc^bBTSv9;EFFNCNSh2fl6W(eFlLI_gI($F&#Lev~%)LK(d z5kh88h&oeB#+WKpnQ0-EK&+H%w9e+d@`yLD8EuW(3!dLOM=1-5>(?_wR?>%HjA3cd eV0Pp0I`9Bp3)q%A7crdx0000f`MJunv~62j0%4>Bk959XFJXv&>wmg-9A{evVYZ_V_RMZX zqix&s`Mj#NVw$GeGOHoSZ&zY;+jX7idCQ6jv*dr(-ilFA-}jfxWv;7YeBYlLV-2Yo zbv_=CFbsu^h6#eem=(PknRq^**Xxxqm7yhL%$7!s9*yI8yWJ4xj|`EO_xr6kB$zZ! zcRfKXHI>^fgnt0TFu1O(TI)px3n^rf*`1piL;6XJ`4E$3*{&gI@>E50(Mz2qi3XrY z;>Cx=5J)3NpM4ZXR7B5+r2)}`7?l_;jPs(0FpwAmNyTXESZ)g{X1To}S`f1p`(K-@ z^k}g%EoGqDBhd2jRaMpQ0ZqjqS`dRAPZ0(YgSHNFfG(#$r6>y38i+86A!axMPJk2O f1ULasz;FWJIf6*|e6IW$00000NkvXXu0mjf`EAJJ delta 390 zcmV;10eSwc1pWh%fq!U8L_t(o3GG&~u0=o)y-%y6)2iuxfkv(J3x3IG5MMyA*D56v zi70q)@-~?WcFnc-v|eO!JG!(ab{We{ri+_YB;?vlZ0+qSOjZW$?>JU(W3_1*s=3rU95VO)m=~%~`!ap0%l;_1iz|V1%o~_kCRQ(`DUZ z5Ugt)lRfKl{r~o3+k913b=jcFFuE&+@s#$IfvA)mK#W5s<^=+i>DkejLZ$BLbw7sLbH(rRV4y<{D#5$048NFvaL#_Kl4n=5U^OG7d7B>v#F(mQ^!Y+M?$yJ@qVA z#>BPxXU)8mDM_o{4jMFVNDBTb#p1Z}VA94DPm3hZZvnx&EZBf*F^Z7!@L>dOek$>tX7^sA@6S?`u_T%7O+)<%q3OzN=pU6+0!| z{Q0NOwO|*611zg==2YdY#V}-DZod82jh#7YgVo%6za3ldOK|O1+!3SqwCLs*`KO6kXtMXB;(R~spwi?s>&HrpNSH88v-IO zp6y#5ro1n#KIzT0z|&oK=SguEvpyCIon2!+4Jcu!BxpHpW3nVraJ9-K_RKP!@U?D# zZY)0kv7$%4Gc~h6@*^+`^30@9)}0dEE~}mRvSL@+Zr*JBkMCJN`g2-~t#dK`y>!-v zzV4}x`|pe2znx=t`~CN*8iozYf|HGVWE0qLFqSm{DGewMqZ<9oAMjTTsEVFnbo)93 O5O})!xvXL?jhaYaZnDNI(e-U55t4Mu4^O~z!ck{O2e_p!(K6^8x>y+b*H1_juj#|5C z<%e<;Dc4n>BPMQo&tfCT-_w$0BR9MHLqytH^ZQ2)_9Yq3Tyi-x)>vLb|E$j3D4o|I zM0CTe-jo*$uDzP%1?W-hV&_DHv z&5Oo+UmjKMy>!q)D{T2?$NM+9P5c&E%s>CM=w_Kp{o8NH!!+z_%x1s+TD9%h{{(~E z6X$&3{KLNJ=+h$2sa}3%FH=gEiofCS&)e>8{;X@s`NxX(pC8B7UcL6Zbn4PjnS`DD zIKygoxo))#Vz-!Q(Vv=nM$~7^i`(ZuMXZZk`$MGr_S|5cI}T_ zU;8n*Z$~9a^g-F~-o5jGl{WoY%+i1K^RJ_eHK*P3|MI)`>ptJ*m+$7eUwOE(;}O$j o78OQM2cZd=)Pu{yKbX(utBO9~deoPJn}LDB)78&qol`;+0Jn-fUjP6A diff --git a/Telegram/Resources/icons/player/player_mini_full.png b/Telegram/Resources/icons/player/player_mini_full.png index a56beec236b4f0e1220576f53b1a1d11407efdf1..a0c01b157cbd6e3f85ef4049b24187a46fcff1a9 100644 GIT binary patch delta 503 zcmVb< zmzT@s)9KW1x7BJjX7YGE(P&g868&O6nM~I0c89}ZAP^Xj$A76*3duB0uU4zsY-Y7u ze^g55QmJS(8bmssj?3j*uh)bHK$XpAlgVUmw_75S2#3Q) zqmc;Mi7-pGT7Ts>AtDBx&*xAmRIAlmtyZtsn@*=_wpc6}mYoPEIvfsn$#=gf(eL-s z5^-2=u~>+JEkr`!gX{Gw6bhlaTrTKM#B3oDN~Mwzyuj&nVgpzxShLwYpU;Vm^{CNk z!0b|~gaht&yId{@Yl)5lg+c+lZ#J7IlgZ(534<9QNREI002ovPDHLkV1gs)?|A?K delta 421 zcmV;W0b2g<1e^qrfq#ZcL_t(I5$#hwi^4z@)Dtx%MTizwA_yV@Ik;5*9_>Vkoe~AH zvPjy$L!e0ak!KqwZAfdxT0Ijam| zaE8Mnij77C7>8P~*Sp>Bht5P(y!p}XcCU>xnT(<+WLH&HLFn~*WO^%Wn#Ovu)Jmmt zKA#=ONu^S3{a4JkB_)l=V{Cv+(dMK}w?OEp1@-+qBpyk+C3~*@?F)PYiyua-4>?hH P00000NkvXXu0mjfaOB8z diff --git a/Telegram/Resources/icons/player/player_mini_full@2x.png b/Telegram/Resources/icons/player/player_mini_full@2x.png index 919fa5588c885d79c158cafe51e7360af9a54d60..fdb27f19654cc38dda6718407c56b61d9bdc18af 100644 GIT binary patch delta 960 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 TLJxcn00000NkvXXu0mjfo{I71 delta 1394 zcmV-&1&#XL4B`urfqzU%L_t(&1?^hdD}G%R{+SgSLnK0xjAh914hzU@NKTKm~+KWm+H_TFco z_s<{kCn_K+ASxg#ASxg#ASxg#ASxg#AS&?xu0UpH=IZL|^MCX6+1c6P;9yWtkbFJj z+gY;YSzB9kadF{w)Q7*avXUo`_+@k?CMM3z%n&99ySuv{9v(7% zf3T^%yc|p6VXX>6Lqn&hr`hhy%gdIQmRh^3OeifaWu<8JC>hwu$f&HW?EU?niqPBJ ztE9VXoZ{kQm=!1yJX86o2?+_X22ycgZB!oNub72}g@4Mk0+l)q2J7DE=O@nX@bFL{ zH)MW(zD`-OiNQoKpDL`>I5EJ@&CT*%jO3f0oSf3r)4jdD;f~kHw6U=%C@A2yYU~0| z%x`OJtF5gC&(P3NXJ_Zp(GlAVTIc8IqoSfn6RdcyuC6aHFT|q*2nYzcxVWH7rHV;J zz|If{ynnyHPfAK6tr*0{#$qPm?Cfkz&;d_OOi;1ZGKmP-?@}@0BH$}Sm;lDd$1!i5kXxsX$ZJYJUu-Lhk(@7RIC9WY-eX@(y9Z%QPjm)1nlTx%TLAE zxLBE+n_pjFV`g%4G7hB_;}Gg%N`bGh@A~>W9)AK-g?WpjfjK-pjA`B7-7H7)Xqjhu z-PHAOZ*N2G;hlwqwXm>&$(EP|EG{k*3?MQx5}OzsL}DQ5;NYOYzaJ}$j*iBrgjZHp zu+!b$9h(>%N@AdCWMl*@^YQV)ri3pqFR|0X!2z2X8&G0uqudk;TF_>?ZkMdub%8wIC zz1d+*OiWlO@xZf09WaiLj*`|N1aPuRL@NP0NrC5(nqc7FS?hN;oraJjS5#CeNlD_! z1^V7*Wo0!tH%CS8>+Ac@`e6&6dw)s+&r~P`4%pbN_V@RH;geEzbu}*;>{pT)oWq@; zpW|MDKR!NUVq%nZSDyo?pOhNblpht2-`EQULEzEiEphSzRcn>`oGB$KGZLJ!Q783M z7s!g*CCdc)!6x1ZXsPfr18cliaL%K@FDx?Rq^8EkMyc4;f8G)-^_rcXrEB=Gg@^Mw zt;6Y+pzF^eKwL^n3b_@JkB?z5VrFKhSJ4UwlYYPg@9+wLzye_-A|l`uOm1$jK0bme zOheE_1w;iz1w;iz1w;iz1w;iz1w;iz1=Oy#QXdU2Y8+z z4u{9%ak*UP^ZB1=`glfXGMU+ICW>OK)hd-rmSsIt-tf*SkBuTkku3oRBOC&{*N~KPx6OBYMxf;5RMx#QZ0M7HgTCElY zL8L=~F5B(4+wIa|6qAWC%XmEQbUG2o1em4WZcnGv#bU8qtr(U}gc}_W2Zm-+v{+qhsDhP_@7 z)-nZy!JyyoyROUNNXbO=`P?+k{eBNrQ54u&EEbu9N~QAaX5N)xA>r$0v%yY+`1(F~ zidaG>qA9#DUDvUVu%p>*R;yLt_i4dvG5u(<=&u#O)fj*1z!fWLh>e7k@}B?z002ov JPDHLkV1kO@$`Swo delta 292 zcmV+<0o(qT1e^nqfqw=`L_t(I5o2H&1%o97%FD|?eE2YL-aLvNR9#*D9|p)bsG_0* zW(bHTXb=lr1v@*ty1F`q>*wd!+}sS8f-sbnlz?ikU%!qfj?TSw=@PON(AYrL2M-?n z`}c2hax%J3G(MV6G%irFj*iZ=XV1QT`NGf7kER!ei>4Ee3x81x34V8XcNCpq4ilyj z9+6+aegS2fnVIpZVL)>N8W*TjR#x`Gg9kr;{16rv#%Iu#D_77oBXfZ|XV0Du6e%bu zz-kI3T$F=@LsL@|!UaZuLqh{x3dmq&WE2+{mzI`3ckUdrIAL~GRTY|x2 qZWb;z#EMfV(;X6P+o(DsLjV9^>isB8Yw+U$0000htgLJVAp}wc@<7NRuu`zMwMq~riHe1Vg3o*h21LdYcH=Ie#cr|8T<<;i?3ufB zXFWTUE=d7N0Z9Q#0TC3C$z&p+@`p4UjnB`|qtR$Ooi-YcKz|^>A49kZuh%;q4u5y9 z)oK+C28GMO2g&2{5H^d&qEss7a=D+MA8_k*I(%RR@^!o2B>i%^yuH08sIgd#h-EUF z1j@q=#^rK-eSIM}7AP8xZiB9_t_UFvwnoth4u_-H>k&5bczidXP=wBRLHEaIv-$G! zlGrsG&C}D9)qiT;Y&NM>>h<+?-(N&aI2```{3NTednau66Ynde)oS&6{l4d4EMT)s zVmqGAX31odiAWLB>2xT3>`#S4K`xgwLzqVPl2s}dctfFlK98aykN>wZt4F*Fdlc5}VOf41*kt7m{a1WytLLjQGUVpC>s8A@x5sJ}+wj0S-8;)3% zTfg7OE(K9x&t|jKuZN}#LWf-cU`Gwz-`^wf=H`ZDC5cN2RNCz}?h1v%X0vg5B+&_> zy$~Mf=j<1VVktTy914&UrOmM-#U%t)(&;n^wOXzDd`^kMoH7V~e}5BKj;qeZh4JFz z;_>m(=YR8IT&-3Qxlwk;x}uqPyIs58UM`p6y_K5R#)v>PzPr0S4Bp@0-`?J+#Qdhm zw+`g1)oLi6hldBXTFoy#)BE`5s#Gd*=w^cd-H77{dIGtwudlI`cQwjK^afZJW)e-|rU?{3xhX`Lp4uhme9L1tbL|1x{3ff2wWlVC+A@GXMYp M07*qoM6N<$f_LL%AOHXW delta 547 zcmV+;0^I%22AKtrfqw%@L_t(o3GG+Au0cT*^=x#aREkjORYIXw>m&*t5zinRDy0Zt zzz_Hc(FwJJ!UqtMh{wH??3U>-UT>$DzYjgf<1w91%M$bY_WQknQd|Pe!C-)G=kqxhi}ARm@`z<300OdPlgR{! zFPBRxVqOyhnSTgqO!$ldBp#2`rPpE;I&cWh2?=MD`9~9(vyCabZP;NFGBR4biK|#4(&gb(1>ufe-(n}@r z3pEiSK|Y_qTrPmH-EJL@H)j6+#+XPXa5DG%J(WtK(0``^L-=SkdOA$p;B-2n;dZ-` z|G4RND(@RS3Hk1nM^X791e%``TU_r|;@`R`g7m+2m43-i l-K-tZ4jgC)v;*cG_y!1LQq?{*6i5I7002ovPDHLkV1nn50tx^C diff --git a/Telegram/Resources/icons/player/player_mini_half@3x.png b/Telegram/Resources/icons/player/player_mini_half@3x.png index 308a16a04e507f9a2bb6e9359c83cc98cda9143c..4ad6f3b5e5c74cee8a5416559c94369fa066b8c5 100644 GIT binary patch delta 1062 zcmV+>1ljwy2bT$ufPVx5Nkl5h#^=gC|D@! zUtlFRHi0yXN28Usg@~dch$z}fl0pPQ3oR_PQLyknejf}B>n3@d_se^66V^iJ?VFvQ z@0;CyGrP&iFn@*t!+>GHFkl!k3>XFs1BL;^fMLJ}1I5L~S$|nsHacjoT2)oGwzl^0 z@bL5V^YQUU0q!*FE8)z?lQKoudmkDR)rPaUXP57z;DK|zP?^iP(V&1jNHDsxTu@wR{jhP z4T-2WHa2o{a(~1QcXxM$?cm@*Y}Z;I7#R5c{N$KyZEfY|=1Lw1gF#Y&AidJ`vA@3` z8#<%f+1ZJ@^`#gvuh;wj{?4fO_V##PNpVOeV7`AO04~h6|vIN($3D#^73-)?oPf1s#r+GcI1I@PC0N?VCZ;#eGO|*Pfs&5 zGuheMN;^sg#Z<%$TwPsdD_BdHmzUTlxCO%F<0E#9`T2S5ieh{Ga!X4~O-&8-fpB(q zwymwr=YR7dcZuJEZOy5vDGm$1OTcN{#P1HFP>2j7bo{2Qtc)VYW6jOY@mp5}fT6)& zUtbeP1s9`EMYIDOVlIB)-7RoVPfrQh+1Z&R%*6sm#>HeZ!JJD`)$-0Rtt&@BMjBaJ zS=rv+rgm(Sjg5_wI&rorfW>LWLA9l&CAQYp)qlmZT|qlwNL;Ye2u5vftzA5E3vxviDX@k#UpzAnhr>-x zO*9H7VS9T!sv&xG>wgjoO}I`G!;(fyRa8{u78uEH5{?EiVsmqIeSN(&^nX7prXt(L zoU}O1;S}NM=m;!4KRNnlGf_8>x z$E~F2r3BHGp4Ui(&En#3a&nT>ixj)~BW%j6T9nC@e>lDzTsLTax$gJ-UH8Df0W5wF z5p~0K&lBe@;|DA_`bScWi)mCqIO6Z_?sk5dKeWg>*B|;|hBgcs1`Gp+0mFb{z#lMR g7%&VN22zuOe>t}O$t?{jlK=n!07*qoM6N<$g4L@52mk;8 delta 836 zcmV-K1H1f}3AYE3fPVuaNklOdEUYY&M$#k( zF}@{Y2x8&?5CVc#8cWeuQc0R5Ac%+{7J*p!K+xO+-aDMks+mnjvg;kI@64V(=lj0h zot<5GYfJou1Hu8}fN(%KARG`52nU1%!U5sH|Lwrp*;&0_AAb&q-EOx~DA;VaP4FX~ zPJev2#Num&>*;+=UvRsjHk+l&jz%M=(@7H60tSNt)s4nad>-d;##A$oAw~4)=zr+x=?T{dsW5L*Y1~5Gi7%E? zG?`5Oejj(ay}gyDv5)Y-fw1?+nXOjq{{9}1xLhtA%Ed|%2D~309x!{0#eze*SV6*? z%_e4VHk*HP-&c^Z$z+0sX|>v)EVUFQ%wRBJVVzEAI-TMXSy(~B;AV}f!*qf}xmYQ} z_V)H*F@KHOKR!O6~35axx2etDwS{xcn&%|JfzaNg}4)6j49gf_C}*Y)vr`4 zIEOQa_tI29ULhv>`ua+hg}$H`=Wxc=YL#lqDfrY2%-d zV7f0aFQg!>eWTGR-ui94_<^64)9dx8r>84cH-9jj`FuW-&j|360?s;EC0ec4TCH|< zb)}#;`|Ph1$&r!j-`Uxb4*veg_4PF&%>sU(F*}2BILsnxp2J>N5t(q^Gip-=U0Ebz zu^5XsSv8fC3~xWb)TR`!a(S%yJ5!a{7}me+4`>hu3tXJ3KAcLW7M_y|x&?pR)Xn@H zVm)rh`~wzvBfn7}uzdSaiyegn!U5rca6mX991so&2ZRH{0pY+u2mS!M0kJ^HWN=jg O0000K)4d4b;{&Y0NYF{!su!<&bvdI?O_~w0Y9^c+* zcN{0nGT--`&F1r*J|Bf^wc2*OZMWO9EOQ*ED9R%x;lE1541dFHHk($fH5?9)$Kzx& z;d#DPNy#5Z(=Y(``EKvmT+43i{52+D4^OEtL>@=Vi|21-E`Mbqij z^E^cHVH~L}FMo|vzXN$j=pt#*6C*(oP`;*V&;Xz`npAFtgwgEfa)|;@r_*AwI2;Z) zriNiaV45a)EQGG>*fOH|C`#|gPX=e(He~bpyf|+#H^-vY1!Ez1yImZ|*hx?@B3>oZ zD^=cXye~p^tr!1`j~0vm;_bKm?-x4o4U1ctzdm}dKL7v#07*qo IM6N<$f})+k2LJ#7 delta 186 zcmV;r07d_l1hN8jeb z0%iz^CTI`~Tm?HjySlnMgzM+$*WBC;mm-aE>Cz=+C!nzjn#BlLf#3a%j0lx*EyxTe zWDX_l!EDggt5+%U8X^ceI5;#lH6dmJqrah{0oh!FfsL#fg)?1MRfU`aP~=GE)YR0# o%_3DVx_atlT69xK`4ol#0EKB}m0~G1f&c&j07*qoM6N<$f|909)Bpeg diff --git a/Telegram/Resources/icons/player/player_mini_off@2x.png b/Telegram/Resources/icons/player/player_mini_off@2x.png index c3150639bd2378fac60b1371e845aa7de3eb88d3..fa16cb764cc2bb615e3ea3fba2b4f18f63373278 100644 GIT binary patch delta 709 zcmV;$0y_P|1Gxr}fPVs`Nklji^B@qZlBWq7^b)oS&J8Rzpk z91csjf*2-`$3tq4$78u%E))uj#RA$sKR?CLNEGXKyJ`8;=@g5_h&7Q&P_fKrvqbAW zM&ook=kqz%#sl{DlQ8bf=&0O!3K8P{WGg@ZoUCWHJH? zDivQ4B9YkXbhKJ6n*tL~ObJp6Z&{^M0R<{lEEdr;M2Ff8hr``&$FkqS8jS|CA0Hpp zYBilsbCEFNgh>IM|0Z~Uf2Wc}qtTl|ya|4VaGtbUEq|gal}eNWKpspzdf@P>d8-RJ z1haHH-C!^v1wXHYFr1hYU=ef)QVT}1&Rbaqg8{E^=)ijm0{|wRY%YssKc%LIsjlkZOhQP?RMMca-lZAt^)ujoFbYU z#|1qLuYdB`<4=soV`#!_5SsA#(D3C0zOKA&GMm)OeZd_{eC|X2uMi& rEviTFe&1R|NmeSLR6wb~e_DaRzz$||BS$!600000NkvXXu0mjfpe3;}6cG|BeWrb$keB!P{2(BPfe#u$184vZ{I-EG499Vtrm63H+qQu}wyx_3 z^$f!R2~?IP1@mfx0p)qVry)HsKxvwCX<&fjI6k5Q0E(hWK!5WQpgVWgecyK+$23hk z>bh>zG<46G+HKp4H3*{Wh;I(oa`QY}mUXT)BlScP4v@-HPzSo5_z0~j2qe>shR~4A zfGo~gL(8(rvNXmyKwZ~q98gx8vs06lAPC6e%H(>UNB+y0PUcm8r)CODUXvsdoUAHm zj$~j#ILk5tlSCj2fPVxcNkll~+f_Grq1alG!pir@`|BN@&imZwnVHA?#yq!qR%gzfIdgu$ z`M5J@ZdR84ECZGS%YbFTGGH073|Iy%1C{~HfDZlz;sJpw{@R-%%_4V}$NI=CuKrJjRRJS+NVrXdS{r#Qe;qv6yR69F6MMXspJXHKPV1KP_>ONg4 zD=Qlu9BgiGuBxhX9FA&hYYPerM3cR}J)A8b9v;#?2!Bm>cD7g559m8PJ1;ISXiU6> z!^6Xpk`j4*k`b$@sAy?vk&L$R3Fn$b`vhqq+}_?|x0sok!LG>lzU0={ z*2>CCG=Hh9t6N=NZEtUXe0+3xz=nh>%zWr!j3!GA*9 zC=x1|!I;tW{R+mB8jhaXR$wn~R% zV`GE?$If4WK7Rg$!58{(_^5~~RS$agI&tWE`n1wlr2`g#rnMJR(k z6@QT+!Hq$n!dVBOkfB5sNBebIXRZ74u5>s)K2E!Z>vj(VUp=}TXY3F34<4zerlvUA zDAGv&ha*+S9)fZ3ItH8wUHx0ZAQl0U9bOibuFG1Nx#cL>)F(@+?$VId2R)c@(}DL}4_ zS65d^@pp7|xLO8PNoTI00(8ms^S delta 530 zcmV+t0`2{{35NxcfPVq;Nklv95wJ6o&QYP7XRTxXNgZui@^Xi<_Dd1yPBH z2l6R=0XH{a!8kYyPTt$3H%1d$dyG)Z{h6>mJ^jD`07-32C0uX-4!{9800-az9DoCG z01m)`|Ls7(-{0@|Q4}4I$IWKbYPE{sM;L}b&)4;O?Q}Y3vwy8tt7oXcUx&lNV6Y$v z5~*0@?RGO2Y_V8~sCc`PV6)jwPQ`l719M&XC6#$#lgUJd$}lj;aoAU(Xkg>+-}-|`QXWm(;Bx6x>n%jLw#YPC8VjYPePL-aQ`o6Xbdr1;v9!ZfpOw_B22 z_23M^k{>WW@qguVsZ=Uyh{)j4m4UGeq(Q}UW&rk;l63890j9kKL;)Ey~8egl`27`g9SJa-tvPCpCpTfq(HyL_t(I5$#hk3WGoplq9vj!QM)+^a1&SgYfy+(IdnDO_vd+zqDUnHKq1m1?W@rT z6xVg_y6!Yh$U_Hc+ZH1A*o)S6r6%CAEO8b^fwO5EMVZG!-~F5qIhMdFef15z05l6x V%NZJY3IG5A00>D%PDHLkV1h5Yci8{{ delta 193 zcmV;y06zbR1G)l`fq$e)L_t(I5$#j44a6W2iz2Eo=op4Ikl5hoVH&bP)}chA%)fOf zC5S{JAt`ZzY;$&Th+*hx+rWp=mfcc9h?xMgxed%Y_alH5@rh8F$I@EMEqp@eb8P0$ zF;_~(81o`XnCtY_qH5rzXk5b&NiV7|@Y0T?lpzE>8TWxe!aA(i@1I#~ol;^S1hU?O v3H$`_eKBf`SqLD-)ouAD+>Z6Y%NzIuDC>8~Z)oV)00000NkvXXu0mjfsc~FP diff --git a/Telegram/Resources/icons/player/player_order@2x.png b/Telegram/Resources/icons/player/player_order@2x.png index 2ae4fc7341dac42bd5919476eb1cf586c3f5d007..76e30a792e14f376c288c488900b7be7b30d3513 100644 GIT binary patch delta 462 zcmV;<0WtoM1jPi9fq$<_L_t(o3GJ6Lj)FiGhGns155O%fC{1kaEc6I8+zGECi5&%@ zrr{2oP(UfP?!UZ*jKDB6n_;uNc~h9jn@`{8KPJd#!;2H(1ULas;6Ej>?bmPlMu)@U zqhBaAo!Xa18-1rB2!9Ahp&VfV3^rZY(Euux zIjtfz*kF7VMI?lRj&Iq?zL02xS{yLinhjj!X92V3Znqo7Fd85_0iJ&Ph@S$powwO8 znwQJP^SrigPp4C!=Ti(#YykiUcnW;4vz5K=dc9)ncDt2jDP!QY-|t~Vunb$PZ+Zl# zJb6oxY^|@Q`hQ#&;)GNQsP_3c^pgqszONehwZDv6JF+kgtEx)V6n7Gt7PbHY11w{# z3AwI|8OP)Ce!tH;p@}U3zzCK(>Gqdz1&-syaZG=hvMj@Rk;f&Pv-+kgyYidqtqgiHyT>T(ZB zLZ$>v^(*h8Jb%xR9;lRu%rw=xIyGfG@KW0}4VCRN1jct?)|?@!J5$~$-}k$&qe_ZV zg5apvny1#9<}eJ0VW47#L87E-v@V^0X^-Q0nkG6EwjiyK)Hhgt)?`_>EQ^{609(EJ z9o4cd@nwPqaL0LP&iLBa8Kr0>0ZBj-kOcls0)M1@&=G8_f=I*w0000)S}}J|;&2)s*}OW}O*l**cFM(A~k<#$3RBBuhl%UBkhN z6AGAEni%-Jn{L%EoaA@;e$&jvv`JE-cmJ;XwKx2(u-()yn@0^63Va>RsFZ5yf}1)2 z?B=;G4h-VtyR|m#b&cJBTR9d9D~C5L=hq)U+?LLEB~ZuHmmZ4KoBp@X-;jw%lZ|0R_*TPj&z<6g(^kLwT9qO4wvFNNqm0K@457bn zJIR{WKj!$Ea51;XDzL_?fgyHw0E0|I@^#LJ%aN#sxOxsG4B_Oia@g7ylhi3S#TL#G+!a7Mj1 zY!*EI)F}4SoUApAPiTgi^l)fLxhK^uNj7Zn+NLLqoipS0uO+p6LYG*%;>?Ey&r4r z!tW_x*lPLu#a<@4mt|+yq|IrmnH{?N>d~Z!SJJK>+tER>p4hZiw%^@qk=BBT%l#L;>UpbP0l+XkKF!V>*$Ib=uDzRkOSXC?=d@R^!q>;`c6E)LRJf z+PT@tNs;;UJe!Iky1&!!ce`yknM^ikdZ z<;@Q}QhuCj((qV*dG*yUzo$n%9-W$IIn#%at+{_aJ7eEAo}?cqQw}ZvWVB;bZgZlB zG*HCoN8Nt^(hm|0tNkKGRS#ZV6~h*@HthU!F67af=y4{^SnrTNvw@dSRWaLSEyFW^W6zZSNaeYIYfp^N7w<)Gix1wO zof7b4(wxtGbbiVS{QfuV-n7%HRVMx3OD9=Ia7lidpJ4Gzru{}qRy)*S= zv6>;At)x_%e1u2c=`MD5J+j0h0kdmw%hq3ieYjud&KhuNj3z2n(}JNzxVJy8U+Axi;lVlbjAeS{0(ze)!;QUdFye z&57^3&98o}xbwDbYn1Oi+n8fMYLm~V9lpBY?p5@};2`@$n%$1k!h5#S=j4=j1|Z<@ MboFyt=akR{01=}r$p8QV diff --git a/Telegram/Resources/icons/player/player_pause.png b/Telegram/Resources/icons/player/player_pause.png index f7001be9d664a31e1ddd3251f56851bb7049808e..b40213cbba6983cd1fd500e1ff0e0d6073041a09 100644 GIT binary patch delta 108 zcmV-y0F(da0p&L2Ix8 O0000^%%V~W40i(`m|U~+;4>tQ99ZFzTp$@4Vur0_o!YG0A)62_It%-hIqWTYhW zK&V|Kt?Bi`35Hn$4;f^5l{X#AxVgTe~DWM4f=no^y diff --git a/Telegram/Resources/icons/player/player_pause@2x.png b/Telegram/Resources/icons/player/player_pause@2x.png index 61e268caffe1e810e2239a80632b962f8c6e8d87..a8e819654ad86499799e7c9f514afff09bddd27e 100644 GIT binary patch delta 189 zcmV;u07Cz=0=5E>fq$S$L_t(o3GJ6b4uBvG1jXO+|0lpdl!OEuz-);Zjl-#I*R>gY zaoac$fB*y_0D<2Sh%u&=4s*)2h!%jyWBrfnZkjq+5pAf)WBp?tM(Iu|6HHqnTp=FM zG^B}pt6owtkopi1f{-Gh`s@&d6am#|hajW~s6IOcAw@v-7dCb%=RBr$Vt1|nsW?V0 rE1q8*k7xPCJOBX*KmY;|_!NN?e=Cbh5GHt@00000NkvXXu0mjfk}pd@ delta 185 zcmV;q07n0|0-fq$GyL_t(o3GJ6b4uBvG1jXO+|0lpdl!QwoZI<3N4ky@Mnlkp{ zaj+l&0SG_<0zV*7Yi+GvW{u+zqo-%{QJqkKbTb5rNgcJegGeZzk1eDJVK}Zo${?-ij-ZIxZt~g_^<%()V-*d`yZwuI%D-<`x(1cqnnJb>@P%JiKj7UKO`K4L()< z?v9zAKm!Ad0s|w50|OI`xki0LvEI@*zw5%~HBU`r`65!hykvf>sATNk7fTfwYyaNS zyqlhQwB+i3AEsZwb_VY{@2VR6rgGa8-op`I@3)_sTQ3!Ng+1@@^!TXH8}c`I8uqX% z9`HBp;P@^fQM{N-=tzWs;5$QuXKtb@9UB#t?j$Fi>DBTONOpADas0px>Cg!Z$C^3{ z`Wp?+S1CC5unInuV@_6I5tXfOeSVXqL3i!^#0C7bU;Fo7jXJx}{UXndqmMgu+8XWl tq}YC6{`$^JReqfXn&@6~c(9+-hGCjL53?HMiMI?u;OXk;vd$@?2>{fwd#wNf delta 302 zcmZ3@yo`B5W4(Z)V-*T!#&KSSHK;`L;*7fAjo{Tuux6c%quPv#fVcS&{8I z@8#OlhnN{T92l4c8W>m<7@*7p$2q11ZOdJ~)$VSx>+e%cr#?j1PKgXU7FKTlic2g& z>g=n72t5>0+p=6qcY!HM^rqeJD0*a91G^_@}oyN(@Nvu!t7zC7RYiq+ahzV1O zpa?%dKS4E61$bNp40S#}K8g&YPGD0Z`pIz!+~*%ZeuPIhMJHJVm}%FpT}y>b3wPQm cgPI`#0Da={w3RkNqyPW_07*qoM6N<$f`tD0;&R#fq#@qL_t(I5$%*g4!{r)MWrHEmX79I% f?lFaPF{T0=Zu|Nj=Y+al00000NkvXXu0mjfin33* diff --git a/Telegram/Resources/icons/player/player_play@2x.png b/Telegram/Resources/icons/player/player_play@2x.png index 7c283f3312026b4aca9aa462b79839daf9a00038..a4e130c4aeafa51140fad9643e1ce3d3d687458e 100644 GIT binary patch delta 358 zcmV-s0h#`_1KtCWfqzIzL_t(o3GJ3m3WG2Zh5NHs+;|Vsl}B*nO3&cQ+~|oEynqNU z-KcG-5P~r>Y4amxT$JhbCGYifT64SMg#?fQ5yJ?*7&=(&w_iW0wS$ogWC9E@kU21rKpLN*)SfRyhkQfFF+Nb&b-P)%1BNCeB$j2_ zGU=O`JN1JUVHl=qIt)WumgMmSS%MlQfCP{L68JX)Z^e4hEQ9CUV*mgE07*qoM6N<$ Ef&o>LCFi-gGhAZuBD!H@%_!zB5WARLKqbUv0+kb!1H||Zit%9) zy~qM$kSqj}5jKNBAOo2s#URiy3~7zBa>{%nBdcC=OlYCsLB0d507lRF`p58OGX P00000NkvXXu0mjf@}ZE3 diff --git a/Telegram/Resources/icons/player/player_play@3x.png b/Telegram/Resources/icons/player/player_play@3x.png index aa280b9a2c84c3e0940a1878938391b29bc9b5df..0a101f3f65980bdf7a3ea4849d79df537731fb20 100644 GIT binary patch delta 528 zcmV+r0`L9d1cn8Wfq(ExL_t(&1?`wUj)FiO#dX&NJ1Z|DR3x52O6@(0H}DL^P7grC zCGZZ$Xkwv_0YY}knoP_9<1jNT|1pok%s21%o_tNOhXW440XP5$-~b$e18@KizyUZw z+JSE)>Kw;$U3W5>-0%0>?Pg@n?iUGy;CMX#{2fJ6Y&M(mcz@izEKLQT=jD0+pklx0 z^Laj>Yp&e!^eBoL4_DZ3w-!ftxm-A&=c>igJ!3SLt&FY-hHJMkIu1ZwwJAC=NwwFS z=&I6XS}cf82BUTi_2_Cv%Qw=EPM)D@WEtIJvFP|cqk8%#xoz9YMb{QUFrHR)0-qmkMs%9kkx|FllOuV_7Kup~*Y*Q=Ukq`}tfwHlRySvvOy@!Su*-GAl-dbit= z*t8S>om%yh2#Q^ut)vSEQwho-7_Fd8fsqSJAB<>Fntxz)gHi^g9+VoG1wpk1vnHrk zU{v;Jm}r?o`4uR5?AjL;V~*pv3Czl%7}#_=P1BTPvp6UQRu*Qn+2L?_uw_{mh9QO5 zbHyEnXRxw77z}*h9}b7*$NcGZ;(Aeq18@KizyUY_2jBo4fCF#<4#0t`1HY_)Tn@ea!{}ZJT%Vvg)QcG-VesPq0vyX>8i8knw=Q#${u+ z?j?;!i3gew@kn)@Fx+N*|G(g*h|0ZBCa|b5dO8RpsK#`a56#Cn9n4TZj zu31~YE@-)#Z2f~x|1*-eTRdr4_d4dfslzX`8J|yTPD?#nnDe3Q%0Zq9>t;6Xxm33N zdu@K1X41zp?ZZ43&(13QUbf!;(ZFfjGrP~sztRFfT)X3ScftIY6{iob=-4IDGi}A{ z11CBUH4BQivh4n;&Ka^kbI#u1f#R$ymLHJlu;M=Ec16>`ZxLV9$7JDBmY$^=4AO0h zmH!iTxDI@>ncw(Pj5Xm^d39*0@a$jA+;eST>1$lvvCwSNvb*+Q)5W&BChqC;nSvhf djGhU)jrOzW$uVR)AJSt00#8>zmvv4FO#tmjOoY_ybl(3o8-}8VQAonwvY4WqopI&RVLOd9%aYeG7u{ex9Ac$1}rS zeX&@ms=8jU@6;dizn~;Z#^Z6VR$DHYBugY5v|g|G`+Z&4AAd_wOw)86CyJucXv7;n zc>=5`3OY9oW4qmwQb8q2x?C={ZC6%H(RJO!;m~L_N{K^w&1$vUY&M#vaq>5$9ij6$ zj!&l(@fCD3naHx-?RL{NB?gIbQ50{t8xa`|f}q#yA*J1JGqC_P2Q(lddQW0-DABz%3zFy4C%Dk1X`{+w3gMLQt#K%Cd~lqFb9zr^DfJ zKA$6t_c4sm4HxZ?$ug(l`+lD1_}ohAW#oAt{unPWe;F^VK7lX4T8h}YL`8T20000< KMNUMnLSTZN1i^Ix delta 277 zcmV+w0qXvi1dIcafPVn?NklPQds5qe(oD0!Dw5Bt=oUuDg%E2eNHDj^nDTgwp0a zJkQJXyz9EBxZ1W2f?!|Q>VYB>=HNMKswE7=mA$dDEQ8cE&3}1o(~X<6ikYVA(Xf>~ zHZn*k#L-A~UBl9x%XS!s#r}f9^Rupkgf5Kj8w81PnJ6N@dgqv@gD8ZukuM@Pf}$wG z-}k*SIy(_7N}DQ|zv%W;5Q>GupCo~Z(Hg>~97KGQs)qF$p%kW2mL)7T^X^V~{=3Lu bJ@*0#W$EZjWDePI00000NkvXXu0mjfPIHJX diff --git a/Telegram/Resources/icons/player/player_repeat@2x.png b/Telegram/Resources/icons/player/player_repeat@2x.png index ae686e152170b3464227c70cbc7bec02971d22f8..10a955139f8485a918a37c20a7cd6fe5dddc969c 100644 GIT binary patch delta 772 zcmV+f1N;2m1o#G!fPVtwNklXXe{) zXK#0A_v%V|qzFh6kRtGFBalcWhQnbj7Q2)YmdoY0_a~W5UVj9qo12?{zfU-&)9H)g zq|@oT-7evDe}8`woU~f)%gYPll+Wj>oc>ZRh=E?Ozq`A$*=!iJKo`dBa5yZNOSM{^ zN~K<3Uo)8uqY^1ZqtV4;K}Pw-H=@N)f*v8e-Cisf<#PFIwQ4jPy0h5~?widf6bcD*;Tb zw;S6UPk&Sub*2~u3L(rC*i5HW#^Kxog%Ddj_5mUQ0000!fwePh|BRKD4MxO2 zFdiEtQn#x2bde%N+Yn=`$B+!jB=+-*SY#F*?_txBzEmJA_P)wl(I6Hd>HwJgi8mL(2nBjn-5}nQg{N)$|9>9 z@6b4o%8eF8ynpTo$@Bc@Z$Q|OazM+&Z46OX_XC1CUf;-5FtEQI8%e#|4H{(JT7Rh(nM2?3a}edm=M}wR7VYJBK~d-Rax7jTEA1F%%KrR=b#ZG zP^>+$LEoay(a(^~*UD&t(N$?UzJQKz?Zf^b%`aMDK4A%sfZlwwAkwbA{bpV@+qNx= z0_0wo2s8X6Llz@%a8jGGv8BaKYFjrXJ?6D1`Lb1JK8&_*NP3*oL2^V;K2~uh5O=CB e0xkjvj=(R-eGboMZp!BX0000Z2l{BA_CmBA_CmBA_CmBA_B5cLW+58h>tXZl0c=y1TpO_LS4R z?d|Qazn_nfkAZ;!PHBnRXJ%#yFnoW0eg=aU4vQ@u4)Z9Gn75>)WMgB4#kRDxR9sxl>oT{1)<8u?MO|H; z$K%mH5~hrgkAL^{^ic6gBr-HKgiVD~>>YGE@&L$p^{SD&As z+k`<^Z91Li0#?e!O_;IvVzF3LQRgBWpeaF9i{wY5ce4l#xQ zwjD8H3xB2jem~W=va-_O-(R?M1~F{YjCFK$yuG~v%-q}@MOe^*O~8Pmrl!X0_3DCY zY;4q}8xUn#ig5Ay`T73-Uh8XfbMx}@vX*X4kqDTsqd;|bc2-$gsr%G`C^aywK%lCs zsxknO>ygyJumZ(U0j)T&gM))y(XxszumY)RL4RPYtE=<#^Hht30})_A6$k_*1jD+- z4Gb#~sBrvYwfyFBeSJONu+}0pa~R;BF^yt}wt&(ONLL%M$&#-CC&hwY8Nf1u9g1P+UdE!r09JKdr5;ZEI_5 zZ*Qj}o12@rx3~1CEra#-bvjpt8C+jq7k?sKipoG?@DMAgd!YJZ%M^W6%9gldtfHH}cxr8r!b0x3{;ju)t-~nEB=9<>BEWo6Q=tS^pGgDAZ2b=|W}I zWOCDbFNHOt=FMWm-iW%mur|2_zy06P$$)+axm*B!qT&}E00000NkvXXu0mjfl$;$0 delta 896 zcmV-`1AqL+3G)Y#fPVvBNklvFE)mvr|2@YP#pn7^(%UyY-xV&*`4qz4tynsgF`X zDWDWk3Md7X0!jg;z~d;8OeX8~dLR&Z97>Eyv)MeK&#$kq;eT-0J~zL82r2}>|DQAY ze10;S#9}dA0Hq1tBpuByhsc*;_*1v4XYan~J_pAJ8TS zt_&H^E0VQh7CB<;_1eyr>dzG##-EHQ$zriEPP0EUpMTE_g~I3Or!~uQ8A%t~Y0A{n9bs-35a*+dF0?-RYDwV3$YE*YZ-v!pvw~>j@Cx&3j z48)^b`UIn`fq2R20(ewv%ay;U0uS3Cbn6B|~f-sR-o8 zuyar@A%xbyV5}_!F82SJ5gKKYmzNh-Kw#w(-IEIKL#h=C49i{D6cNp@`wNy7baMn%VE z-gz+)s8*}T<5AR@oAYIe!N0*^P%IWVn~j^k3fYn*1{*BN?#4|=h|p!SJTV}UltnI{ z5P#bu247GXL2(4Dhc+vh5IcBVI2;2gl%QO4TQ`(-rGQdEDWDWk3Md7X0!jf=1-=2} Wxf;}^8&^^Q0000Gt1L|*RVqo5V4;O~Kdvsxn80a!H$|BFXXeXfGg~VCc{5G(bUJ-! z4GQ$<&gPNAn9!dC@lodUd9&FZ4u@P}AmNc$sZ=yglVzEuzJIQUHiV1CVmuyKt5wwa zzJEgqIgnDVR@?1%Ns@ftZ8RF8fxZ8DJVsG87!2C&Hks(1QTY>XU@3|c$1xYV^KmsE zrk%HR0Ke1etX8XB3aKO^ok$Rb%jH6fNT{l+D2ha+Afyk611UmyKA+3wGSeN$VQ0^D zCelv>#kOshOMgEt%L0ol7#uzn=v>S=k|ZIn*X#X$Ka+SNXfzsF9oKb>dS|m4zOE>H z(_5_;_Gr7^VhM6fF>DY7lgWf+=~8;02iAVSFZy@gZWo|luZN{gv*=%2E|@bjzv%u{TV|kqL7G+Xl#Ry9cXPtBe4mhu>%xT z?7#|iDp5!j6lQMb{V(71X5`IpCK-))&pY?H$33^(zkh-tSeE7E_y7Vp-M=}jAWgvO zg!WP5IF=;Ib=@5y3vnD5hGF0Lh&N4>X_`PqWtygn#HzlY~W{gqR<=GAj>i!MNwe*W%+)|I1_YTXBg&;ACNrHvn)G6Uj?@QZQGDp z>h=FVkUY>bfR&Lb6mBmq+o&TDVl^}qJD bKi&NaPjooVuS;7T00000NkvXXu0mjfhOC>q diff --git a/Telegram/Resources/icons/player/player_repeat_single@2x.png b/Telegram/Resources/icons/player/player_repeat_single@2x.png index 0bb671ed1353078c642c2b615c3044d7a1511d17..5c162addbc690bf8dbde334cd159380f647f5e09 100644 GIT binary patch delta 786 zcmV+t1MU3V1%?NZfq(ExL_t(o3GG)sNOEBqEejzXqd^B13LAnH6pe%ik#MNNXlMv+ z5FDJG9TX99aY<(pL1=JsaBy)GL=Y50h-wh5h6X_>B7eT`eBXte-hZz*DY$o#_dd@# z=Q;25-h1EIl@IHcQAvcz>gtybg$Vw7U8kH@1{s|^N2tyY_tz7T$TEij%;Ch2rqrBaci zXJ=;=jJT$ff;l6aptzNIcy1KGhELyFWjR0y z#+0{|w8A*p`+qT}*n<2^c71&fH}G+EboBW6$R;FJoaeRQ*x0~xgJQ8*Yzb~qh{ur8 zXk1_a*Tq(=B~=f&b$ARBZXhuljktxR%JLYJstmcMlYav?U(=v9AE#Nlw1N+s;xKf=@T@iF#SY~AoQuOTcwvHuer(Y$m9 z{ORfG$A8BML~#x|I5=QHaE9!5J7LIVGI0WhCC|^#KR-XA*zfltEsQjS3Iqb64~IkS z)-wqaH#mmkg9f?R*H^RIEJ9&>d;96>2@3UkotOUg|AP^FadA;76ch>to}O~Kj1Dov zID$CxI-O3O^T*@y;o)JU(cl2{r`qi{X14f+Cw~v;VE%gensbAS#p3?{J}_@@Z}@wK zS#sm)S?oE@W;2(|b-P`9R!k(7N)a7Gx3;#n#7IcaiO1uFr%tEC_%}%Miu{7%aG3D) z@bIA1>G%mtK!ide!qd&o%@WE9D&hD0d%a#T7!-t-L2?J=4#*w&l^ysCmwkuj37W{h Q01E&B07*qoM6N<$g51!6vH$=8 delta 613 zcmV-r0-F7X2ipaZfqz9wL_t(o3GG+Ct^q+9Wpg9()6q~VM01}&ArT=VDr%jd$}8yg zUO}VKXoN&1#3M+QM5B~wgnLi!T%WmX?au7l&E90EadzfA=R5Q5&JUl@YhDGs3jC`I z1OkCxuXi{cz62V=5DbcqQ$zv*Cx1dfvC)uVZFonZ@P_>SgMW35OeRG9{)Y|41Yef2 z-EOPZYB(HDCX>tMQkHHho_`m>x7)4X?}tJm60Oy0su(jxMM+z&)_T1@olYvb-ELPd zmnolWv|g{%5CermK@}ryC?1c`=ksS3>VYT9N}UWO5(x~IN~KPxBWTFr8$xXcgF!x@ zr<77)Hk(bS(|^fi!kme4KlFo|&8EJa{eItWw_k~T{?A_GI@#xdZKAv)3tn4BTMuZT$S@jTvaHtBRa8jTKz zL%yG35#`?)YOy+nzk{bY7rAnnjbk(08St%dx$tSBCEfZ_2PXqModO)S{Wh@{@icbu#rnjY$&p^VWG%UHdt6GDGLjd z1qusEiL!9FkjNzx#lm%Afk+Zcij7OkO33y9pZ?>U#+>;-X3ph1U(L7qX5N{3-uHRu z%*=b{1mL(K9q2O8>$3fiSX^xGuBA_{7vi_NXr%09sXB^P<#QgLk8zfjE!NI|1DSCZ<4G9Th z(7ZzoZfEQ;SoQN`iTE2tv}pL-+go2>UwV3aczAexe0*zbt3`@ThUF|2N_2E|l$n{y zsGOahrMj?1rhl{7s;ph^`p3sdM@NT#!NAa(ni_X6&cB{XpkCxH$@BAbVPWCw>MGZO z$Hzym{C`3dh($z1#Kpx$Mn?Wm2jth+*Ecse9y*|De0-c{m6n!ve0=PAh*hn{#l@SO zoA2-MoQLDPsHLTaHsX8ZS8a53RODt{|0xuY~8-BT+|&RA4b)YQ~e zety0lQCd<~R(5xHcXf4DU0t1&l(f6MD-DH#GQ{A~_4W0Pj0_`+^wXLl!tRfEBEKDpbD@(H;hbi_h=P+R`5hfNB6Qe<#ot@!GW#F7s6($xK z__g0)fjNhU-V$MAdI)DqoJ)*(#q#$TGgYj&os)y$gKWRho05_uq}{p1qNAg`y1KMi znB3f4oMS@7ggcWw3^#@HOE_{0|5!kF&(9Jr&*LBrCzxVT76OyuhLr4ZYl<5JuU z3kwEWY2?ApS(g$dR{Z7U_{5KWx5t*^^khdv|!$l^AlAewtsox=3#kxIXgRBQv+6GV`E5H8HpPii(_MB zb8>R>^74p$WMt(0{G3!RDGUw{lDV>{aBy&dXT%aRH0a^sp*?&wEh{T4Kfa97=E;|v zo11MQhDC+jDcn)X8|regm+hXha3T*33{+H9kZzNclbxNNq-wnI@bG|}B+>gz<9~Wx zh@pCVdgyr@8X6MKjhSGFMG&|Gr@3Koq*G-UDYXffS#L8lGeJQ?HtDun4fCzn;^HFr zO9rdWumm6X#W<$PV~J_BM2%NKu}LEM(72JCf3H|#zS7dt(%akH)6>(`)Kv4)6{7Nh s@__Py@__Py@__Py@__PysUG+XT@&^TQO&s_7ZU6uP delta 1119 zcmV-l1fcti3egFWfqy$mL_t(&1?^fnNHakc_7+9=_i;Izwkx(dfdV1={8{5|Y2-L@z&7r94YXuAn5nOhM zA||)}5eQf~6C58O_w@8!U0sPNC6swXabRG8U;^~X$;pk44f)Us5+d@5wY9Yod$7XJ zLn{3s@_$yv>gs9&8hu4-d?NCQm6nzg+nk{I)jn6y1cv;5kO40aY~{S>oP7r zx3{;}I%qWp=M6=&YZ1}tJyQ+NE18-|J&yd9m4B6_l8E-b5yP~IFmrQr=qP+p&@UQk z4SOXC&u{jCc&+tkA58!36E{WxxS`)LCb2wxyEYgVU4YVUSCJ3CS@ zet+PTOeXauYkGQ`Aaf(){TR<%nsXG4&&h6_TiJGZcRxHl=&VrimKff~MduK$(0J80 zI5>zCni$wyVmPdk{S7bsEbzQTu;zMdYHDq54J#oll6_^c8XFrU2hsccd;1>Pnjiy8 zq@(1B+uPf0xHb*&M5Qh3a+r`P;c(a{PJg!A?CdNFCQXdRV%)vN$sA*+#GS#-%}sxQ z|L5nYJ2#oFal+W&-J8tM$EikXRBhVF5Y{aJh=IsXU z3L?&T4(vf-XlMxkis8Uknu!x)0Jpxr-rL*z`1mLdC^wKpVhDqU1i!N5Cu43%IavD6 zi2>i)*;z|V3;xQ%%8KHO7$TjYpQGQwCj ll>wCjl>wCjm4Tnmz&|)?4I?~|PMH7z002ovPDHLkV1fsD8h!u( diff --git a/Telegram/Resources/icons/player/player_reverse.png b/Telegram/Resources/icons/player/player_reverse.png deleted file mode 100644 index dea0be2df5352d1acdf63a3f443e6232ff7f30d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmeAS@N?(olHy`uVBq!ia0vp@K+MO%1|+}KPrC%9I14-?iy0WWg+Z8+Vb&Z8pkRfk zi(`n!#HW)C`Hm>?upBR}b2$0Go^9?=#%b$2EDoxAUApffqMcpvkd;G$P5J!!Gt+J! zOEl0}`r(L};0|kscYfz8e?IAob&pHI!_y!456!xnnpl7O596-o(R{ZrDYOCIz~JfX=d#Wzp$Py;D@-f^ diff --git a/Telegram/Resources/icons/player/player_reverse@2x.png b/Telegram/Resources/icons/player/player_reverse@2x.png deleted file mode 100644 index d3af5baf60257095948951257bb026701502a5cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)j!3HGjh1XvOQk(@Ik;M!Q+`=Ht$S`Y;1W>Te z)5S5wqx0>wgIo-X94_f9zy90j@p}sdtxlcJ`g}$ozpepOMnKkETcwrG-lhK2zi}~K ziCWH<+t(ps6(#zuM8}Oic;!3HD^Y@J>MDb50q$YKTtZeb8+WSBKa0w{RL z)5S3)qV?^~-F(c7JT8I4Pxt5UyQ8Tj)pAfyZt8lMsdwL86w_2|?U_mYWvbU~C& z|BL8dm-_5~`eNaEd<|PqZB)2(aN&WxTRYmjnb>Eaj-4Z((c}2NQ2Rm3(yHdo4c$NA q$gX2wSGHH**3YG*Bc^`OABL-p=F#^%U)KZu$>8bg=d#Wzp$P!J{dKqi diff --git a/Telegram/Resources/icons/player/player_shuffle.png b/Telegram/Resources/icons/player/player_shuffle.png index 1986e7329bde6178de82759dfeb8230eb0a90fa6..da4e9c76b414b438fa625d829986edfbf1d3bade 100644 GIT binary patch delta 277 zcmV+w0qXvO1dIcafPVn?Nkl^LglOwbREsspyBId ztoBg|a#0j}QH%+8#1wP%E#ie!;Qv+7BSdZS-&$jDp`keJr`REAbzNienx?TAtOF3C z-EWb&0cr6~;=2>47BY@wajh{Ibc8*G%CanFS+W|uwP~7?B-wvjM;nG=97lXwhuqHP b6L?a^RSrz=00000NkvXXu0mjf;faMx delta 396 zcmV;70dxM01A+vQfPVpONklEBVZu0QOH0cSA3gw8cXf54DUpznxOVLtu?7J(o0yoq zd-o2gVdBJzaI<7&WNzKM1r*%5bLYyHD}fBS6h4N5fx+w7uYciY$;-<_yu5kyW}pX| znVACu0`TcamebbO25NS7byZeYe)#Yq(9m`3*0Hj(BC8>m&BDT>rl$7f$rGR{D^{!k za*5T6rcO&s>-qENKvNbjTnIFUOoR0F^j^Js1vF*$?Absg=FOW&j@OKhjo-d~3p8cQ zlqrmijACM9w|{Tn26Ewn?eFi8=6oz%b8~Y@QtIvPg-c6GNnO8w9cb2$9XpmUUk+rz zrLZ$>Y-~P#`UF(h*4Bom0_d*GmoEdQAOKAkoePQS`uciw2?hpW3fi`98_XO+E&^uS qsHiARQ-C6*Wm>F8j0#dG1OS-v-+Rt4kS+iK002ovP6b4+LSTZkXTc@_ diff --git a/Telegram/Resources/icons/player/player_shuffle@2x.png b/Telegram/Resources/icons/player/player_shuffle@2x.png index 3c2751ac87c2764e873f24d1bb91d6ad4a8e7d42..8623951144dcce7ce5753ab2a94423f03f2f5162 100644 GIT binary patch delta 450 zcmV;z0X_bl2e<@~fPVp^NklAeyr?6OkT_k$*=>-VR$C*&o7@QliY5uIR%^oP64OD|5o6Bi5CO`eCBz+ z^dyHkj(y*!$KBYrt!>+NT~GawJ%VN!hH)ITEYpmvs_L6*U4Peko~O?9p&rI4QiNex z*R?(qmoti@BuThY-F|T3ePPb{)nvje`}}J~Q7p?slA&9-u)^;Nrac=45|bGqWT({n zIvqox(=L)RphuaGG_b*89!Q_*M1w$EKsrn!ja?u$lavM_SaMCi zqd_rl$l}Jxm87Xl9c=xVNsAE*8KRpNAh8S)h{nm;JkY6tNFeqcLku6#j;UdbwYeS& zG;(kSj_$djh2G>ST}?>l9ezR?N~>q%Mx6pq0jGdd-~|f&05mCDs&peNV*mgE07*qoM6N<$f?i71(f|Me delta 809 zcmV+^1J?Yw1e^zufPVu9NklwskQ9&VHU3{lR;Cdw~7=`r6*! z?jPfS)@U?uZ*PP6{PFSU2^eX&+YEPqe_uex-;nk7^_Q0ymP-xcAOj-v`8>r6hrEq*rrgJt=xG=X)r)xAC6f_o#2}_l^-R{rNPntUcLa2=iadmY?agUCUW@cuF z)AD+~n0Yjd*?+?m1&ylJYOD^12qTe5%+Aj8C2wwS_If=Qj}>=&d&?gAvPSbSEG(R! zo-$Av$z)P4mw!j``Fu1C%gtu9>Gk?%v&s3tr~IQwsZTfPXnHx zpDh*(7l2P+DwWFRGL0YCo}Zu3X0x>9;o%_z-PzfpLw}Etk637IR4fCMq|<4xFa$uq z;VK1#LCWU-{@!RbibbLi7gOitJUzWI!SYnu`sDbr= zaBx7`+}zw43ZFDMxm=F2!6Tet1BK4d&$*!~Eqe%n zZcEwFX6kE9Jek?x(z(k=Xzi($-TU#{X>FJ3be=*++g~G(P4!~VpT+m|i zczoc7zp=4FxBA!DSF6>k)oN?C8katnDqJ#!<9|ShABj934?PUMzrUkfvX>c`5IXYp z^)-Wo5sgNF1a-Mw1CNVH|1o!104_B2Yz4SbC^RgAj5!>RZnsO{gtJM==;qnk8AaUP z-4%|3vj;vFO`iavPN%~V1A%~WHey|aa2Eq1D361wa5f@d6hQ(f;?>nv;cO5o;#GPi n9wJh(q=2M=q=2M=7z+FblTU)N9ZZ|<00000NkvXXu0mjfRo0Cp diff --git a/Telegram/Resources/icons/player/player_shuffle@3x.png b/Telegram/Resources/icons/player/player_shuffle@3x.png index f743ba906285ebdfad55e400bc63f1ea7c02ce8e..69ad651d46fb973f96a6dc9602fb0ffd673b99fa 100644 GIT binary patch delta 699 zcmV;s0!00b3$F%{fPVs+NklJ#GRq5QRw;f#{KtXpks40UUsHKtTsJh=Pt2 z&~XgTKtab(MMpsg5)B0%5+ZquB@4~6{#gUFQD%$C-W@;B_w2;ZdNUch!~tFTsyWP&W`F(t=)qm=AI{AG5{w68kZnx!f zIUEkp=QDZq&Wt){E5 zDxg=)Lp^^2=YJ&0l8CEbR;v{WdsUTm|135ld%0ZR4F8Et z2J(PCi|rv5#5uvj+2W}9!9v&!RH*<<#%88U3z#pPl`2JG?rbhpP{S5S{Z&K(RpyH% z-S78FLL|Vj0AkODjWRA2hzL(rr#>2uNCx_m8VUoIYJZ4-0&o!#&ME*x#)>m_-@bjv z%2%H!UZ{9{PtvQ5RT9^D+WgIB9@mrg>M~YXyRk<9r3KoB3S*^q9%i-_ZK+(S zFbf>R(y|G5Ojk{Bmtf{s1MZ2E-&iXfKbSQ|f~2eFhRk5*jLVwZJt#=+u@qj%{#R^~uhzc^i;*KVPJBFkk9}(GiA4-t!t=l3;Diub=)dmG~ z(n|!vU%m}+@P~uUmmd6`PNzblaDVXUn`DxBeFkmb=2@lj?g{VJ^p4S7SS%J+K@yPs z3_9eHmLy@V;==)J3<>a_ioIS>Nd$flaXcQ|?KHOg=MW@ssfq*QfH)uyhy&t)I3Ny) h1LA-^d!28#=jfPVz_Nkl)$FrPft(P)zvC# zv|BVZG%PDCo1dSbnwrYU$k2}LkM{WZxXPgZEIvO!>%^QeNo{Q{>4Z+Q7#|=1^72B` zieX`&bTWH*ct}~TudmmhIVmX#zHAgTf2h47QHI^!UB11hrY2DZ$qR9DaSsmEN?CgYXQz{D~XKiggJw1&)Vt~-l8?36T5;Wh_(_>_0q>))$Tidz0IYBmR zQX^XV!f>EbhPh#1U!SqDu|!@62ZzPQMLy5_`}@Vk1%EX!ky8g^MMXtlUtg4Y7!D2& znwpxbHQ?mrw6e0oSATtdO;1k`2naYjIwDuq66#VQKR^HT^OH2s;gOLMb8~YQmRwz3 z*Votiif~w`q@-|)zP`Q(2L~vlf=w?=xw*L?A0KEQ0n|#c*9n^R@bK8$+CoVLkB^Uu ziHW3&w|}?y-rgPvY;0_h^WTKCva;ZrZHUI#lK<%E})m*7Eve}5kv8%qhp(9X^- zCnpDT!C(508K{Zj-N29#P<4rqkI(-8KCU9Ty}gZ&j{XiuW!OkfO{L1&;o)I3Gc%;} z^Yi0Zn-JU8)m2191d1sUkmYQDf4_-|33?eA7=L(ja)OTt0c`7GVPPnyT)>sH-QC^f zNgWgvbar-z!61Oi;NW28219uU4~MK9LqkLPr!B+=4-h0N-5)ay4-bb|2p{+SS!1y=^MiDuv7V>FFu;U7#G$%TTP*-Oa)QLR20V67+Wbjb!C1m2+a=Mgrc`lFpo*XS@EZl|a~j1}@56Y%X0AwX zWnlQAdGuZOWfRS%n{>`kiMwuk%)<9_e#G@sua&D-Det_!?Wn}@!aw!%+QrWE9-gq? z;QZ&cY4^YDKh-;3lrrzP*!O*X|GqvhI+uQFe|h}vZM=#xo4U4dc)e?pMqJd<<)3Y~ u038Ma5A?rx8U^eYEL?;;u=_SN%QFAkKz_Q zMsodu3o?IwtO(H(ec_?PH1}l6rI#f-Vuw2yX-q!Jvgm4-Y`;54e$4vt@}k)5yYK2* zNwhJ(D6qJ(t#F1xa z-M%V9y>85MjJ$ekufG3oQh4CCF(M@Ns`tm@`;GRNA2>_<_u0u+wj2P(il?ie%Q~lo FCIG6z&mI5( literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@2x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..23be463ef0862c0542baa2ffc33f0c28e647097b GIT binary patch literal 1120 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 N@pScbS?83{1OR_0o@xL9 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e78836e41c19435784f70a0b87fadf12196cf18e GIT binary patch literal 1372 zcmZ`(c~H^`6#gM9X_{AgyN0QGZAr)4uC!htAZf~y7rKdx;p9dlu1889;gQXPu7!db zX=$sNl9r`u;ejN1uxk^kWr$xi{(ATWExaHC*bjjSD!zpK_HOda%3{u z;9x*lSQz7@Y+{04UVfvl&Siz(OHN2A$TYm)+&nTih7Sv4-%;LaxqcmL*UaaO5r<(g zqbaZ7wLm8@erG6@qeqXD3c?A5YgJX~3zL&k7K(OTK@-s@ptt*kOeh5H3JnQ?+NNh_ za<-Y6nCyPN6S}?4o18p0JL{AI(bh&hrwCMxh{#BsF(4EQmjn`tq&PnnGW{*(tfB2ev1yDnokp{lH#Ic)Vs~3|Ih;OJVC+Y>U5#B>BzCrJ zX1SuW651mc7om%aiXKa#`*WwKV@vB`>rFj<{yyC|dnODCE{kp=WA#sN#&&dc+(IWY zb8~Yo8w(wAAr+;iMjfwMEJM4!j*d7gIgj*RfIH|IXOcQvp*qeLxw*nOZ=eos?d|n*<9TQDmwM}werL}wFD>P5zg%_o zYH2o=TDHmo4eIt<1cZQY<+QaOlK$ec=e)F!j`pJ8@9fO?^NWm(bW*IW(C&caSt0Tqa$k;8nXxntHjTD?ysD4l z*qjEJ1ae?-c$M#TrG=3~z)3GDuy6nVA8@$7s@d=XkK(#xG>{y1k;}D8EZ}e~ zEff@68ylNNV{Hh8^bL63v9-JVdk>F7!o4g#7ECwI#0|bacK6=BPy)fVI_{9>5S~Jz z&}fGu5II;s6bcm`ZIkGdY0>&c@A%hO{)*Gu(9(^F?|JLhsxVl*{ZzP-J@{^zHshg!LxJ$qJASi=(@em(#GzP)vS ztG>RvT2QJTwq{4w*Q|_;7bhpH=il4IDIzW=)^>u6gTuhs_;9F_#HLM~q@<*Fm%n#2 z)6mxTj*pjL0R%7Z?k=~ova+xLXJTUV^5`6bj1A-@mlf`{~oC z!otG;|Npm7JvC*=jvXI96f9WW;1|8KC^aoj%^z8Wp%$g;Gqoe_Napa#5PVHAmuwj`WwA z78MdV4zRgSUZmvZ^vlO+&54$({Jq=b#XsKL^YY7F;}x~nBGcd3Ub~wvzk1b;1TF*C z8B9Km%NT+iG!KaU@M7Ed-rZ@bMx<_>^s6%_qr{fK7IPloU;1*`l_lZt*O%< zgzva=?_OO|(WlqNFTPeey8A8v{P*wQ$zR|9fA~<5Px-`p0h5_N`uh5FVCSd-tN={`=>jhxgsNfB$g4)!chGZY*GE;yioi%!O5F(-tRa zP3`h4s;l$!2oDbr4h~M#66##CeEITy`}PTlY>d?lH;@R?nhKOq6`D0;#(`JYu7xeM zo+9W_XGp^Yv@#qmr_+ptG{FvW2@(8F;B5DL1jP@sT`p{(Q3N^Grlr8J@UtNQ(c@D+va??wKFoYz^=j?yw|SY96B8Y6wkbUR&1q_4 zqM*|B@R;aVj>Q)_JpZYDDpwKW^iY-Xllhb8^up@S@`K@zf5%2fF3gFGkB^Ru`oY3C zu^{XyTVAk=(8ZS}9~$QE+qNz23DE89*01k(nCa7&q@^^)@Nb{fi^h^)1r|Clq+T{P ztS>7oV`Ek-Eh*tJI_g;G)ZE|;gD2hPXuVl_mvva_9A8-a1i zb@RyK&yud3ygWPs6;+Z~vP$))E3>@6e!i*kLvL@d#`NdU(*=xX^4!w-Q*9&nh@FYC z&Z00SC8g!t_ix{tY%MK4gZISDcx1b9<%9bdF9z*t-EoGilgw7#&A@x!-oVFrKr z9j7pV)Oqvfjg77C+qZ8SU8XMh`RIk+eE!Qo-qEA3fBra}ezt8wVQp=1sL9g^owAym yJ-c>!S#X`mF#{%?;=Q{wlxG{EB+dJxKX~IlJI}f;m2(P|Q9ND!T-G@yGywo${F1%^ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..38fdf1eadcec4f7bd2a22f178b54111db1543b5a GIT binary patch literal 1351 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbHUhz_QWP#W5s< z^=*Ww#@2k1|2>jHQw&`^CMjwLPdYS7XF_6f7Z114(i;iQ8Y0}DIVlkvwkWx1y0)DV z@N7Ht`On|_zxVe&e!2I0_0IQucPBr#Nw2DV{@w0y<-7Uze~$AQFrQ&CK7f;IFqHi8 z?OR?}mXw^_x;1M|jE#T)47qsmVsmqIb#=ABzyJ2_+q1K?Wo2dMR2|ND3ER;^y`>+4%T>9~g7x^?SH(_U6r=y?b@Jr|`ah^{V8VVV84G&YP1bJ9&CduI!X@cXK;(VD;+Nt*xzx4?73` z{Ps;uQZiHI1(zo?6Vto*?>Ud3KFxhnU<&u=PoIRs70jjrtv3nx^6HvVmXzeg*c|91 zDk>Us^2`~Zq9P;SQn6|C=J}nQJbAKFjj5?=%HDnZrmay^Q?sY1PJY@o;ljS5!0{{{6c;BSYimSCJeb$jx2)AYL>rG11V@uCAtrr_b~` z9}mxxLj{Z;e2)aLUb>{@)_85|R8cNXeSPt@Sx@6dm)S&SW@;{+Gk5OPIkRWa_Uv?K zjh{LxBs6p)XA@(X^3t}16^AyQDJw7M%m@seXwp4*?%iwG#9lss{(R%>gil|-i15#z zH&0G*Dr1VX=(Vd?U0;-!m91H`hC^oGrN@tzBfGo16Aw*NJNxO=rWgK=t5}*vrcIyj zu2CqjqN;k*KvYa@67#x!lO_pCEsFg3{rmKv(g`c}ZTRt{;-gVcM#cp$?p{?yw8a<;ugvHK1{Q9-@)0CEb_u_p04`*BvdG_RqikyVEw|7Z* z2CKNRu(DWLVd28c&6&Jc+*g(--gx&yi1Wq4gN;Cc8Z~X)X!vP*%cf06PX+$2{UzG= z)y&GuOXH#gFoHCj1^9WmT$o#)Ia>z!udZwDy#DU>>ue{drcYlE9z6KvgR^y8x$f0A zcY$|SPYY_-aJ43Gbai!o7^!)>`}Fh##}jAIPPIJI_Tqt=nVH6t-MgjN&a9Zg!^?Zp ziO1m2Is=E`|W{QfuR@7`_w%Yp0V>(|QvH*Yp(XJ?=B z=+UDi;sT{wB1^-5tTXsx(ZUwK>dUR;*}gVxCmn+itn>EqVX?Tm+2hY1g;u7Evwr;e zu|n6a=lHVaZ*J(8a6jDXTE)@V*Vl2#IXFb?^p48{P4Vt0a`W=~J{@kEWAX81SNvp` zgjt{7*LfTiU*N7-W#*%tI%nRzWmj(S10z^MPFD6|g!4lJ{{ge}$ zV$SpKFZ~;J=YC~Jl}y;onKOZzq2j|sPM>ApzLmwt-`}!j%h|JM|NN=(?0>HCjqO9C z_{8PQ7`|A%wz9TP%*xF@%J2SzlOxuMW0K|K^M^j2J8>c+CT7aM4QCqL@s<{#l4M2V Z1N%-s`G{o+QxAg*F;7=Nmvv4FO#pe1R0RM4 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5.png new file mode 100644 index 0000000000000000000000000000000000000000..95fef6aa8b7c73ae6d2b322df15c9ea621ba0a8a GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfti;pBF~maf zZJ_PyrUa37vt1oo6t}1aI{#y6Kc>bi&fYog&`J3V^%*=1R~j-Mw4J4NLQ1KrjZK`r zovUQ!ldix?-zQ8r&oAFo{)Ok)oX>X8Ut4aBNSVm=f2D)n{OPGTO?;aa0%8M2&OiVB z{PMTowN`W8{PP){|CLysO)+Y9S{Sufs!j07>#x6(HcIfYJ-D^4c5j^bQlXGNck?9L z9KB<&Ge2|x(7axOqt}gjCu4)*_Sx5qA*2Xu>PrbNunFWh+;m z`uwNDrj51xXwv%Y)^q))dOa<$=y6*dUL^6fXy@6qV7=*yiVOwf8M~v_${fG>woKRKTJZ~#$9Cqbc%Tsk> z(e*{_jx9HS_u6V`ty(=v#MYtv-QNcnKE(g^UHo)zy`kLxpU>tP-=AYCEPU909Yc77 z_5slcTm`HTMtcE;@g|M%UycgKz$d-Ukh zp|!uv;zC1P1?uhWH{aBGrDSja|MBC;lSTi`o;+E3*Q@Lg;V(+Ev$ON_^K)`^W_x*i zCvUr;p`oF0>&THKfB)LfcFN*wfBfoIm!iGVojh|JIa%4#^76~;*xA@zY_DCvF081p z?>~jXz}otDf`P_VFGWRF)ul_9vi=rqN_;zO)~s*e%4Yh6MMwWGb?R_o*%>2u?(UyI zHWuvc?3|pOM;cdjcXu=J^Yc50cgoy+@+3vWUu5Cpn(FH6%F31N*6C?#cJ}w*zjtrm z+_|;2wM$i3xJqPg-L-o4>cxwh%ZiJOQ&UxW`j0!$$vED@_4Vu5#Kr#p{@U8wDx$r| zj~|a(JMBXG#)UfbYU&t`IxXfu!2j|TkvuW(xc5mPQ{QGato%{Cr zd3h<>i;9ZAfB*h~xw-lBWy?A)T)6OIZ_a_f83ISzzqhxyFI%RzD^KI$-Mg_|nMN}s zJVaC*O`_I@nSJF|PICIty33JU)avT%uOg*2H8CCQ*RB=p+on0yt2Nl^_wutP$;rwq z%oYl;3YfWt7_MH`)6;Y8m|LQd({Fdqh5T#RtrHUy z)hXZvF!;aRnlpbs&Fe7R5h!Ujw=e8bUxH&^p5EW19`Eh-wq1UiqF|htpTCgh z=!}^&8T;n02+?x7aP6W91DmM)S+5uFC3|-6^z`%Fw`0ePmoFQ&GBS4D)(HJ__~pw? z9ZnXe!-o$~pFUkczP)wxja#>*Bqdj_UTtk{tvtUX>GI{v8&#M1aa3KsbV-Pd+yBSE ofBP~r_=>=(9Gd8V)QkS$K7S$Zj@UE)8K9i!>FVdQ&MBb@0Jx69ssI20 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ebdcebda183688e2e14208e41988e09042af4487 GIT binary patch literal 1408 zcmah}X)qfI7)>HVvf^yfx^Imrq1#5WZ3Gc@RZ&-IXK5wMuBt24)kdh)6^05;oYl2t zwY9UZAhar?rRW5qt{F#4nN`FJ8-I5H?9Bdn-}{dD^LsDH%L508orVDb065;o(ObeU z$B+d{>Qug=qJ)64-Z%$9^Lx!z$>137kH78i4nRnHSpbki0DzAr5}cL*0FYt=0a6kM z9`Bf-f37Y}sek)pVFAkdD*ymq!#iSpBBa;-158_QoH*oJg(HZ~efywBTu}tF9;~3js@I0(;YMUjDB!;%$0f`Oju%jn&oFWo7Cb8uY5FDk_yq zp-?OyxVyP=hlct%9HhBgrkyOuee3p^==FBvRPD?(19ko-{ErQ9(nX z&}jckXqw!Qckc>DMwsfO3k%g3BY$mfM(lHm4p{8OQ?Cb9HmsqmOU&n&u~;m9=Qp1g zddo84pJ!(`hm%wW`H%V2*4EawqPSZ`;$yz};6N}vT{C}p$i6t#&1PGbuC5Z|HZNt5 z`l3o144qfc7z~_~Q{4Ug4FI!p9*-v{Cs%g3w&tp&+lYxF5{YYTYcMFZP&zR&@!W+A z2?+@u?d@C;+poU9J~}F@wY9ZH%QrCamr=FY_;_PG2N9|3NO66AohKBD0=7=@r>34& zR9N;11Qq46slc&ws7FpYzJ7kGsJ}x0{PG2vWNu+06dti)_v7P>zAY>)uxPwA-=M3I z<{a+SRQX(krn9p%fj}@YFtD|?m64HYP`$|=9L%wFTM-Hk;O`wmLbTyAn#w9F1pepG zo-h3}>qC)e&*t&X&CI4}XY2K#o}Qj~Z{q|{me8ez<)Y;jYsMZwbt}?{sR(qAD!)<=} zA@5^aLc#!j^$naelc#cHD>zbc`R)>bOnRKj9-?z7932K&+W0Xv3aSIdhLZiN=AlKD{&MimAI{n zEY8o*fA`L17JSO0Yi8!g<2V8#2f(M{aJVo|4a9iK`Sj8OP2pO2j%aU>S^mm524TwX z?Zv>POT9^?i|vTpZ&WK83==bOFoaiIQ}gimTsJ-=qW+e{uz=6k6>n{|R90#=)s--j zs7~Dods&~!t%o2MB_%mI*CLigLX0lLF;2lBS({z@Y~^^QXlG}KSfXIFyu3VC8yOi{ ziyOj{WYOATMFNf;HOy{DFf%h)_xw4#784N0Wpw%&_Ru8FJv%>t;B8|=!<^ao`&%3i zr=;X$#XZTl;Z4;SaOl@M-f9xO<#_cqb3XW`~=Ze*<`~d8GgV literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc20e56d849a315d94e1c409165577bad908c44 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgf%+=GyF~mYJ zIYEMTv7*CMfsVeux=&9|PSFg0@J!C4;DIsEp8EfG1_lCpt&=BCnDF7@;r8F(-^cGL zU|i?n?tWaDhl`v0|NsB*pFUl>aN)s&2N^>SoH(&!{d)fJ&V-JxuC9)bHSzo9ZYu2f zGD+3@-JP9>&z!0G{q1e)>1m8dv$M17|Nde%6j{e}@IcmtS+j1B*2OQ23JiIJ!ot|B)YaA5 z7xm4a{rl6?)Bf}AYCk{gZE9lbN=xCpvmp2Ow$$`==A~)p=ly+jl-tkGufu4;>$tsD zs)~w*-`?CTetyo-(9rS7LXkUbdZo?R#q1P1!RlsaaIdjvd;Wbfaq;^9|6~_EdwjgV wu&~f!abxDwdwZ)3{vYy{NbPB3U{z#bVA7v!v1P^oU7&#VboFyt=akR{07XW<8UO$Q literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@2x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd696eb6e5494f2de79e9eb92468f16f6955cd1 GIT binary patch literal 889 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HT7q&4-&r}dYWm6hlEvAgfvyO)=(x#ZjD&&8dB{Cs>TQnRzU^)_$bY;A4b zB>n#Vdwv!sZfsFLMXQs)l>C?q`EcnE+(?^YYTZGOhL$^$) z8+qH+)zz0ib1B=awq^TvcXp0eCy|GrK21`&m@!4g+uK{EvZ_i-LgGh1XK#Q1;t3li z!}$0U!ZbuQm}j45n|=Ja`-X<&IcDFd@vf=v$+i zDzo3d&E3}<5>@52c=6(|RkE{9XZx-V)4svr>REZAsj9$ehZAGE z6ryy*yq5;44gZ7&ldCYBM%=w z^jgZqP$2HMI8Z=*YiWJG|AzzOI`ix{%-HMUo$$xgZptz9=5tA?SkUQlXzyIBxqOqpe=py%SHUWx z`Cxzopr E04&XJ%m4rY literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..16dc797bc9fbee6a19af461f3453093138e8722e GIT binary patch literal 1295 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 tU2bmf!nsE^m$G?uEak- zA-Hz(?sbfTB5h|?Ot@?p3LFX6SaCrkMoQE$UxBOFZSmrdOnQMHE>22?o$40?JNp85 zs9Qa+u{OThS#)mWq{z?bZ@vD%>3T|j_fzkMFJ#&ePdu42$8Wjjo4Wn)zgBI(eYU{y zX5M!Ddaj-uyc3pXIwWnJvGVN&nf~L3N$#s{ez`pUcta<{M9OnF!^sa7HlKg~`B68U zpDSGh)h2U3`&z|2osILCL~rZmmoCTFyf3txd+qgC50yh^*;}O)R$ujEZgM#BgF$!t z=>iKG4we%yO04Fdek#=2a{YDb?z_`ZFOAS?b6S{V_PS{2th39ONI3PmZU479eY0fM z)+ocM{rC6Btv|!mbhT(_Pw)LBoI#1 hKUqCJ?9HqDAGtqS1twdB{l5r`EKgTImvv4FO#mVN<`@6~ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@2x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@2x.png deleted file mode 100644 index 5c0b085c9fafe198455fd8cf2aa9bea115957077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1045 zcmV+w1nT>VP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91AOHXW0K3=wjsO4ye@R3^R9Fe^m&+?|VHCzuE)!zH zfRx+@3T1#qDY+zu21xNgkeHab6b1$|!Ay#Y`^11^M9FQYq~sFi8p`dQUp=+Hh7HH|&+1cXaVr6BeCsRsF%FfP?I&bUA z$w_*8dR0}`@$oV95g8e2UL_?Z7Z(>yPatVp7qD=~wzs!?P60&EF74{-GRHtrT3R|a zH6^B}r$;ekVqz#!WNKGv~d%y|lD6e$ejju58A}#>{PYb{2ANZB0yA zm}>@xhlk~YZ*6U@@WH_Wt&+VMRtx9=k8X2wQw)J*WWN}dxvj6SV>UB0)7jZcpPrwe zx3;!ul?)gZM8%=CfXBzjoSYnUmx|RG2Y7T>S65=<R%2goFe+0K}lO5S*fkiHU)uqn_Q~-eN;F`}_MA8SwPc|J%GTU%RkqZ;g48yXt4eas!eNX5p+E-x>O zY;0^)Ce98U@VK}*Nb_=)BEeTzUS2*wKTjKY0EjZS4k6~}=X20uz+Pj3`uh5!qod)Q znwq#JhK7dZqLoAB^73+GVnX7_q|U{TPDbCieP9PeoL$C!F3o3tpeduJc9r(!K4HJy zM?UT1g7oZj+XX=ar1N}Wx!xKAed67*hl5msg(U@v{Qm%Xi~5$obO(L{w{PeG#*Bfo P00000NkvXXu0mjfNUhn- diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@3x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@3x.png deleted file mode 100644 index 8e1bcc9f2162a74eb2195d6db6108b4934f8e081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1745 zcmV;?1}^!DP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91FaQ7m09ljm;Q#;zJ4r-ARA>e5T3JYyTNF+kOf9EO zFi{khFa;4cQA9|?L5;3>-^Ed{KO{G_8lqnaHVnD6|qAL@_6Pa|km@F>%0> z%CR)P_p8lat+S8kc=X=eJ$lc1uy3!m_WHlI_u6Z(|D1O1(tUI*pj&}|a|QI&I5#yl z4GIc!aBw(y@SqyA->;gRn;RJ!X=-Zv^5x6so^EMrSyWWCyuAE}7JonwBtccv*p3}L zHaa@0#Stk`162^-I5sT6Hi}Aw2*Mlh8#Y&ALAJ>NwAF1Iss%q+-@biIPfxeDwpKUi zztDjah=Cq0J7|NvN-k&5o+VQNOjc>C1q#sPY{SFDIVpWUu(!A8!@GCy@}ah2i5{*c z&QKvR>AsqroaCn3h9!Cud4<5Vjr!l=qYLck>h0aT_x$?|A}K73f&o12^4>({S8efpH0 zovp0hK$4Y}#h)r!A3b{X&6_vefbiS5Z(UqmBzrNetgIw6RlwNTI4v!Wv>hEC`uYl~ zgs_K)hsnUx(^EJn2>{4*0t)lFLc+GTwymwLh)t4wV|Woy(UmQ%dLLNM;6DLl@#l_J?WNcqw9}P7Es#4M2 z-JNeba93B?_3PJ>Gm>0+e^ypjgbe~vPa+{9fqTQrL_$hQh_@AUb93^;?WI&Cn;$?` zV8{gSqNJpRrb)f!)vH%Y1z=)gLKCqkLZzptw}1bBZbtaw!-r%Kkd%~k^X5&GV0*p1 zyvP`UQ~+BE?A5DR;C*REkdpFVvGers!M$jsW>T1Q7m zZf|C0hCQJv!jgtOA;m0G0c<6(iHQkv@%;I7P6hbcvuC80x&bUOsp{+NL6n99EG#TU zMMZIk$B!T9jX2p?S66d0fk_J>1*TC|{d?&FV`F0^;g%5cHs|!|(*_0x5P}5R z8yOj)W3Ny#$8NLPxB%0hYue}f*d0ZfU<_-Atbnq zFI~EX(u!zfVq)g!=Y<@@%*;$aiwY?TQ7w1x-c3VIfJWsW_dUIpp-f4BvFap&C1HT^ z@$s;*Fof~>^Ji31QNAIss;a{EP*_+fjCn~23=B+7P32C2aTLqT%OfHpB)O(TRaLR2 zrG>Kj{{8!syL_t{M@;7yc*@_=X-m5)2vMZ zRXc_Tl&?*2a4gtM6&zw1vn3#wT3x|rdjg5`eSRlyu_I6S=G&I2B#fuk7 z0#H^~2I0w*Cvk2`{tsW!cmNt4^8WGT$I#GF+&Lj3A*dxJudAzrCC-wN;Jis(`}_OR zE9K_q4h;>_EC6^zw~6XP!guf9(P5U_17tp)B0gjfAf@78CO`jGwPR4)*w`Q|xFZQe zE3yc6f>bFfDY*A&xGuPT`!@XFx^;`R-@kwN^YbHScvr$5Kw1DwS1yzS)3n^`1Zs9n%)#Q}Kw}fIKj@_J7Z?)A$thlzdU|@0hXn-%B*dEt_N2GB7xI~z z88oyNXFjg93)ZNm~hiM#^a9s8pMqLg0sdD+os zyur^%2yDmx@Q2vY$Zn$_H9=LQpK8UK!@gm2*ZuB6dlC}#KoV31XX)>+H!DejA!^A^ n`|l9SLFy#B70|7~)>hz8%|B%YMC3i300000NkvXXu0mjfHnJ#H diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed1.5.png b/Telegram/Resources/icons/player/voice_speed/voice_speed1.5.png deleted file mode 100644 index c0ec78670a10341d3c0799f44cfda0133576e512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^5S28x>obB^J|Gv*Tym#iA>0+)W8MDGfmd5BUpJY4#{Ohk)98K!1 zQ~%ce|9z2(#!Wb%2J>^wYop z-perQxcu4X(#MAd4qqy4xSAR+q!>A-u^jT?=so^8X(LBNYUGhmKWjGMoRT{8@s6<7 zPk-CBh;_Sezb(td*7x{Gt5da!)We8Jtt@Z+mN)0F3~AbXH&4F*c-GcM8eNGqUVr6! zo@1u`b3^0de~Q1S|3CfINQTdlMCck;lLqp$wt(xk! zG;aOj=HE%P)U;lG|GjJ7;)52y_bPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91AOHXW0K3=wjsO4yV@X6oR9Fe^S4}9aVHjo5P!=e6 zC{uRA4wIRM1zET&GYd+xv6I9G#cE2U$rLM%9gDFg3r$TLiiL#*MZ!dqzmP~G)6>&m2_B#T5$N7)*wE0> z>+5TRl_<)G!(otWYl2v~72!!)fKZg3`r;k9K-`1Qc(AjA&9rf|%ki`+=amygaYhdv|xYv9VEBR;Hrq?(V+6zGmAw z@;Ya&khU5CbMBCxO^(Ha;u2x3{IGr7Xn&%v>sFmCs_aV5eqgW*iO& zT`EB)lZkjoM+XWS4C>vlsi}E-dO{5L5rTJjcNuTD+l812Wpl?z1>PG`6<3uCA_7ae8|C$De^dA*;N+ytTEJ>FBYX zXdqA%!y^|hmPPeC1TV;Vgc*q&&LX%?Ls(w?95U!tU$q!!2Rh2XnMoCa5}8SXj8ZxrrCg>2xv$ z*9R{o#>K@25ZtM%sw!Oj{r!Cg^!N9pR99CQm$>#Kod{+Pae6*EyzF*cTN@)MCME)b zfMkg=Iy#E#EiElXmY0|1MVOnLBRDuXNClD=gCLai`~3$82i4WpNRtj>M=~-pdU|@+ z*Vpl4U0z-WgTdzJW|qb&MN>lC=HswC@(XQd);Uxd@0G;mNAnqUfguT=J@{%k1 nB?c%!r2Pj-ag@FnsosI#I$n*G_euEp00000NkvXXu0mjfMh?m@ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed1.5@3x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed1.5@3x.png deleted file mode 100644 index 866d92903e7905161cc92a6532a28f23ec3967aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1599 zcmV-F2Eh4=P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91FaQ7m09ljm;Q#;ysYygZRA>e5T5BlYZ5VeP5@WL> zhsd&GZDKyi2RVFLYK3J-j&P$MZ1np4sz!u-|=M*L~l=>%On+zOVoPKOG(IPrCxz6}ZV2&{Z<{-Me=K z0s@?zoXpJ3l$ibhs=d9vg@uK_zP_EE9rb3nva+hKu0A%}M*{(WAV)JZb`@ zrKNd#dXfZJ7GWj8K#7j4K79DVmx@$|hK7VW(AU>T&r_5cV-OezV&&CN|D8}G%tTqP8bj*i6Y;!Z^D4Gs?S(J#dJ z@82i+*4CE5y1KfcOL7i6Iy$PVsz`!>eE7a`IwmHD zmP*l%`S|#d&AWH+e0_cU`}>g|*!k({>H7M5`4ZH~$Ou78z0S_gc;T9xn=9`L83SBp z$Ha(-hllb*E0Wy1caK!w-rn#ECn^#Whqa4~OLTPf`1p8WU?AB5ps0QI>J^@jg%DXv z35-K4J3E^jUy4;d6)zn~V!#U=)Yk9^i^^>*EiDn)bYKY8?Cfk@TpTw8Mo>gVM4X?W zOXSL%H|5yG!~{*ey}cb98;d=}lSO=dJg#h^LNq2MB#@Z^ICUfv93l8ggz7bw=NOHp zN{+!eJUqO$wY99Q%+Ah^`T`Uc6;W<{{P>ZpP^{pfA}s-wIEYMcDKHrTNODZZ_}4my z@WXi^Gr@n2=g*%Lp}Dy^GQi=4#3PjippGL;0^CO8*iD6^mzUSZ#s*FTJhV#|+t${W zn4w}MTv}SnU&|yVCE+$BEsp-6pdf0h2d=qeZ~$43EJB`?l$6kNwzRZR<%%=|T~gK6 z)d`Bh!NDX1=G_U#+aYj_J4 z$#IH2d-e|FIeM=**tgMKcOifL3B9lBa zG7`@$)VvU6Wo3!J85tSeAS5J&v&ZgnE!85h;c|&%SIM#Y`FWa{Fdoma(j-TDft2X! z=^+URxQh!43i9*wg^-`-4Gj%c91Cq!R1|*;fZBx*r4m*#6fstLc{!e@a9QDyprQT! z{by!okO}GO=_JJ4e-uzS?sj)~*VorSfBsxiQStEMLoxus6^EJ~1_C|hM45o?q5E#fZrwv~_RM^^_qf}ne=knd^exMr>a{dL9$3$RZVNidL@bN>0`k2~(>eg0V^!1A|FzGiEb?OeZ`In%_A=lBK9^jUT@=UUd* z*I#$t%<)<}>9NJ(hZjEY`B}3sMsKl(*RG^A6RE^EKlD6bJgVC--L`PmtGw;bS4(5F z*ux_{^yPS;#;w2pwoLc*t@qzI>3q&sGUh+xc==_Cja<3aTmznq=TeL`#k#*%$=<)2 zbL=AMcn8=> z#o1n|$b6#sp~5E4V6q|i)O`o^>nGO#$c(rC^YAZo(NPwAxuDF)p!o1~^>bP0l+XkK D>>tv~ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed2@2x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed2@2x.png deleted file mode 100644 index a20348d5ce72e78526564968c1cac76c9ef73eb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 928 zcmV;R17G}!P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91AOHXW0K3=wjsO4y3Q0skR9Fe^S3gKQ3c|r%H_bt4ZKoPHet+)0b93Ln|EL2#pD&-!HyVu}Gy1^_hOqrilj8CC zXf&G9NZ#2DheMca8xw8MGv~g$)M7(a}+-)8S~XR`dJ)6wPL{;IFT*#im9g5s=T%&r3^7T!ZDz zOa@X7mE;hCUaz;gxrssa`+Z^#4i2b*%jN2JyF_|C9quJWpA~A+VX*V}F zU=|k_E0qc{x3{;kSd4JJUdOT%>#5Dfs2oqDNvG44mP{te#o=(gy}c1hr+mBJUSD5V z)R@LxA(@+~35UaUls`Q^Su7UThe9FN0_^PUaEJjXFe8G`Y{+OddUke(&5Rig27~Ad zI~t8f#sK1u6M4;e%uS?HDT+QmK4NK$)>zA}R*SU&m@>E9E#?4of`T7+Db*}2ES#L2 zQ0VUNZgq84w7{w_m&+8ry1L?L*8TmxqHR)h(Mp2V8Z`gn;(~azVSj&r@Aq$acNZrD zEU>gG`ttIERfSXg_4SpQ)6-M2hT2?=%CTC5&BCMtG@DJc**q8wz+-a-0s%4w;5RCp z&Bm2j&dg+>)?h}8#UdBr1TeW=4vusP9UdNv?sySH=EK7Srki=zGBX)`LW4P#zN?@& ziihiXbNSl^G&Jg&?OUM<U;H6}6%4g~08O>TzLWlC2Yvz-rqSokxjpOv0000Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91FaQ7m09ljm;Q#;y7)eAyRA>e5T1hCbUl=#fL#9k6 zLu86X$x0HTP=;6_E3zPkh(s3Lh_JFj6e0^27BVNHY!tDOxx~s)#<>6Azfd_CdMCQ28~ZNLu? z4<{!lOG`_4cX!(8k>2a>?mjRu@cR1t^Dq6tG#r2%(*FG!H#|K2?Ck6>Mf8hVxB+MW zEDCWKlJrHQVj;pA-P8>S;FqL*fdyO=)350o-Gbh$mzS6N`g(6~Z%y@RgNHd7g=wBr zxCFZ3y12NYBOe_dU0z<|RtWlie0-do zoDL5U1wLPTczAevdhYM5P&~PpNl{!z(8tjd3iZ8F%dP)&(EhZprNq?+1S`f@fQ~t{5jju&_G2( zb2oHg2?+_@o4vg~bOoMcTqiC9;pOE85z2zwMfrn+gWyL*M9{$km($+fo~z;n-KgJ+ z!O@wS84NgETU)-qzT5*4!pOoagRXdUb3y>1V?gLPFlLhW zJ?;d01NY{>jNnF47}`#Lzr_#!_~6_Ve>I-!(TkhZ8Go1ZQ=1m17vO zxw&a+X(=G-lHv_fF>1T0sAzh6+S=NhG10*b3kz}ZCB+XG@JLR#Q{M z<_4D9m6a6-2M0-4y1Tn+`Z?X#*C&Z*Ob!E~STPwr|BF5u7?R!D*+~u0&d%D{*hp$m zOG~5i(_NtP43yjjCPf+|Fx-C3P1Gu$PU`oHxr+h!`uduK@u;Y)tD|w^9b0g4uw-m} z7YMxvhEWymftvjBD0 zJ|zuF!!#WD{G6qFvCaaJ|BYVq-ToayK47ENm;qx3ewTs&0K-bJ=JWPs(EtDd07*qo IM6N<$f+5DGlK=n! diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 1dfb10eb9..0f027b85f 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -3552,8 +3552,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_voice_speed_slow" = "Slow"; "lng_voice_speed_normal" = "Normal"; +"lng_voice_speed_medium" = "Medium"; "lng_voice_speed_fast" = "Fast"; "lng_voice_speed_very_fast" = "Very fast"; +"lng_voice_speed_super_fast" = "Super fast"; "lng_view_button_user" = "View user"; "lng_view_button_bot" = "View bot"; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 2a312bb4a..2af5b16d2 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -3193,6 +3193,9 @@ void HistoryItem::createComponents(const MTPDmessage &data) { } } const auto id = data.vreply_to_msg_id().v; + if (data.is_reply_to_scheduled()) { + int a = 0; + } config.replyTo = data.is_reply_to_scheduled() ? _history->owner().scheduledMessages().localMessageId(id) : id; diff --git a/Telegram/SourceFiles/media/audio/media_audio.cpp b/Telegram/SourceFiles/media/audio/media_audio.cpp index ac098e396..ee5303374 100644 --- a/Telegram/SourceFiles/media/audio/media_audio.cpp +++ b/Telegram/SourceFiles/media/audio/media_audio.cpp @@ -491,7 +491,7 @@ void Mixer::Track::updateWithSpeedPosition() { int64 Mixer::Track::SpeedIndependentPosition( int64 position, float64 speed) { - Expects(speed < 2.5); + Expects(speed <= Audio::kSpeedMax); return int64(base::SafeRound(position * speed)); } @@ -499,7 +499,7 @@ int64 Mixer::Track::SpeedIndependentPosition( int64 Mixer::Track::SpeedDependentPosition( int64 position, float64 speed) { - Expects(speed >= 0.5); + Expects(speed >= Audio::kSpeedMin); return int64(base::SafeRound(position / speed)); } diff --git a/Telegram/SourceFiles/media/player/media_player.style b/Telegram/SourceFiles/media/player/media_player.style index fb4f989f8..f26a53945 100644 --- a/Telegram/SourceFiles/media/player/media_player.style +++ b/Telegram/SourceFiles/media/player/media_player.style @@ -10,6 +10,50 @@ using "ui/basic.style"; using "ui/widgets/widgets.style"; using "overview/overview.style"; +MediaPlayerButton { + playPosition: point; + playOuter: size; + pausePosition: point; + pauseOuter: size; + pauseStroke: pixels; + cancelPosition: point; + cancelOuter: size; + cancelStroke: pixels; + + rippleAreaPosition: point; + rippleAreaSize: pixels; + ripple: RippleAnimation; + + duration: int; +} + +MediaSpeedButton { + width: pixels; + height: pixels; + font: font; + icon: icon; +} + +MediaSpeedMenu { + menu: Menu; + iconFg: color; + iconFgActive: color; + textFgActive: color; + activeCheck: icon; + activeCheckSkip: pixels; + sliderStyle: TextStyle; + sliderPadding: margins; + sliderWidth: pixels; + slider: MediaSlider; +} + +mediaSpeedButton: MediaSpeedButton { + width: 24px; + height: 24px; + font: font(11px semibold); + icon: icon{{ "player/player_speed", menuIconFg }}; +} + mediaPlayerButton: MediaPlayerButton { playPosition: point(2px, 0px); playOuter: size(17px, 15px); @@ -25,6 +69,8 @@ mediaPlayerButton: MediaPlayerButton { ripple: RippleAnimation(defaultRippleAnimation) { color: lightButtonBgOver; } + + duration: 200; } mediaPlayerWideWidth: 460px; mediaPlayerHeight: 35px; @@ -96,59 +142,64 @@ mediaPlayerCancelIcon: icon{ { "player/panel_close", mediaPlayerActiveFg } }; -mediaPlayerSpeedButton: IconButton { - width: 31px; - height: 30px; - - icon: icon { - { "player/voice_speed/voice_speed2", mediaPlayerActiveFg } - }; - iconPosition: point(3px, 10px); - - rippleAreaPosition: point(3px, 5px); - rippleAreaSize: 25px; - ripple: RippleAnimation(defaultRippleAnimation) { - color: lightButtonBgOver; - } +mediaPlayerSpeedSize: size(30px, 30px); +mediaPlayerSpeedRadius: 4px; +mediaPlayerSpeedRipple: RippleAnimation(defaultRippleAnimation) { + color: lightButtonBgOver; } -mediaPlayerSpeedDisabledIcon: icon { - { "player/voice_speed/voice_speed2", menuIconFg } -}; -mediaPlayerSpeedDisabledIconOver: icon { - { "player/voice_speed/voice_speed2", menuIconFgOver } -}; -mediaPlayerSpeedSlowIcon: icon { - { "player/voice_speed/voice_speed0.5", mediaPlayerActiveFg } -}; -mediaPlayerSpeedSlowDisabledIcon: icon { - { "player/voice_speed/voice_speed0.5", menuIconFg } -}; -mediaPlayerSpeedSlowDisabledIconOver: icon { - { "player/voice_speed/voice_speed0.5", menuIconFgOver } -}; -mediaPlayerSpeedFastIcon: icon { - { "player/voice_speed/voice_speed1.5", mediaPlayerActiveFg } -}; -mediaPlayerSpeedFastDisabledIcon: icon { - { "player/voice_speed/voice_speed1.5", menuIconFg } -}; -mediaPlayerSpeedFastDisabledIconOver: icon { - { "player/voice_speed/voice_speed1.5", menuIconFgOver } -}; mediaPlayerSpeedDisabledRippleBg: windowBgOver; mediaPlayerMenu: DropdownMenu(defaultDropdownMenu) { wrap: InnerDropdown(defaultInnerDropdown) { - scrollPadding: margins(0px, 8px, 0px, 8px); + scrollPadding: margins(0px, 4px, 0px, 4px); padding: margins(10px, 2px, 10px, 10px); } } -mediaPlayerSpeedMenu: Menu(defaultMenu) { - itemIconPosition: point(6px, 5px); - itemPadding: margins(34px, 8px, 17px, 7px); -} mediaPlayerMenuCheck: icon {{ "player/player_check", mediaPlayerActiveFg }}; +mediaSpeedMenu: MediaSpeedMenu { + menu: Menu(menuWithIcons) { + separator: MenuSeparator(defaultMenuSeparator) { + padding: margins(0px, 4px, 0px, 4px); + width: 6px; + } + itemPadding: margins(54px, 7px, 54px, 9px); + itemFgDisabled: mediaPlayerActiveFg; + } + iconFg: menuIconColor; + iconFgActive: mediaPlayerActiveFg; + textFgActive: mediaPlayerActiveFg; + activeCheck: mediaPlayerMenuCheck; + activeCheckSkip: 8px; + sliderStyle: TextStyle(defaultTextStyle) { + font: font(12px semibold); + } + sliderPadding: margins(50px, 8px, 12px, 8px); + sliderWidth: 122px; + slider: MediaSlider(defaultContinuousSlider) { + activeFg: mediaPlayerActiveFg; + inactiveFg: windowBgOver; + activeFgOver: mediaPlayerActiveFg; + inactiveFgOver: windowBgOver; + activeFgDisabled: windowBgOver; + receivedTillFg: windowBgOver; + width: 6px; + seekSize: size(6px, 6px); + } +} +mediaSpeedSlow: icon {{ "player/speed/audiospeed_menu_0.5", menuIconColor }}; +mediaSpeedSlowActive: icon {{ "player/speed/audiospeed_menu_0.5", mediaPlayerActiveFg }}; +mediaSpeedNormal: icon {{ "player/speed/audiospeed_menu_1.0", menuIconColor }}; +mediaSpeedNormalActive: icon {{ "player/speed/audiospeed_menu_1.0", mediaPlayerActiveFg }}; +mediaSpeedMedium: icon {{ "player/speed/audiospeed_menu_1.2", menuIconColor }}; +mediaSpeedMediumActive: icon {{ "player/speed/audiospeed_menu_1.2", mediaPlayerActiveFg }}; +mediaSpeedFast: icon {{ "player/speed/audiospeed_menu_1.5", menuIconColor }}; +mediaSpeedFastActive: icon {{ "player/speed/audiospeed_menu_1.5", mediaPlayerActiveFg }}; +mediaSpeedVeryFast: icon {{ "player/speed/audiospeed_menu_1.7", menuIconColor }}; +mediaSpeedVeryFastActive: icon {{ "player/speed/audiospeed_menu_1.7", mediaPlayerActiveFg }}; +mediaSpeedSuperFast: icon {{ "player/speed/audiospeed_menu_2.0", menuIconColor }}; +mediaSpeedSuperFastActive: icon {{ "player/speed/audiospeed_menu_2.0", mediaPlayerActiveFg }}; + mediaPlayerVolumeIcon0: icon { { "player/player_mini_off", mediaPlayerActiveFg }, }; @@ -211,8 +262,6 @@ mediaPlayerPlayback: FilledSlider { duration: 150; } -mediaPlayerButtonTransformDuration: 200; - mediaPlayerPanelMarginLeft: 10px; mediaPlayerPanelMarginBottom: 10px; mediaPlayerPanelWidth: 344px; diff --git a/Telegram/SourceFiles/media/player/media_player_button.cpp b/Telegram/SourceFiles/media/player/media_player_button.cpp index c646727c0..a8e059599 100644 --- a/Telegram/SourceFiles/media/player/media_player_button.cpp +++ b/Telegram/SourceFiles/media/player/media_player_button.cpp @@ -8,18 +8,30 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "media/player/media_player_button.h" #include "ui/painter.h" -#include "styles/style_widgets.h" +#include "styles/style_media_player.h" -namespace Media { -namespace Player { +#include -PlayButtonLayout::PlayButtonLayout(const style::MediaPlayerButton &st, Fn callback) +namespace Media::Player { +namespace { + +[[nodiscard]] QString SpeedText(float64 speed) { + return QString::number(base::SafeRound(speed * 10) / 10.) + 'X'; +} + +} // namespace + +PlayButtonLayout::PlayButtonLayout( + const style::MediaPlayerButton &st, + Fn callback) : _st(st) , _callback(std::move(callback)) { } void PlayButtonLayout::setState(State state) { - if (_nextState == state) return; + if (_nextState == state) { + return; + } _nextState = state; if (!_transformProgress.animating()) { @@ -238,8 +250,95 @@ void PlayButtonLayout::animationCallback() { } void PlayButtonLayout::startTransform(float64 from, float64 to) { - _transformProgress.start([this] { animationCallback(); }, from, to, st::mediaPlayerButtonTransformDuration); + _transformProgress.start( + [=] { animationCallback(); }, + from, + to, + _st.duration); } -} // namespace Player -} // namespace Media +SpeedButtonLayout::SpeedButtonLayout( + const style::MediaSpeedButton &st, + Fn callback, + float64 speed) +: _st(st) +, _speed(speed) +, _oldSpeed(speed) +, _nextSpeed(speed) +, _metrics(_st.font->f) +, _text(SpeedText(speed)) +, _textWidth(_metrics.horizontalAdvance(_text)) +, _oldText(_text) +, _oldTextWidth(_textWidth) +, _callback(std::move(callback)) { +} + +void SpeedButtonLayout::setSpeed(float64 speed) { + speed = base::SafeRound(speed * 10.) / 10.; + if (_nextSpeed == speed) { + return; + } + + _nextSpeed = speed; + if (!_transformProgress.animating()) { + _oldSpeed = _speed; + _oldColor = _lastPaintColor; + _oldText = _text; + _oldTextWidth = _textWidth; + _speed = _nextSpeed; + _text = SpeedText(_speed); + _textWidth = _metrics.horizontalAdvance(_text); + _transformBackward = false; + if (_speed != _speed) { + startTransform(0., 1.); + if (_callback) _callback(); + } + } else if (_oldSpeed == _nextSpeed) { + std::swap(_oldSpeed, _speed); + std::swap(_oldColor, _lastPaintColor); + std::swap(_oldText, _text); + std::swap(_oldTextWidth, _textWidth); + startTransform( + _transformBackward ? 0. : 1., + _transformBackward ? 1. : 0.); + _transformBackward = !_transformBackward; + } +} + +void SpeedButtonLayout::finishTransform() { + _transformProgress.stop(); + _transformBackward = false; + if (_callback) _callback(); +} + +void SpeedButtonLayout::paint(QPainter &p, const QColor &color) { + _lastPaintColor = color; + + _st.icon.paint(p, 0, 0, _st.width, color); + + p.setPen(color); + p.setFont(_st.font); + + p.drawText( + QPointF( + (_st.width - _textWidth) / 2., + (_st.height - _metrics.height()) / 2. + _metrics.ascent()), + _text); +} + +void SpeedButtonLayout::animationCallback() { + if (!_transformProgress.animating()) { + const auto finalSpeed = _nextSpeed; + _nextSpeed = _speed; + setSpeed(finalSpeed); + } + _callback(); +} + +void SpeedButtonLayout::startTransform(float64 from, float64 to) { + // No animation for now. + _transformProgress.stop(); + animationCallback(); +} + +} // namespace Media::Player diff --git a/Telegram/SourceFiles/media/player/media_player_button.h b/Telegram/SourceFiles/media/player/media_player_button.h index 74e448563..22e2d6be4 100644 --- a/Telegram/SourceFiles/media/player/media_player_button.h +++ b/Telegram/SourceFiles/media/player/media_player_button.h @@ -7,12 +7,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once -#include "ui/abstract_button.h" #include "ui/effects/animations.h" -#include "styles/style_media_player.h" -namespace Media { -namespace Player { +#include + +namespace style { +struct MediaPlayerButton; +struct MediaSpeedButton; +} // namespace style + +namespace Media::Player { class PlayButtonLayout { public: @@ -48,5 +52,40 @@ private: }; -} // namespace Player -} // namespace Media +class SpeedButtonLayout { +public: + SpeedButtonLayout( + const style::MediaSpeedButton &st, + Fn callback, + float64 speed); + + void setSpeed(float64 speed); + void finishTransform(); + void paint(QPainter &p, const QColor &color); + +private: + void animationCallback(); + void startTransform(float64 from, float64 to); + + const style::MediaSpeedButton &_st; + + float64 _speed = 1.; + float64 _oldSpeed = 1.; + float64 _nextSpeed = 1.; + std::optional _lastPaintColor; + std::optional _oldColor; + Ui::Animations::Simple _transformProgress; + bool _transformBackward = false; + + QFontMetricsF _metrics; + + QString _text; + float64 _textWidth = 0; + QString _oldText; + float64 _oldTextWidth = 0; + + Fn _callback; + +}; + +} // namespace Media::Player diff --git a/Telegram/SourceFiles/media/player/media_player_dropdown.cpp b/Telegram/SourceFiles/media/player/media_player_dropdown.cpp index 71aa31d11..73afd0dcb 100644 --- a/Telegram/SourceFiles/media/player/media_player_dropdown.cpp +++ b/Telegram/SourceFiles/media/player/media_player_dropdown.cpp @@ -7,12 +7,213 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "media/player/media_player_dropdown.h" +#include "base/timer.h" +#include "lang/lang_keys.h" #include "ui/cached_round_corners.h" +#include "ui/widgets/menu/menu.h" +#include "ui/widgets/menu/menu_action.h" +#include "ui/widgets/continuous_sliders.h" #include "ui/widgets/shadow.h" +#include "ui/painter.h" #include "styles/style_media_player.h" #include "styles/style_widgets.h" +#include "base/debug_log.h" + namespace Media::Player { +namespace { + +constexpr auto kSpeedMin = 0.5; +constexpr auto kSpeedMax = 2.5; +constexpr auto kSpeedDebounceTimeout = crl::time(1000); + +[[nodiscard]] float64 SpeedToSliderValue(float64 speed) { + return (speed - kSpeedMin) / (kSpeedMax - kSpeedMin); +} + +[[nodiscard]] float64 SliderValueToSpeed(float64 value) { + const auto speed = value * (kSpeedMax - kSpeedMin) + kSpeedMin; + return base::SafeRound(speed * 10) / 10.; +} + +constexpr auto kSpeedStickedValues = + std::array, 7>{{ + { 0.8, 0.05 }, + { 1.0, 0.05 }, + { 1.2, 0.05 }, + { 1.5, 0.05 }, + { 1.7, 0.05 }, + { 2.0, 0.05 }, + { 2.2, 0.05 }, + }}; + +class SpeedSliderItem final : public Ui::Menu::ItemBase { +public: + SpeedSliderItem( + not_null parent, + const style::MediaSpeedMenu &st, + rpl::producer value); + + not_null action() const override; + bool isEnabled() const override; + + [[nodiscard]] float64 current() const; + [[nodiscard]] rpl::producer changing() const; + [[nodiscard]] rpl::producer changed() const; + [[nodiscard]] rpl::producer debouncedChanges() const; + +protected: + int contentHeight() const override; + +private: + void setExternalValue(float64 speed); + void setSliderValue(float64 speed); + + const base::unique_qptr _slider; + const not_null _dummyAction; + const style::MediaSpeedMenu &_st; + Ui::Text::String _text; + int _height = 0; + + rpl::event_stream _changing; + rpl::event_stream _changed; + rpl::event_stream _debounced; + base::Timer _debounceTimer; + rpl::variable _last = 0.; + +}; + +SpeedSliderItem::SpeedSliderItem( + not_null parent, + const style::MediaSpeedMenu &st, + rpl::producer value) +: Ui::Menu::ItemBase(parent, st.menu) +, _slider(base::make_unique_q(this, st.slider)) +, _dummyAction(new QAction(parent)) +, _st(st) +, _height(st.sliderPadding.top() + + st.menu.itemStyle.font->height + + st.sliderPadding.bottom()) +, _debounceTimer([=] { _debounced.fire(current()); }) { + initResizeHook(parent->sizeValue()); + enableMouseSelecting(); + enableMouseSelecting(_slider.get()); + + setMinWidth(st.sliderPadding.left() + + st.sliderWidth + + st.sliderPadding.right()); + _slider->setAlwaysDisplayMarker(true); + + sizeValue( + ) | rpl::start_with_next([=](const QSize &size) { + const auto geometry = QRect(QPoint(), size); + const auto padding = _st.sliderPadding; + const auto inner = geometry - padding; + _slider->setGeometry( + padding.left(), + inner.y(), + (geometry.width() - padding.left() - padding.right()), + inner.height()); + }, lifetime()); + + paintRequest( + ) | rpl::start_with_next([=](const QRect &clip) { + auto p = Painter(this); + + p.fillRect(clip, _st.menu.itemBg); + + const auto left = (_st.sliderPadding.left() - _text.maxWidth()) / 2; + const auto top = _st.menu.itemPadding.top(); + p.setPen(_st.menu.itemFg); + _text.drawLeftElided(p, left, top, _text.maxWidth(), width()); + }, lifetime()); + + _slider->setChangeProgressCallback([=](float64 value) { + const auto speed = SliderValueToSpeed(value); + if (current() != speed) { + _last = speed; + _changing.fire_copy(speed); + _debounceTimer.callOnce(kSpeedDebounceTimeout); + } + }); + + _slider->setChangeFinishedCallback([=](float64 value) { + const auto speed = SliderValueToSpeed(value); + _last = speed; + _changed.fire_copy(speed); + _debounced.fire_copy(speed); + _debounceTimer.cancel(); + }); + + std::move( + value + ) | rpl::start_with_next([=](float64 external) { + setExternalValue(external); + }, lifetime()); + + _last.value( + ) | rpl::start_with_next([=](float64 value) { + const auto text = QString::number(value, 'f', 1) + 'x'; + if (_text.toString() != text) { + _text.setText(_st.sliderStyle, text); + update(); + } + }, lifetime()); + + _slider->setAdjustCallback([=](float64 value) { + const auto speed = SliderValueToSpeed(value); + for (const auto &snap : kSpeedStickedValues) { + if (speed > (snap.first - snap.second) + && speed < (snap.first + snap.second)) { + return SpeedToSliderValue(snap.first); + } + } + return value; + }); +} + +void SpeedSliderItem::setExternalValue(float64 speed) { + if (!_slider->isChanging()) { + setSliderValue(speed); + } +} + +void SpeedSliderItem::setSliderValue(float64 speed) { + const auto value = SpeedToSliderValue(speed); + _slider->setValue(value); + _last = speed; + _changed.fire_copy(speed); +} + +not_null SpeedSliderItem::action() const { + return _dummyAction; +} + +bool SpeedSliderItem::isEnabled() const { + return false; +} + +int SpeedSliderItem::contentHeight() const { + return _height; +} + +float64 SpeedSliderItem::current() const { + return _last.current(); +} + +rpl::producer SpeedSliderItem::changing() const { + return _changing.events(); +} + +rpl::producer SpeedSliderItem::changed() const { + return _changed.events(); +} + +rpl::producer SpeedSliderItem::debouncedChanges() const { + return _debounced.events(); +} + +} // namespace Dropdown::Dropdown(QWidget *parent) : RpWidget(parent) @@ -178,4 +379,109 @@ bool Dropdown::eventFilter(QObject *obj, QEvent *e) { return false; } +void FillSpeedMenu( + not_null menu, + const style::MediaSpeedMenu &st, + rpl::producer value, + Fn callback) { + auto slider = base::make_unique_q( + menu, + st, + rpl::duplicate(value)); + + slider->debouncedChanges( + ) | rpl::start_with_next(callback, slider->lifetime()); + + struct State { + rpl::variable realtime; + }; + const auto state = slider->lifetime().make_state(); + state->realtime = rpl::single( + slider->current() + ) | rpl::then(rpl::merge( + slider->changing(), + slider->changed() + )); + + menu->addAction(std::move(slider)); + menu->addSeparator(&st.menu.separator); + + struct SpeedPoint { + float64 speed = 0.; + tr::phrase<> text; + const style::icon &icon; + const style::icon &iconActive; + }; + const auto points = std::vector{ + { + 0.5, + tr::lng_voice_speed_slow, + st::mediaSpeedSlow, + st::mediaSpeedSlowActive }, + { + 1.0, + tr::lng_voice_speed_normal, + st::mediaSpeedNormal, + st::mediaSpeedNormalActive }, + { + 1.2, + tr::lng_voice_speed_medium, + st::mediaSpeedMedium, + st::mediaSpeedMediumActive }, + { + 1.5, + tr::lng_voice_speed_fast, + st::mediaSpeedFast, + st::mediaSpeedFastActive }, + { + 1.7, + tr::lng_voice_speed_very_fast, + st::mediaSpeedVeryFast, + st::mediaSpeedVeryFastActive }, + { + 2.0, + tr::lng_voice_speed_super_fast, + st::mediaSpeedSuperFast, + st::mediaSpeedSuperFastActive }, + }; + for (const auto &point : points) { + const auto speed = point.speed; + const auto text = point.text(tr::now); + const auto icon = &point.icon; + const auto iconActive = &point.iconActive; + auto action = base::make_unique_q( + menu, + st::mediaSpeedMenu.menu, + Ui::Menu::CreateAction(menu, text, [=] { callback(speed); }), + &point.icon, + &point.icon); + const auto raw = action.get(); + const auto check = Ui::CreateChild(raw); + const auto skip = st.activeCheckSkip; + check->resize(st.activeCheck.size()); + check->paintRequest( + ) | rpl::start_with_next([check, icon = &st.activeCheck] { + auto p = QPainter(check); + icon->paint(p, 0, 0, check->width()); + }, check->lifetime()); + raw->sizeValue( + ) | rpl::start_with_next([=, skip = st.activeCheckSkip](QSize size) { + check->moveToRight( + skip, + (size.height() - check->height()) / 2, + size.width()); + }, check->lifetime()); + check->setAttribute(Qt::WA_TransparentForMouseEvents); + state->realtime.value( + ) | rpl::start_with_next([=](float64 now) { + const auto chosen = (speed == now); + const auto overriden = chosen ? iconActive : icon; + raw->setIcon(overriden, overriden); + raw->action()->setEnabled(!chosen); + check->setVisible(chosen); + }, raw->lifetime()); + menu->addAction(std::move(action)); + } +} + } // namespace Media::Player diff --git a/Telegram/SourceFiles/media/player/media_player_dropdown.h b/Telegram/SourceFiles/media/player/media_player_dropdown.h index 67e1dfe54..627c276aa 100644 --- a/Telegram/SourceFiles/media/player/media_player_dropdown.h +++ b/Telegram/SourceFiles/media/player/media_player_dropdown.h @@ -11,6 +11,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/animations.h" #include "base/timer.h" +namespace style { +struct MediaSpeedMenu; +} // namespace style + +namespace Ui::Menu { +class Menu; +} // namespace Ui::Menu + namespace Media::Player { class Dropdown final : public Ui::RpWidget { @@ -49,4 +57,10 @@ private: }; +void FillSpeedMenu( + not_null menu, + const style::MediaSpeedMenu &st, + rpl::producer value, + Fn callback); + } // namespace Media::Player diff --git a/Telegram/SourceFiles/media/player/media_player_widget.cpp b/Telegram/SourceFiles/media/player/media_player_widget.cpp index 9695b3f50..9740f893f 100644 --- a/Telegram/SourceFiles/media/player/media_player_widget.cpp +++ b/Telegram/SourceFiles/media/player/media_player_widget.cpp @@ -31,12 +31,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "media/player/media_player_instance.h" #include "media/player/media_player_dropdown.h" #include "media/player/media_player_volume_controller.h" -#include "styles/style_media_player.h" -#include "styles/style_media_view.h" #include "history/history_item.h" #include "history/history_item_helpers.h" #include "storage/storage_account.h" #include "main/main_session.h" +#include "styles/style_media_player.h" +#include "styles/style_media_view.h" +#include "styles/style_chat.h" // expandedMenuSeparator. namespace Media { namespace Player { @@ -44,12 +45,12 @@ namespace Player { class WithDropdownController { public: WithDropdownController( - not_null button, + not_null button, not_null menuParent, Fn menuOverCallback); virtual ~WithDropdownController() = default; - [[nodiscard]] not_null button() const; + [[nodiscard]] not_null button() const; Ui::DropdownMenu *menu() const; void updateDropdownGeometry(); @@ -63,7 +64,7 @@ protected: private: virtual void fillMenu(not_null menu) = 0; - const not_null _button; + const not_null _button; const not_null _menuParent; const Fn _menuOverCallback; base::unique_qptr _menu; @@ -72,6 +73,24 @@ private: }; +class Widget::SpeedButton final : public Ui::RippleButton { +public: + SpeedButton(QWidget *parent); + + void setSpeed(float64 speed, anim::type animated = anim::type::normal); + +private: + void paintEvent(QPaintEvent *e) override; + + QImage prepareRippleMask() const override; + QPoint prepareRippleStartPosition() const override; + + SpeedButtonLayout _layout; + QPoint _layoutPosition; + bool _isDefault = false; + +}; + class Widget::OrderController final : public WithDropdownController { public: OrderController( @@ -83,12 +102,14 @@ private: void fillMenu(not_null menu) override; void updateIcon(); + const not_null _button; + }; class Widget::SpeedController final : public WithDropdownController { public: SpeedController( - not_null button, + not_null button, not_null menuParent, Fn menuOverCallback); @@ -96,7 +117,6 @@ public: private: void fillMenu(not_null menu) override; - void updateIcon(); [[nodiscard]] float64 speed() const; [[nodiscard]] bool isDefault() const; @@ -105,7 +125,7 @@ private: void setSpeed(float64 newSpeed); void save(); - float64 _speed = 2.; + float64 _speed = 1.7; bool _isDefault = true; rpl::event_stream _speedChanged; rpl::event_stream<> _saved; @@ -113,7 +133,7 @@ private: }; WithDropdownController::WithDropdownController( - not_null button, + not_null button, not_null menuParent, Fn menuOverCallback) : _button(button) @@ -135,7 +155,7 @@ WithDropdownController::WithDropdownController( }, button->lifetime()); } -not_null WithDropdownController::button() const { +not_null WithDropdownController::button() const { return _button; } @@ -199,11 +219,48 @@ void WithDropdownController::showMenu() { _menu->showAnimated(Ui::PanelAnimation::Origin::TopRight); } +Widget::SpeedButton::SpeedButton(QWidget *parent) +: RippleButton(parent, st::mediaPlayerSpeedRipple) +, _layout(st::mediaSpeedButton, [=] { update(); }, 2.) +, _isDefault(true) { + resize(st::mediaPlayerSpeedSize); + _layoutPosition = QPoint( + (st::mediaPlayerSpeedSize.width() - st::mediaSpeedButton.width) / 2, + st::mediaPlayerSpeedSize.height() - st::mediaSpeedButton.height); +} + +void Widget::SpeedButton::setSpeed(float64 speed, anim::type animated) { + _isDefault = (speed == 1.); + _layout.setSpeed(speed); + if (animated == anim::type::instant) { + _layout.finishTransform(); + } + update(); +} + +void Widget::SpeedButton::paintEvent(QPaintEvent *e) { + auto p = QPainter(this); + + paintRipple( + p, + QPoint(), + _isDefault ? &st::mediaPlayerSpeedDisabledRippleBg->c : nullptr); + + const auto &color = !_isDefault + ? st::mediaPlayerActiveFg + : isOver() + ? st::menuIconFgOver + : st::menuIconFg; + p.translate(_layoutPosition); + _layout.paint(p, color->c); +} + Widget::OrderController::OrderController( not_null button, not_null menuParent, Fn menuOverCallback) -: WithDropdownController(button, menuParent, std::move(menuOverCallback)) { +: WithDropdownController(button, menuParent, std::move(menuOverCallback)) +, _button(button) { button->setClickedCallback([=] { showMenu(); }); @@ -260,25 +317,25 @@ void Widget::OrderController::fillMenu(not_null menu) { void Widget::OrderController::updateIcon() { switch (Core::App().settings().playerOrderMode()) { case OrderMode::Default: - button()->setIconOverride( + _button->setIconOverride( &st::mediaPlayerReverseDisabledIcon, &st::mediaPlayerReverseDisabledIconOver); - button()->setRippleColorOverride( + _button->setRippleColorOverride( &st::mediaPlayerRepeatDisabledRippleBg); break; case OrderMode::Reverse: - button()->setIconOverride(&st::mediaPlayerReverseIcon); - button()->setRippleColorOverride(nullptr); + _button->setIconOverride(&st::mediaPlayerReverseIcon); + _button->setRippleColorOverride(nullptr); break; case OrderMode::Shuffle: - button()->setIconOverride(&st::mediaPlayerShuffleIcon); - button()->setRippleColorOverride(nullptr); + _button->setIconOverride(&st::mediaPlayerShuffleIcon); + _button->setRippleColorOverride(nullptr); break; } } Widget::SpeedController::SpeedController( - not_null button, + not_null button, not_null menuParent, Fn menuOverCallback) : WithDropdownController(button, menuParent, std::move(menuOverCallback)) { @@ -293,45 +350,15 @@ Widget::SpeedController::SpeedController( setSpeed(Core::App().settings().voicePlaybackSpeed()); _speed = Core::App().settings().voicePlaybackSpeed(true); + button->setSpeed(_speed, anim::type::instant); + _speedChanged.events_starting_with( speed() - ) | rpl::start_with_next([=] { - updateIcon(); + ) | rpl::start_with_next([=](float64 speed) { + button->setSpeed(speed); }, button->lifetime()); } -void Widget::SpeedController::updateIcon() { - const auto isDefaultSpeed = isDefault(); - const auto nonDefaultSpeed = lastNonDefaultSpeed(); - - if (nonDefaultSpeed == .5) { - button()->setIconOverride( - (isDefaultSpeed - ? &st::mediaPlayerSpeedSlowDisabledIcon - : &st::mediaPlayerSpeedSlowIcon), - (isDefaultSpeed - ? &st::mediaPlayerSpeedSlowDisabledIconOver - : &st::mediaPlayerSpeedSlowIcon)); - } else if (nonDefaultSpeed == 1.5) { - button()->setIconOverride( - (isDefaultSpeed - ? &st::mediaPlayerSpeedFastDisabledIcon - : &st::mediaPlayerSpeedFastIcon), - (isDefaultSpeed - ? &st::mediaPlayerSpeedFastDisabledIconOver - : &st::mediaPlayerSpeedFastIcon)); - } else { - button()->setIconOverride( - isDefaultSpeed ? &st::mediaPlayerSpeedDisabledIcon : nullptr, - (isDefaultSpeed - ? &st::mediaPlayerSpeedDisabledIconOver - : nullptr)); - } - button()->setRippleColorOverride(isDefaultSpeed - ? &st::mediaPlayerSpeedDisabledRippleBg - : nullptr); -} - rpl::producer<> Widget::SpeedController::saved() const { return _saved.events(); } @@ -367,35 +394,11 @@ void Widget::SpeedController::save() { } void Widget::SpeedController::fillMenu(not_null menu) { - const auto currentSpeed = speed(); - const auto addSpeedAction = [&](float64 speed, QString text) { - const auto callback = [=] { - setSpeed(speed); - save(); - }; - const auto icon = (speed == currentSpeed) - ? &st::mediaPlayerMenuCheck - : nullptr; - auto action = base::make_unique_q( - menu, - st::mediaPlayerSpeedMenu, - Ui::Menu::CreateAction(menu, text, callback), - icon, - icon); - const auto raw = action.get(); - _speedChanged.events( - ) | rpl::start_with_next([=](float64 updatedSpeed) { - const auto icon = (speed == updatedSpeed) - ? &st::mediaPlayerMenuCheck - : nullptr; - raw->setIcon(icon, icon); - }, raw->lifetime()); - menu->addAction(std::move(action)); - }; - addSpeedAction(0.5, tr::lng_voice_speed_slow(tr::now)); - addSpeedAction(1., tr::lng_voice_speed_normal(tr::now)); - addSpeedAction(1.5, tr::lng_voice_speed_fast(tr::now)); - addSpeedAction(2., tr::lng_voice_speed_very_fast(tr::now)); + FillSpeedMenu( + menu->menu(), + st::mediaSpeedMenu, + _speedChanged.events_starting_with(speed()), + [=](float64 speed) { setSpeed(speed); save(); }); } Widget::Widget( @@ -412,7 +415,7 @@ Widget::Widget( , _volumeToggle(rightControls(), st::mediaPlayerVolumeToggle) , _repeatToggle(rightControls(), st::mediaPlayerRepeatButton) , _orderToggle(rightControls(), st::mediaPlayerRepeatButton) -, _speedToggle(rightControls(), st::mediaPlayerSpeedButton) +, _speedToggle(rightControls()) , _close(this, st::mediaPlayerClose) , _shadow(this) , _playbackSlider(this, st::mediaPlayerPlayback) diff --git a/Telegram/SourceFiles/media/player/media_player_widget.h b/Telegram/SourceFiles/media/player/media_player_widget.h index 4d0de3959..e38e8ecc6 100644 --- a/Telegram/SourceFiles/media/player/media_player_widget.h +++ b/Telegram/SourceFiles/media/player/media_player_widget.h @@ -23,21 +23,16 @@ template class FadeWrap; } // namespace Ui -namespace Media { -namespace View { +namespace Media::View { class PlaybackProgress; -} // namespace Clip -} // namespace Media +} // namespace Media::View namespace Window { class SessionController; } // namespace Window -namespace Media { -namespace Player { +namespace Media::Player { -class PlayButton; -class SpeedButton; class Dropdown; struct TrackState; @@ -47,6 +42,7 @@ public: QWidget *parent, not_null dropdownsParent, not_null controller); + ~Widget(); void setCloseCallback(Fn callback); void setShowItemCallback(Fn)> callback); @@ -61,8 +57,6 @@ public: return _togglePlaylistRequests.events(); } - ~Widget(); - private: void resizeEvent(QResizeEvent *e) override; void paintEvent(QPaintEvent *e) override; @@ -134,7 +128,7 @@ private: bool _wontBeOver = false; bool _volumeHidden = false; - class PlayButton; + class SpeedButton; class OrderController; class SpeedController; object_ptr _nameLabel; @@ -146,7 +140,7 @@ private: object_ptr _volumeToggle; object_ptr _repeatToggle; object_ptr _orderToggle; - object_ptr _speedToggle; + object_ptr _speedToggle; object_ptr _close; object_ptr _shadow = { nullptr }; object_ptr _playbackSlider; @@ -159,5 +153,4 @@ private: }; -} // namespace Player -} // namespace Media +} // namespace Media::Player diff --git a/Telegram/SourceFiles/media/streaming/media_streaming_player.cpp b/Telegram/SourceFiles/media/streaming/media_streaming_player.cpp index 316af0105..a5293cfea 100644 --- a/Telegram/SourceFiles/media/streaming/media_streaming_player.cpp +++ b/Telegram/SourceFiles/media/streaming/media_streaming_player.cpp @@ -528,7 +528,8 @@ void Player::fail(Error error) { } void Player::play(const PlaybackOptions &options) { - Expects(options.speed >= 0.5 && options.speed <= 2.); + Expects(options.speed >= Audio::kSpeedMin + && options.speed <= Audio::kSpeedMax); // Looping video with audio is not supported for now. Expects(!options.loop || (options.mode != Mode::Both)); @@ -828,7 +829,7 @@ float64 Player::speed() const { } void Player::setSpeed(float64 speed) { - Expects(speed >= 0.5 && speed <= 2.); + Expects(speed >= Audio::kSpeedMin && speed <= Audio::kSpeedMax); if (!Media::Audio::SupportsSpeedControl()) { speed = 1.; diff --git a/Telegram/SourceFiles/media/view/media_view_pip.cpp b/Telegram/SourceFiles/media/view/media_view_pip.cpp index e27dfa4a8..2df6538e4 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip.cpp +++ b/Telegram/SourceFiles/media/view/media_view_pip.cpp @@ -1093,9 +1093,6 @@ void Pip::handleMousePress(QPoint position, Qt::MouseButton button) { } void Pip::handleMouseRelease(QPoint position, Qt::MouseButton button) { - Expects(1 && _delegate->pipPlaybackSpeed() >= 0.5 - && _delegate->pipPlaybackSpeed() <= 2.); // Debugging strange crash. - const auto weak = Ui::MakeWeak(_panel.widget()); const auto guard = gsl::finally([&] { if (weak) { @@ -1107,21 +1104,11 @@ void Pip::handleMouseRelease(QPoint position, Qt::MouseButton button) { } seekUpdate(position); - Assert(2 && _delegate->pipPlaybackSpeed() >= 0.5 - && _delegate->pipPlaybackSpeed() <= 2.); // Debugging strange crash. - volumeControllerUpdate(position); - Assert(3 && _delegate->pipPlaybackSpeed() >= 0.5 - && _delegate->pipPlaybackSpeed() <= 2.); // Debugging strange crash. - const auto pressed = base::take(_pressed); if (pressed && *pressed == OverState::Playback) { _panel.setDragDisabled(false); - - Assert(4 && _delegate->pipPlaybackSpeed() >= 0.5 - && _delegate->pipPlaybackSpeed() <= 2.); // Debugging strange crash. - seekFinish(_playbackProgress->value()); } else if (pressed && *pressed == OverState::VolumeController) { _panel.setDragDisabled(false); @@ -1182,9 +1169,6 @@ void Pip::seekProgress(float64 value) { } void Pip::seekFinish(float64 value) { - Expects(5 && _delegate->pipPlaybackSpeed() >= 0.5 - && _delegate->pipPlaybackSpeed() <= 2.); // Debugging strange crash. - if (!_lastDurationMs) { return; } @@ -1671,31 +1655,18 @@ void Pip::playbackPauseResume() { } void Pip::restartAtSeekPosition(crl::time position) { - Expects(6 && _delegate->pipPlaybackSpeed() >= 0.5 - && _delegate->pipPlaybackSpeed() <= 2.); // Debugging strange crash. - if (!_instance.info().video.cover.isNull()) { _preparedCoverStorage = QImage(); _preparedCoverState = ThumbState::Empty; _instance.saveFrameToCover(); } - Assert(7 && _delegate->pipPlaybackSpeed() >= 0.5 - && _delegate->pipPlaybackSpeed() <= 2.); // Debugging strange crash. - auto options = Streaming::PlaybackOptions(); options.position = position; options.hwAllowed = Core::App().settings().hardwareAcceleratedVideo(); options.audioId = _instance.player().prepareLegacyState().id; - - Assert(8 && _delegate->pipPlaybackSpeed() >= 0.5 - && _delegate->pipPlaybackSpeed() <= 2.); // Debugging strange crash. - options.speed = _delegate->pipPlaybackSpeed(); - Assert(9 && options.speed >= 0.5 - && options.speed <= 2.); // Debugging strange crash. - _instance.play(options); if (_startPaused) { _instance.pause(); diff --git a/Telegram/cmake/td_ui.cmake b/Telegram/cmake/td_ui.cmake index b0e42190b..fea8a0e0c 100644 --- a/Telegram/cmake/td_ui.cmake +++ b/Telegram/cmake/td_ui.cmake @@ -120,6 +120,8 @@ PRIVATE media/clip/media_clip_reader.cpp media/clip/media_clip_reader.h + media/player/media_player_button.cpp + media/player/media_player_button.h media/player/media_player_dropdown.cpp media/player/media_player_dropdown.h diff --git a/Telegram/lib_ui b/Telegram/lib_ui index c80df2cdd..62a62d1fb 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit c80df2cdd2d2838d5e4aab50075e4f6e7c05e380 +Subproject commit 62a62d1fb5abe9dc1e6b9f89af1ccef6fef33c52