From e889a52f6f2c406cfcf2db9ff9877c7142911010 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 31 Jan 2020 12:54:57 +0300 Subject: [PATCH] Improve design of video player and PiP controls. --- Telegram/Resources/icons/player_check.png | Bin 0 -> 281 bytes Telegram/Resources/icons/player_check@2x.png | Bin 0 -> 476 bytes Telegram/Resources/icons/player_check@3x.png | Bin 0 -> 695 bytes .../Resources/icons/player_fullscreen.png | Bin 0 -> 359 bytes .../Resources/icons/player_fullscreen@2x.png | Bin 0 -> 639 bytes .../Resources/icons/player_fullscreen@3x.png | Bin 0 -> 919 bytes Telegram/Resources/icons/player_minimize.png | Bin 0 -> 341 bytes .../Resources/icons/player_minimize@2x.png | Bin 0 -> 594 bytes .../Resources/icons/player_minimize@3x.png | Bin 0 -> 879 bytes Telegram/Resources/icons/player_more.png | Bin 0 -> 183 bytes Telegram/Resources/icons/player_more@2x.png | Bin 0 -> 361 bytes Telegram/Resources/icons/player_more@3x.png | Bin 0 -> 566 bytes Telegram/Resources/icons/player_pause.png | Bin 0 -> 215 bytes Telegram/Resources/icons/player_pause@2x.png | Bin 0 -> 400 bytes Telegram/Resources/icons/player_pause@3x.png | Bin 0 -> 593 bytes Telegram/Resources/icons/player_pip.png | Bin 0 -> 319 bytes Telegram/Resources/icons/player_pip@2x.png | Bin 0 -> 530 bytes Telegram/Resources/icons/player_pip@3x.png | Bin 0 -> 877 bytes Telegram/Resources/icons/player_pip_close.png | Bin 0 -> 253 bytes .../Resources/icons/player_pip_close@2x.png | Bin 0 -> 427 bytes .../Resources/icons/player_pip_close@3x.png | Bin 0 -> 747 bytes .../Resources/icons/player_pip_enlarge.png | Bin 0 -> 361 bytes .../Resources/icons/player_pip_enlarge@2x.png | Bin 0 -> 574 bytes .../Resources/icons/player_pip_enlarge@3x.png | Bin 0 -> 845 bytes Telegram/Resources/icons/player_pip_pause.png | Bin 0 -> 242 bytes .../Resources/icons/player_pip_pause@2x.png | Bin 0 -> 452 bytes .../Resources/icons/player_pip_pause@3x.png | Bin 0 -> 662 bytes Telegram/Resources/icons/player_pip_play.png | Bin 0 -> 334 bytes .../Resources/icons/player_pip_play@2x.png | Bin 0 -> 631 bytes .../Resources/icons/player_pip_play@3x.png | Bin 0 -> 1417 bytes Telegram/Resources/icons/player_play.png | Bin 0 -> 362 bytes Telegram/Resources/icons/player_play@2x.png | Bin 0 -> 659 bytes Telegram/Resources/icons/player_play@3x.png | Bin 0 -> 1318 bytes .../Resources/icons/player_volume_off.png | Bin 0 -> 445 bytes .../Resources/icons/player_volume_off@2x.png | Bin 0 -> 854 bytes .../Resources/icons/player_volume_off@3x.png | Bin 0 -> 1281 bytes Telegram/Resources/icons/player_volume_on.png | Bin 0 -> 482 bytes .../Resources/icons/player_volume_on@2x.png | Bin 0 -> 1151 bytes .../Resources/icons/player_volume_on@3x.png | Bin 0 -> 1674 bytes .../Resources/icons/player_volume_small.png | Bin 0 -> 341 bytes .../icons/player_volume_small@2x.png | Bin 0 -> 668 bytes .../icons/player_volume_small@3x.png | Bin 0 -> 962 bytes .../media/view/media_view_overlay_widget.cpp | 2 + .../SourceFiles/media/view/media_view_pip.cpp | 243 ++++++++++++++---- .../SourceFiles/media/view/media_view_pip.h | 35 ++- .../view/media_view_playback_controls.cpp | 122 ++++----- .../media/view/media_view_playback_controls.h | 4 +- .../SourceFiles/media/view/mediaview.style | 112 +++++--- 48 files changed, 348 insertions(+), 170 deletions(-) create mode 100644 Telegram/Resources/icons/player_check.png create mode 100644 Telegram/Resources/icons/player_check@2x.png create mode 100644 Telegram/Resources/icons/player_check@3x.png create mode 100644 Telegram/Resources/icons/player_fullscreen.png create mode 100644 Telegram/Resources/icons/player_fullscreen@2x.png create mode 100644 Telegram/Resources/icons/player_fullscreen@3x.png create mode 100644 Telegram/Resources/icons/player_minimize.png create mode 100644 Telegram/Resources/icons/player_minimize@2x.png create mode 100644 Telegram/Resources/icons/player_minimize@3x.png create mode 100644 Telegram/Resources/icons/player_more.png create mode 100644 Telegram/Resources/icons/player_more@2x.png create mode 100644 Telegram/Resources/icons/player_more@3x.png create mode 100644 Telegram/Resources/icons/player_pause.png create mode 100644 Telegram/Resources/icons/player_pause@2x.png create mode 100644 Telegram/Resources/icons/player_pause@3x.png create mode 100644 Telegram/Resources/icons/player_pip.png create mode 100644 Telegram/Resources/icons/player_pip@2x.png create mode 100644 Telegram/Resources/icons/player_pip@3x.png create mode 100644 Telegram/Resources/icons/player_pip_close.png create mode 100644 Telegram/Resources/icons/player_pip_close@2x.png create mode 100644 Telegram/Resources/icons/player_pip_close@3x.png create mode 100644 Telegram/Resources/icons/player_pip_enlarge.png create mode 100644 Telegram/Resources/icons/player_pip_enlarge@2x.png create mode 100644 Telegram/Resources/icons/player_pip_enlarge@3x.png create mode 100644 Telegram/Resources/icons/player_pip_pause.png create mode 100644 Telegram/Resources/icons/player_pip_pause@2x.png create mode 100644 Telegram/Resources/icons/player_pip_pause@3x.png create mode 100644 Telegram/Resources/icons/player_pip_play.png create mode 100644 Telegram/Resources/icons/player_pip_play@2x.png create mode 100644 Telegram/Resources/icons/player_pip_play@3x.png create mode 100644 Telegram/Resources/icons/player_play.png create mode 100644 Telegram/Resources/icons/player_play@2x.png create mode 100644 Telegram/Resources/icons/player_play@3x.png create mode 100644 Telegram/Resources/icons/player_volume_off.png create mode 100644 Telegram/Resources/icons/player_volume_off@2x.png create mode 100644 Telegram/Resources/icons/player_volume_off@3x.png create mode 100644 Telegram/Resources/icons/player_volume_on.png create mode 100644 Telegram/Resources/icons/player_volume_on@2x.png create mode 100644 Telegram/Resources/icons/player_volume_on@3x.png create mode 100644 Telegram/Resources/icons/player_volume_small.png create mode 100644 Telegram/Resources/icons/player_volume_small@2x.png create mode 100644 Telegram/Resources/icons/player_volume_small@3x.png diff --git a/Telegram/Resources/icons/player_check.png b/Telegram/Resources/icons/player_check.png new file mode 100644 index 0000000000000000000000000000000000000000..cdba65b47b2fc2f7aa57e753b62867219c38978d GIT binary patch literal 281 zcmV+!0p|XRP)k|F&~mh zxLbg+)pdPJwALV{+=UM^KRdSZ-)C^lf1E$v3;W=!QVgMxz0~=00000NkvXXu0mjf5QBD5 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_check@2x.png b/Telegram/Resources/icons/player_check@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9d432032b2c9795ece4abe5908472d39c6c80839 GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NSs54@Cwsa$ zhGek5ongPuB|xNoqL0hcE0IlJ$;^wwUyEEbIQvC-_a;{E2`^lXWtGnDFp7KTTM?5U z<6opwu5oAbd+Yti&-!&dg}%Jr(q0txN!)@{X0C#&1E+$ugK|rbLY1{@L!RO$2Gs^A z`{C*XPm3n{T%M8=`AqNRK0o;!|U7^wm^E5!e2}7OV(90C71u3B*4%wK0|8xvdjlnd;OM~b=7~|Q`>S+u}Pu9=DebB@P^!I z5t|M23!HiW{+z=8SG%wzX9_Sx-Z1nEY-)V*b_&C;))P!q7!Yj#1JkshFB4pP78qR& Mp00i_>zopr0QmyTr2qf` literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_check@3x.png b/Telegram/Resources/icons/player_check@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..097ad06c5947bdb4d3b8e43e5e65c9e5c48d56be GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvNA9*<$1a| zhEy=Vy|s58qoWA>hr78hE{iT_n9e(BoMGG86u0OzkC0ZY+v?9uUR6uIRHghA*6lPr zxwD)<{cX=~&J!M1DE7!Ph)2~*=%>KoRNVukU^k{_p&7DY}#kz#!U~lMCpoK zJXC$rUwDW~i$PsxK~upY1}%Z(^$VH`?=W0_U1}=Ve>KM}c&?xO{S}k1GRssia9h0a z-1E&pKm6J|_xy7$Pa$m;|AIG-%Pzmaf)-@8(T!TG*TJA@_I(<0i*XGRI{D zvtFbdxO*2m);A%nfGXi|AfkAn-l^? zf~%*<2s3==Jk|X~@!W5rFIqtJ-?Lu|xb(2hLZ+tD(X3tc?!NZ|#+p@aCNq6PmIf{4 zKe7E+euGKS)~L{5xBq{v2>Jat?rW9peS@HW^?mlIxAThmG1S*T4DsN1U}@H7JhF0v zTmuJNI8#TkqAi0U&pH-?r!qW3H>i%$x49-ZB(nA&FeNg0y85}Sb4q9e0BnIHLI3~& literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_fullscreen.png b/Telegram/Resources/icons/player_fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..bb3bbd3639117e437202c2bcd9626e74bdd665e6 GIT binary patch literal 359 zcmV-t0hs=YP)+i1!d|tt`Bftq6jRh&r1QBZ&@f zvP-HBgy5LGKQlilXN-ZE&c@3b`2hc^KoA6MT~`JG+U)zD>^PciJ@Y&l{QDqS_HYR) z%krim-zn>N0#OvfIF4=vRQR$iP}lV-q+~AJZdU>49J;RCfe25MWCx)q!gvW)S33dB zu&OGUrU~LWRzV2P z3JpV8mSwPQ+iqyvwk9xYk1inZThlZrd>94@!;m^`5~BsA(2sCT;8~z33X?3K_B;z< zCDM~?GKSB(fcWIf?wl(cf4yCXaNx&AvA7w3`pdLw<{R_pH7NPGor3@X002ovPDHLk FV1iYel^Xy6 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_fullscreen@2x.png b/Telegram/Resources/icons/player_fullscreen@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..79abf0a8852533827a244db4f745f4a699fbd3f0 GIT binary patch literal 639 zcmV-_0)YLAP)={cX4*|93H^qcmW*T++18dfs>1a zkobzEI-;AkyX_8JZ8vF?O>1{{`uoq!wv{1-P zz`+cCoc&r2v3muh+5gU|^kqZ{V#HAcMc%Zjl+WCId3~ z)9FOJ-EQQEZH<7%Vi6f(fbVoVUabdLCo2Txayb+{hvg#JvBML_pGEX~meJK}^&uh{ z`5@SEIHc_CWRHMGqd_;D%}d07zo+eX8v}>2(USp)a6X@>tyYUxDisVE$|mzp9qZEB zv>vDb5h7&*s?{oC=XcSAVLPeTrO#;RI*n9hU8Ji2&E|&|r-|skMMON+)jiNyQ>?XE^e)g>CMJGU0poP=838lwOJ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_fullscreen@3x.png b/Telegram/Resources/icons/player_fullscreen@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9354611f58a4f59d38ad9c883d201e9ce4600f0d GIT binary patch literal 919 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvNA9*`+2%J zhEy=Vy}2=4%TR*h!;gv;S598s_~4T71iiU`PqmwU{ zTID>%U+!nPWh^RL#)luzMzmul^~b94QzWpV4P<1R`pdUa!}^oqCx*FTpQ z?8sWtSW@W3`-I&uqw&t8J^S`ua$9^*R>u3qz9cP+mnBv8{g&SiB()YCKkj~fW`WED zWA_If4C*R^;WyZeMZ1qCm28cYwf5*wwNR>*oYbNDrkQh!*U}{l$EQ9oU^!rT>G$vI zifKPRRGiumKiqh{KiS-ZX=RAk#k&3er=J#8G*lGb%$fGd|L>L+4>(kMYYp}%DJ^Vo zXaDu>TbY3r58Ib-->#kZ`EW(;ldZru?mSNwA(iQ;Cw{H+-E~**=G(GkY}u?640%ts zuBpANc=D-IC{#n;vK)G`i?*TJ^StR=jty@tWtL0{dMdAQmfBf{%ky`vGsI{ zQHjw^nQ5;tX1Kh6_ioCsfW6E7pRZPZ^>oqq@83&y#>f>MIap$4`pf5W>YFvaQUdic z&->s0`FPhiT3x2`O5XO^uaBQaiCekzcG#}zyz{O8(OhYfXI?VnTG<>lq4{C{V4 z{ruGAEQjTupW;t%V!89+!@gsWH*VRx=DhaRmy91({3qUd^kLi28oNIZ$33(x{QdnM zk3W2TdA_4e$Mmq(toMrdom;XcXyuKD$NCdI8x$ZIIEBrQ!oRkqbzE$9)&V*KvXN?w< zZh!X--}isT`lPzO?s{U~I^Q3NKTX{iwmNfv&iwPwm)y)@i*N50_#eq?r}k8m<%{?( r113g!O(sPF1%{SFHmnq*!+(aOQz{DXy>VU$%xMgsu6{1-oD!M|iz?pM?W!;10V`Q{#tKi$VL6&7#IIf=yNFjvhc}~II2y|Wd3GPM!Gm$kR z9Jz1NvMkaaHDlq$?=muZor+isFY*0O#wHT!;$PH;u;p=vhHqFfDujY@)?$yo)HIEu zVF9BaUr zSXtOuX=20Md3nnt2<)s1j&UbJ2s`Zj-^?!T+5mu993N}e$1495ZUEk0K~n)!fhRLy zh7dJ@qtOV)<8i5br_+HT2;g)&f#-S9YPCxJWg~vbDnBllON=(1PIF^*yWM!V+x_~; zAK&+LeKUHi7moqcmW4p^+wC^(l3a@_s37VGKy?zLO#I<+h%L+F34job#iB6t=kq!4 z_xmdG*#4dhAV86!_`zU65zh}mQ#>z#2gLINST2{;VUzabH3#I|Nn>vE0>Fu_3BeBl zA;hvHJxmI(Yg^2%*K2%blk9rE!tHh=`8I?X(tWJeR)MNAWB{tlEVbY7r~vM!#D)YH z^`v99T2T}Dv>&Mg&1MtY?KU~sa5yCUzQVEaBOy9Z+VJbBW9errzWx`f3Zw&}>g$E= zbN~!Wg?ORBWE2$isRw|aL{X$1O$EVJVjgMN1DMa}O7ZBx5`Ze6C4i22b^vAKXR}%E z#AY*uCX)#!G}lnP6qC9&Z;#N?s zo%jIsdc9cu-JL+Vu3M)#Wh~N`(zb1I90&IMJ%nK>lFr9S0DR=$DAp%I4GKhc>0VGTrL_mlD5~d6yAVdHOQwH5KklXEM@pzm$olayL zKf}3Pj!maiwpy*&%gYOMxm-UhU3mmvRxP;=1_KUdGMVsTFnHA%Z8jS(m&^Nhhkts# z9)Em%ysD2Q4{PGUAP>vy>nn-`IF(A}u-Ui&8;yp#KrquwNEi;Z-|cqXH1RYBrm~K$iZ>ReOKZF8JS; z2krErYsnH0hgm9>Vh)Exczlb+g4Jp@wp=cS`mi*R(2OKEvh*z`d9Fg;5fH*gKm>#c zAYsZN0zw3kuy6)FKR+{AV`vLi;cc_outK4L4Ds*7Ld)=Ow+pLy(?vrPI={yDEA50c zs9LQ`xwLk>T}nUyvlHPfk}3Fplz{VsQ1%;3yAd7Ds6y892%U8NtEc+mw4q8^I}+ zO8XV>rNyLDKz_fU&t@~YGti>r=m6)C^teU$#$Gkr?KTPn6^?QA$)7^fV;0>T1A2RV zLxIlW=m3XE(4T(XqI+XN!{P8E5Qd{8q|<5M@Ar8olTiyOnN03~(tk?nS{xneM)t-s z2qu-yX8Crz{bp1w7OkEMqT@3T1W2)1jMwXR-fFdYB9Rb1x#io@j~BG7eW?h4X@99x zm0|>hTulNZAVdHOQw9+bB7lS`g9r!_K*E$k1cV46;Sc!lvI6;eo-U3d z9=vZu9Jvk{aBTiP_kVp8e_>k5@uad7nOuwurPeNsO`FC#GuG&t@1Mm?@A3pcGW-)i zJSkeFav$6Lla4(#>^n5C`u3_`v}BlnHriUCRYgr+Fg79N%BrN0EBhJ)FRpl@A@ob% f%E*NM6O;M%>iY|KpG@lm+RWhT>gTe~DWM4fW<5by literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_more@2x.png b/Telegram/Resources/icons/player_more@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0fd9fdab2d144b757d353cda0b6c3975195da4d7 GIT binary patch literal 361 zcmV-v0ha!WP)evDJck%#Sl4x*SmRl%fe)G6ltk0EZAlM2gU|C_ z$6kKPV?#k(=YHDoef|JaHfO?m0iX8)C}Kf08_Tj}_SGo)u5s42E3LzeSkT*V8weIP zkBN1o8z@b9p_Q^P#Z$z+*&qXV42WRa3kfi_*L!tf)rRba>XF|8rHHkNOZ`sCr}weg zRkd9!D)vG~4X_uo)M|@Z-a;)fb4~`V(ehJi}>v`@BnWkuHQ!nG$L=?!!z&)ImZt#k)JpA00000NkvXX Hu0mjf)YhL` literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_more@3x.png b/Telegram/Resources/icons/player_more@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca0520d6388711c63919ebfd0c7b14213fd5e4c GIT binary patch literal 566 zcmV-60?GY}P)2cLS^h{&|g~Y(!|rX)v@=}xvKlh_zF)4_>#}y4W;Rj3@3C(Toa`M%I8SH>$!r55 z#Q@5W(364uG~1s8l;ey9^E5EqC_okkZS%t~3&?HTR_!~_bLzUT%64lb(!3xV251~d z@zY+i$M*HDZSKMV4Z~1<0*`I=q7K8507#mzC_X6^D0TlvX+s{t=#sB~S07*qoM6N<$ Eg1z47ApigX literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pause.png b/Telegram/Resources/icons/player_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..a09d1730a5b7c374ea4353ba55f9bd9b9cd76148 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;io-U3d z9=vZu9l013Ij;PzxLy}y9=mdKI;Vst02d@qbpQYW literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pause@2x.png b/Telegram/Resources/icons/player_pause@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ef66eea101f45ac3f94f9ff40e27acc4497fde79 GIT binary patch literal 400 zcmV;B0dM|^P)V|KS5o{DgL4BPOD))HJBckThK?9bl$=q6r~H zTA#J{vz4!fqk*Rt%qr0LeHh0v%<~*#jJw5W{EcJoS}lD36CW0VQ_VKx*fWgWSw;L~ z@tm00wN+119Gffl>{~7TW(B8hZ~R2sHv7W13(K;EuIo16@}m}hvH>F2QpXn4Gz?|8 zTKG1K?RB|Fq5*fxRYEAB2yu6zfIH| z6mX|pC4>Ts5O)^}xKpkYLIFjHy9))}DOU-hfFi`*g#zxBtAt4fcxYj@l32kkxs!`c zHZV<-vAuN6|j;!SFygBNL|Hz9*m1+Y6Wa(10-U)cyl&uC&4c5B>}Q0000!lvNA9*ad^5o zhEy=Vo#WVd$biQ+IH0^B>fI5`s>Zkl*BLfuTYu#6)={(Zmv;5|;}IIL|FK2?{Y^%( zUYTd7yEPtISP;K`J_`%S8U+U?78ZwT%~_1Ee%rt4^Fo+*~R zaoe$L*W`3xZ=C;gd$?YjY@6ce8)i9cpDw6fRQ0&(-rs3;(a^wfqG$pGBjbdp3XDul3a1?*o}!6{1yT)bB=g>{n0PpQ z#YF8{%1;&?fBbN3?!4?LAI@e!>3YV&IBVI-?AtciPduD`{ebP0l+XkKCM5N9 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip.png b/Telegram/Resources/icons/player_pip.png new file mode 100644 index 0000000000000000000000000000000000000000..52e167ba149f1b51bb28e808b03cc7954aa3dc18 GIT binary patch literal 319 zcmV-F0l@x=P)03B^=E%0JB?M4J@vz&3 z(Aeorp_K{%G_J?&^%(O;{6_-AFo2X2wARrzj-$QJd7h&f%2i6iG))#u4mDXLImY)5 z1q_a`DMJy9wE~>f_q`j8`i$k`+})1_OgvadR*Xrr((SCWcsBOEX#68 z?8nWdaQB4}(aAx^OW!Y@;IMozSX7{GTk|KoqkgN&Ua`GG1Q?pX=m{dX}8HSfJXRtgFZY2R+D1K7;*zfe(;uch1T0 RmpcFe002ovPDHLkV1nTejlci^ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip@2x.png b/Telegram/Resources/icons/player_pip@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa8e10f7c47c9380b584f91744f288b8fd347d7 GIT binary patch literal 530 zcmV+t0`2{YP)|O>xg5ZaY*oQ|ISd1E*cHkL&f5_!P!Pn*$Ayix^Y{lS zzknWZF34x2pyY89f`Ckz2LQ{4z|Fg`gcL*O=1XGX^AINn?oI95Q`i-ekVr>w){H;PL|M) zefD2I0Jelof=g$hs;bvFG`4l+(ho7+@O0lLm(GAraXRJ$po+Ne`wX~NoZ2(WK$c|` z_x8T2P3>zG??b~de7loJ4D@|3q9{@z+6>fntxP<7V9zJzn99A}g$?Lm3tlv%PavYM zY6oWkUh;D8Nx4y=ZS-Nsd8vH{&R#A@>}#KaBLrv9^#S+{Fct7ih$$c&e)|mk0H*~! USCKuyP5=M^07*qoM6N<$f`k(2^Z)<= literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip@3x.png b/Telegram/Resources/icons/player_pip@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0cd7990dc8310ec8b840c91a8e81df3f7d4cc6 GIT binary patch literal 877 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvNA9*t9ZIN zhEy=Voqc+prlUyP>CV$Fg8B*`DsD+SNqKJ=_p}PmYw7H~{yp?km0Q+@?hRYJzOJNvRgDwJN-c42rh1)QJAY1QU}g$RaNyw(U`PuS zU}j=zm??Usfq^k0jnz=Wfni3ZqaS0}@yCmI+aMvJ zz;I@b0vihlgRyo8BO}v+Gh9p!e-6CUDqb5V91_Ov1`*~YhXw|N%}o*)?3uPqY6+WiVeaO@i(JCH zE*W!aO+T$P($#P&;Wo@2Vo5VZSC=hbpUxo3dA~Zvp+N$!8|;e(=?q+K%?H;0 zK2vr)$J;TjeCa#qPo|5a-_6)x6<>F0Utmc0asBH0d6MT%mmT}R=AxFnGVj`^Uw`*q ze1Bao|K!D@r8}$qCSHCSV*BUcIj5b0eOcd1L$jxxzti=>@6DFIO-0NFC)TmMd`r(w zs}xtbHN)BR?xf$o4JRhvnxt^GOk?FXXV0y&uVQ!J?DI}uwlSD*%IV$$mA64ZCkRe_ z^l5U#xA-^dT8Ffrd29^T?6F!SIW_WTKgl);G(m!2HAD>FVdQ&MBb@0AxUY A;{X5v literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip_close.png b/Telegram/Resources/icons/player_pip_close.png new file mode 100644 index 0000000000000000000000000000000000000000..72126ed98910a1c1268a2840a233d5f9df9dc16e GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;AJY5_^ zJb2#*J90G`@T@+xZv+3k=HCx$}C3g7w-nx;ibm>dWQMqGxI_n#k9=;zr zrFdFU*ODpAVws$Iv-TdC#piCH(-D;&yok}APl9P{&*JB9MGWOk+K&=lI=Iic$W2P# zw39)2XU@i8OPhTSqK(h_PelKimDT)@<=W?P-Azv_(s#N}u3_pwakxW5oMV4R)!*~d zU3s42>3kAWj&Ikby>75eQmXN-Z+zO%z5NA4S#!aclbdhe0J@*S)78&qol`;+0As3U AwEzGB literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip_close@2x.png b/Telegram/Resources/icons/player_pip_close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..56dfd6f56fdf94e946f969831a368a3d6918646e GIT binary patch literal 427 zcmV;c0aX5pP);T=7tr|=$nf-ZkpD8p)#-?9}_D1!6H|MD}@ zDTEMZ54&E&IzNp&z^@bZ1Uvz<13p4z18KP@K(~-A;0cfoq~)drmSqXYafEeU!#vMs z6VRf@zV87wtqX6Xsx9VYTHCfoF{0Are$YUhmO!X$oW6DDA(F18`+kmEh;Q>Kf|}Y! zngOm1)Iu=Y0-!zt6tWnxXbPtDv}^!ch)(7KVh5;&=xCk?c!KC`z74<~MER`TI0tuu9(aC%?y-JALzgmc)$u4z&h!MInkFmkdSBFvJyI(So z^LM{BN}dC#F<5gA0b>Wy7}H#VAdmz` zq7d!ld1z4swNTSiXF5f47;_E(F602e9z0LL6CgX_BSbckmU{wp3&{eW0NFrV{syK| V*`2+i_^to|002ovPDHLkV1jHavMm4r literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip_close@3x.png b/Telegram/Resources/icons/player_pip_close@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..47bef146195c23f7fee29ea8270ecb095e763fdc GIT binary patch literal 747 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmSN`?>!lvNA9*E%J16 z45?szd&{xwkb?m0g?Wh%2d8rTKa#X*dJt89&&Q@Iz2L2^NQvqTt;?n_7ASu6U%vX5 zTb;9nkLuKQ=2sPGemrd%{w)jxfA7=^D+pw;G6`~UG#FTSI5;r0+;n7NVp2H6 zrz9Z2kXR5-@70Z;%rmE+eH^m;?z&z5f9v9Vk0(#P<6AuC zPEqgg3E8J*X7%~rSl+BG9HArjedoXbHgf%H9!<(SUnkqmU(K}g-jdYFtH%p0N@kxu z_Ot2L!gKRgr$3o;=j+Ay-(T;ZWWT!e_wR$jr|tihZMAwC`uxP!l$|GK_H;a3HtS8k zrRmmvA``kq4tbuHb-2npi91pxX`*q%ryGsG9Bz5!9}(1$R?uBy{`dydQYF!bWd19n zD+T7*IBfJ_efWeqt2;!(FK&UEN7(s*qPKm~&xLo#8T^=|!awC};tzov%i8`pte7m< zc&}%2eW&fV$`^IY9;^>SR^@-*_oH7X_u9f=hAXPyonF(RcdDL0t2>w@C~kp3UrBe4 z@8jONQ}{U^dh9uC_|I+mz9-Cg7&hD22Flt!ogy}i4^H+?8Ky#AL6q#FWzw8dP^6WdKo-j L{an^LB{Ts5$6QVj literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip_enlarge.png b/Telegram/Resources/icons/player_pip_enlarge.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c156a4dac63a47ac3637e61271c3a627f0ca00 GIT binary patch literal 361 zcmV-v0ha!WP)<0uuQzv%F?EDM^Z zL5+uPag-~V=b25@B+dHy#o_D?!+@%)cMc;2k){{=UEs9a&i!{(_8L00000NkvXX Hu0mjfQm~(m literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip_enlarge@2x.png b/Telegram/Resources/icons/player_pip_enlarge@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1bfb76b699b8f4be1277ad256365ecfd22fdda30 GIT binary patch literal 574 zcmV-E0>S->P){V6vxXAK?h@)@I9O~F%Aw+JOhc3psR~cyc8}bga>f( z5!_^9KDWnME?1FKX$vH6LfXJ-`Tx#GTZ<3^^yzK;>8l$|s5g7f)I_4Avc9`)jxpz(MNaU63A zn0?J&9{>uf15r~r%No4^D9-o&$|!UiV6j+0mSz0}s3RW9IvIga;`jUgTVZz&U^1D& z{eFK-o84~r@b+tAcMf2^UVjwN#3BTq6ZEj_UJ4C|L%3WnImC9mEftA}9X+v2zcJ8~ zUe7i<8jWDH*}!Zz6BSr#Z#{`<*UzTyGN;NtQUR9BB?*Fn(41GLw{+dg9HTSx?^s}1 zXvKGId^jBPB2AJ6Y}+oiWA+mJKY_eOaf`#P4!69b?eTcb#k0YDKL2M^w3j@t55UCX zm6$=4iND=$;JR*i0T2Ws!Z2h^d7q{!Os7*_;_*M?5y;iP3|bH`51=LS@&Hz=mCm#& z{!2~@6$@J=EhX5>0l;!-2|^wKLf|>^>9CXF?PBUY#zI$#)9FMtR5#D_h~qfbMiRf8 z+o(imezlZP3Vrnl#ghzxVh3}VHxb~vNU?#5fMN%8mp2jMx=69XFE?N3)U!|aKL7v# M07*qoM6N<$f*`2<4*&oF literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip_enlarge@3x.png b/Telegram/Resources/icons/player_pip_enlarge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8961ce7b039a85f2231720fd8556e1ffb132736d GIT binary patch literal 845 zcmV-T1G4;yP);bf!QdL znEV0$3qKYUqgbrcxA%R&eS>e?2i5DH_qjx>eR{pSkEeAlUjU$}FDeECE`#l~`A2|& zkW?Tb0zw3kFl7({Ap%I4GKhc>0VGTrL_mlD5~d6yAVdHOQw9+bB7lS`gAgDO5_df8 z^Z6i`%RwLzc&abE-3}Iu1zawdr|RkL%pRBt`|5VP%Bv-t%~~Fp@Tb^nwbJ`gAKDg) zL>}7DY$xG?rqd~?S!6Z_TVuilvC+5NZO4$L0CEyZ8X%{Tqyl0{e!rhBxD}~@hQlG0 z%VlmjtRZQDoWPL=$SE8tfH0ixb_;{SfQ`krVtG2Q_RN-J^!t6&yNu0dqlClZ@3uRg z&aZu|)#^L?WzXQOqNUU6Ujx40aE+t2b&vGXK$S}6+T-TE9*!PTu~_`v3{oF)+@NSH zW;hyBKA%@uHmQ$FJ{QR4aw)UfOmq2OuGi~-*BlMQ?&a4{1L{J&;_-N(R4PF-nS}j* z59&o5PNx&sjtULLRl=Y#X=c&}{kMHH0U^W$gaC2>RU;G%LA_pwU@!>Fz(R8W6i7ye{`h7!IqONF@FrAU0qP=@Fb- zttK)K>)U%Xhyk%O9*+&LIe+(1lt!Z=I*xrn8iLVM5*)>miDI+agkG=5vRC-R9Y`h| z_UUm2k`0GDkk{)K{*=1!AlD3PwOXJ~0q*-C^g34{CLtRVcOco290Agh)Eiv(R_J0G zi2a-N)e?`#U#-fmp5=%3ZnqmUnG8Jphsopd2=n!lvI6-lJzX3_ zJb2%RIr6nA@aX&w{8!(gUt;Zco#RZSuc}(vBsc4_6+AMtTwHXgJ>Id`JYj6Z2AVZYn$1BZ2NX1-857D*5j6~Hj|&}s(MtN$(mPs>~GzlnKw4> zU!HPw!z_u%{_R))&6^~8I4h~gUN-D^wO1I=YV+i*wa(2F{Yl??KVB%AytsGOEx+Cq q2m4O|FA541~j5!mYSGd+q`(^Wv(JS``{YC(%;Swf6)ciWxWnC-8tW50 zxNTd~>04%NKBc%v_m%T~7i&c&YCfeeR_1dgsPw#MzV4Yk9mmUF)xPhK4R&tUbq&KX z?A(+e)y(G-oWPZ<+_C673x9sq%;)~mI$t)YhXiwS!Br)~xL$Hb5@Aj*xT-`L*GtYw zBFxDJSCt6kddV3{ggLq3suE#bFF7NLFeevWRU(Y*C1)fN=H!B_N`!H}90oRLJBlMAjY5ythBGm;2%a=}$4!nj^?Msg9h5u~&0icijQ#niVbC#B?WUVhbD uI9=c27KCOE5}Z5H>M6pllFhnqNBAGzt$1rRvhbb&0000NSs56Zd_7$p zLn;{G-u3lkaujiWc*tXhVH*3JCf*I%We2%t7%Qu6`TNIHrXy&5_hheXEki@Ez0ox> zOXqIs4mxE}w_~2phfhy__Wc(TkXqGr!O58^pr=<%N~j?zXUl~N3?j*k6<=ImX}S99 zsyAi3H{H!UUA0&5^wUi`V%_q``3?uHyPj=1|NPSmn`wt12Ix&c-QS=4_o&=C$@-?{ zcHe&gEwGyFw*OAoUPI;C|6lC$J2%sP-`zaRhxxmcju~%EE>nNLrd_U{N8R-2?9acK zUwkv;XNI$UZH)hOpS_aD-ak2;W^8xgOgru9nQN<;7cX1zxOe^6S-;PSl*Ghti7TEz zv#HN}$F=Nt#=#f9ubaI5!TH)Wt}3n<^>?*RzMSILHBn(WdLv_@BBRDJH*Q`|2Sc-{ z3=f8`jTf=_v9*n5frK`l01+0#S?e~09wfPF)!r+{*v#|=^V|aW| Wvm}CR*Kc4#WAJqKb6Mw<&;$TznJOs& literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip_play.png b/Telegram/Resources/icons/player_pip_play.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b0c8620b0a9bc2da724edcdcf6d1e3b2deef41 GIT binary patch literal 334 zcmV-U0kQsxP);e?RQa^ZXE!j<=5EVB5BsBndLc gu9V_G`#S-^H*p$5iIR~BNB{r;07*qoM6N<$f`^umEC2ui literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip_play@2x.png b/Telegram/Resources/icons/player_pip_play@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..77c3a6f139cc159e60c8805529f68031a375075d GIT binary patch literal 631 zcmV--0*L*IP)AF}Ac`o02nMskVi3e&vDmCy6x3qTV$narV$ovJA`A*PlZGh2`Vl*0Mxm=Fv zy3WSqF;i9bW$qRpT~etObX~_sCX)$*!QjKk`hw;0lde`P+(XkeG#U*!olbKJe}1~3 z+3j{nr_<&U{##U4MJN=aBh0y8uV^-#aJ$_!ga!Nk9@%V`j<8@hn;{$y(-G$IpI)og zg2&^bAuKo?4k#1~uvjcKgaz~Y9Fa(bjxfhC40Jjjc)ea4!h+-Rh*GHptJO+FSg=?u z5R1j=2yBNkw_%y2nz;-0Rn*l9bwMpazU+DgUx26AuQNzHb^Fubc6-`HFr21bc8v) z3Hx~MPbJfUhj;lh48ve{yZvXvfKf=baA8T3eyy8cSWy(FY1(hwO#2NhigK@sdN)fi z-SMc`>ohtZ!{Lxd*OJWOfzo01NF~$A zq)T~1yjU!nKOxRb9@_0Tjgkj4MJ;5?mPBEi%jNnGvj0}tG^L09sr`xVc8g3V^W8+B z7v?{ndziL-_>~L9pPt6UrvT*hc_zy;8;wS6I-NdqnE%du-jdmQ3!56o*bh_2tT1d> R3~m4b002ovPDHLkV1i=TB!&P0 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_pip_play@3x.png b/Telegram/Resources/icons/player_pip_play@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5662de761a81c3d2e71f983050c702d1080099 GIT binary patch literal 1417 zcmV;41$O$0P) zODIHt6vq!HlQdFNvrrbwvmuX=Mj8tiEU>_Wg-5YK3_>0Y7Fe*rLWwX_USYw8#KK!7 zX}ropStyZ5lIQ(*e*M)yGyLaq@AbQLf1kP;HS_!Z=G*DaIp=ro@45g02Mob+WfF@6 z6Ivvg&?3Qv76~S_NGODwCMqfl;^X7N%gYOPc6MN8Wd%4+-T@BB=cQ7qIHS?XeP@4v zpVMl!yv`-Di{Ay0jEtCx{9i^#M>(}x&4hO3(r7fliu}d>{XM7G>p6u&!GyNwDlRUz zO6V_4CKIRA>0}`^uTh7epPxh4bK@Gd7O2To2-psubC+}+(N zSP}nF6GwY`dO}A>2OJ(ALP|;s1uNng>JpZ~z(817Sb*v2Y4G>=r(i|=Ky7B2m6Zj@ z$H&mr)C5YUl7baE2GuFJhldBWwY7oCWP-G`GzwN^Ka!|*1Ox=Y{QNx3&CQY5QbbZk zrS$Z4V%@E+t;E`;gygDs=&zfbn~DF<%*>=9)F)=~vCs;?J38&o3(&=H6Ym)+6bjJm^>B7}26=gTf4&~4-<(ye)nG6fV0CpBA|fLGY#p-M1=nh| zu(!7dJv}|(?d>i4{IY5{aC38m^73-xP6`SNz{SNyw7F&3*Wv5y3qwOgu(7cL(b3VO z%qi;z8tgm4o|FFme(>?}5p*uucPhEMxWHF6rLi0>`csOKaWS9-ggcbm-3Vw$PEdZ9f zUzyMXu(-HrHYgLCXSTPunb1PBwY5cB)ZX6S%w}Rj^T5;76Erk5KvGf?JUl#D98j=( z!R5l_1eP*s!Ko}7i|@I)xsaTk zOqIysEJDA&zCvebCjMSW*Ma?Oc%+&}qj5Tsfp3epx4w(nTun{Q z|Mss*8D53Hy}h;R{kHb6Ngdvv%n%tF$sP~#^TqFgV`F2#ifk|#*aL6)xRgpIH#Ie7 zCa~Ne;Uw6jP_eBQw~z2ZZS=vrySuXR!#}~EIV%#ZB}^ok&?3Qv76~S_NHC$r00900 Xa+Aa%8(Dee00000NkvXXu0mjfeAJ_y literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_play.png b/Telegram/Resources/icons/player_play.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc3dab187ea12e8aafcdd59a02deb26d6359e31 GIT binary patch literal 362 zcmV-w0hRuVP)Jq|@c5P+A6PT~d{9S)#z2r4S23+NogJ#=oN(u+d$qL7%k z<7Iij9_#HSo89cJ`7$$RMk0g&UBX0uv~1fpNs@$Un)Y~o`HUVct7#fQY1>_x+Lv9GO87>?Q7uZcDOdSrErD(4l|E!0ubDYkVL~Zbac7_X^>Y@&Et;07*qo IM6N<$f@9W~*#H0l literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_play@2x.png b/Telegram/Resources/icons/player_play@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a2e5186b10aea301c16896c7dffefc7f9c4beb GIT binary patch literal 659 zcmV;E0&M+>P)1e1t1QnG|Mdb-Z zA(4mziN+HsBq9=t!vDE@#3a_Py_dUo=1j6#J4SN8jJ0RZkR?e1< z{@e9#w}W!I3{Iz0B#0KE8~sD)d_IR{GARn;eE_qxS}pMTe7qr_0}!&^ZlPE#g57TC z1^FL<&BkmtgG3_117QvTA=m2_n$0G7y2&%XgjfIu>2|vi3`OJqcPUs#F$Rk>vfvxG}#3W*(D|EMLpTF3faOI>Cz(E;x3lgOQjOc z@_M`7rn$i({1(&UaL~=D$!zlVdOZz*)HW-YGp5t&4S{E6quVGO)|JXx)9|kb tO6I8P7pcP#AX1>OViCTq@+xrF{{s!Tit}5*4GRDO002ovPDHLkV1kM?D)#^Y literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_play@3x.png b/Telegram/Resources/icons/player_play@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8a14c8cea52855b868ce4dba34c16c136b71695d GIT binary patch literal 1318 zcmV+>1=;$EP)5C_VilAAO%j}NbotgKY*{8OdefNE5-uLr9&-*^l zJMT^i5lQkVC@KU(RnmjW{|N*Ec~ONRATNL%UVc}8PD)Cm^73+ukB_ILqa#{gUZ$_F zFD*qakq3jc>ZhuzN_u^Lm0acW@=_`)DpD=u>3RbGrVb}AE>3!Rd2waqcD}H%AR&){ zjs8oW)dAJj)wu!r?aTA?v((YiAvqk5zuZ)$yy}4Z`}==m@@v}J*_o7|pD$9wHPzMQ zEEWrF*jR0a1jywPkT3O@&62LJuBfG@g+fCEetBQ2})zXIH0MiDT;}SVaY-rbp-?x7{?kL8x^x_ zXlPKri$q9wKnw;nXnJ~D(I{w^C}J2O1_Wag!jIrO3!gmdwSG3qT+t$8sdcbR@47P<3@R z7jRGsZU8YN^6CIBE-up6))u9vrm|$yj@$uaB;@rbIz2t5;o)J5h=^dxh99{F1QKCk zVbt5(OBWXx%8I7pbmSXy4Tu3rOiZMel@(fFU#H~cWR`5mQ3ybcL`g{rou8kRyiP^o z;o&S<*P~E?KmuR}1_l&R0H(JH2Z#ZIslnu6dN4t~L|8x!2p&ga5XWGSK|RnSJRksp z8vu6zZUNkbK#C;*F(7a(;b6kigu@vKu@oQ%1fdE-7KAPcVf+zG0s;^Oy$F601S1&s zRV)jL0dajC<;%Lb=WI?e6aSR7uNfki2z}Iy*ZlD=W)qI3Q|C4O&`SQsS`N+gqQs#gp=Bx3|;H&5d80qE=W~K-bsT)YjHU z8yg#HZ3{@ca3=Qg@j-)wgUW6Yz2ShcP#Odv&>CouQ6hu}VSK5qtfbP?QbXaO6SxNS z`T0pBBO{cao~}IqGD>S)@58N$VY5BG&3_pJv}`H zNTP|ZfS@UuonTg?iY_Mh^z@|sStTbYM`$?c)PQRcW~HvKF2WRU1@Q<7 z`xu?iqlw+!-FdA~pdPPyy^)C-RR3U)*G{~@zyJCo0VK+M0qy;23c1syii!$JUYBu$ zWT%&#;MEFV2bzS01gfpArReBr+S}Ws&CN~QydFmrAQR2s^jmuzq)o3K2Nehc^3n-G cKwbd-1AV544!93Y@&Et;07*qoM6N<$f>WqsyZ`_I literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_volume_off.png b/Telegram/Resources/icons/player_volume_off.png new file mode 100644 index 0000000000000000000000000000000000000000..88ed4e39131d1022cae112013d965bb9a597fd0b GIT binary patch literal 445 zcmV;u0Yd(XP)5S})AyN93lbp&>iM-He@*!<`~!@3cyfz$T_=WNj0$!o;4K=Q zmSw^HeuvxbHkj9=Gc4{n4&-?bbo7V}f%^fg)e6e8q}t6B0h`SRE|&|quFHgHvl#?I z08tdN*t-}Ju;1^YswzR0cW}{myKO?R*9+F`HK2HsBu(sky@D*uJVXTWVqG=@BuN6_ z_Zj4TJ~#IB`2^E6d2zHq2T({DhOCC7D7wU9@-@Xu_@SyQSu7STRJV!D=X2)shOi}8 zQjbwD6nc(rIh{^THa!!};illg;cyr|NtTIF4bt zTrweqc%BEx*S5MIrzRWuTUNvG*dlTH+pGGJq873}p&`%LXVG+$mjDZLbMKtyO3><*XzZd zP6t!@{QR^nw*;qi;DN+)xjYU6Q2BPdO$)CXC6%*_n0f~Qe5=*cfaYKRYXTmR2REBd z92=Fc`!yFE9Ax;{)H^+{k?Q?*IU3G#WavbuKv$Hci9*>#tbUHO8@P{Nfl}IFlDwPTfhr>EQ0tnsT-|Or$1F0zT`~7UX zP$+EmQmKRpQf4RM(O@t@@pzosE-o&ZE-Hr1h||_SnM_y}_El&u7++ssb!pz--dHEZ z%7gP}v%%SHR)*7j3qi1|@C0OM21v-j=ks|Pc(9ujPz4Y1;u9P8v%m z=wZCQy+z;O-_*RlJ`{^ZL@tBO1`7C-I~L02a?HM1EKn#EV(+|S$c#8x+GW+!l$gBG zT!BCU&t|jjv{-rSLq{=pzu#whsL$_c4O9rwB!Y#^{sjOnAAfy)jh~;NaWa|I*m)mb z&tx+A>FEido}SA5)d;|1NBu)Xt7S%l`ZzSIcYp#jB5^c7^)eFhJ4ol87%e}eWYN9k z;o$+DpP!>%uZPy_^R literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_volume_off@3x.png b/Telegram/Resources/icons/player_volume_off@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b31bad377272d2a5d2b69817ed4945dbf589debe GIT binary patch literal 1281 zcmV+c1^)VpP)(V%JZHw-nLBk(-L9GEoaa2x$9K+oX6D8KfboxM z5(06_d2{-kfB{5E!2mLV2m*xJD98XJ2oPqYAOnaXK$wk!3?PC4VKxdffCvJF*(k^W zA_x#>qaXu_AV8QyS5Q12hnblf*xA{ErKKgv&(9}94&IDU6hrxBXJ@m6g9G-nU0q$V z!otE(;*oI395@!Jsi~=q0Tjw5#+3ux+uP9J-!HsgN=r+H=fgM|IG{u#0b5&JFfcG6 z%{LZ{No_$J0tJL{P&tExgF)x%dA`5^S;~nL9Hg4?jMl|KgtNK12}46eE=JkAW@Tl; z+*%=%j9@;x-9<{Z#L04B7+}+*5>gp=Iyu6Sj)4F4DIE>dg)&`~ZJwHGH zE2g8PBiq>Z^>xOf{p!cFm7ZH%T(tQ(KR;)=xw+E*-@fDyRg>x1Faf^i*n-kIZ~|&- zY7!3H*x1m9#EVd&kFl{aB_L0iSY>4;^z`&Vad9!{ByWw4jnLiQE$^UdkJ2OO+1Xj4UFQ2|XC*=2(Pr=H=wST175+E;I_XppR@V3T_fq#NCCQY7&Yqv2 zS$TQ6Ek9?z2#V@pvtL|XNCWlD-~@y*wzRac$HzzM6e36}IPdT8Ymt*x!vkSI7KBO^L+u#Y=HenC+Akpa?$w7k45b&tw%0VjHZbRfy-c!0wK ztE5q?eznun(`2#t^z@|d^5f$J#>dB#&z-af@s5!MgbBKV%IDWNKGN;$>jS)(^V)Q`yJSDv0_f*?)h@=9OvS6( z%AN6u>ZG5(6o3DpP|+zBlyl;A9P0pb1ILQdBc$j7Qo+HkTy-nt0aCO8QE;#bbW?F_ zTs7_hg?X!?1IJ3(M@a4fU0z;Vmvq{`MQhO9+?;eiS%pkNT3cI7t*sVV!M8g={Bb3F zeSMV%>xaP!sG_2R@nTQtS_a2Tl!DaW-mZk?`hnT;@iElY)Ie`TD!Kk7EVr1lmRLU@{ykHUYcTD=TBXTDB>OQjRlj znUe6lv#;aWI{=3x;Y0{&cX!v89ChFXg!4>KPp7u;hldBot7GAOs+gLao7v6HO>%nN zY!((4bbO>25C-fPk_Zs`DJm*r_4V~EFE39gF<~EmTf*w<>R3rhiO?u%5`;85IvOcRfdbNn#8=Ubkyzk>bRgZ{-ewFS z48-#S_SdnvyY21m*>-(=?^aMy5L!&mobZ=Qq3RibEX8Xa;3Yp?Uthz@$_nr|o;<9~ zXrTkj3=HxpLRo|4;bfl003!Y;29N(fG`^c89)R9!fX^|01*TTvr&)% rL=Yg%MnMJ;L4YtD1sOmD0mA$bcM6ds!u7i~00000NkvXXu0mjfaY$o) literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_volume_on.png b/Telegram/Resources/icons/player_volume_on.png new file mode 100644 index 0000000000000000000000000000000000000000..eaddd3674de2815083b687314bd856bd805092f0 GIT binary patch literal 482 zcmV<80UiE{P){V6vyiwG>n?~F|cVOE{v`&=yRZ(ZY=r?zJwziyo-q@ z5*`3>a4?a?L^zkz*j|bT%q0vrw@EqWwCDe8Pd{pe5J+le<*PE~r|>@o)a!NPx-PLS zi}d^b!Ytz^7uHs*1>J6!j!OV=JRSkd{eFk#a+w!jEUv051VI44?{gu9Y&ILX-EI)a zG3dI^`!W;G2aLyKxLhuDw)n{e!)!LAt9U#fFdB_s`Z0g+oYXg&OyGLGa&ZP|x7)B- zEO?w@7<7zjn%tMt6#?7r7Q!$TMAJVQD9bW+F^D8dG<{JNL9f@#LPS7X>|Hwzz1F&6m(WcYs?=KpI;ZuRngy(sDb$C42>otEW=JPr4V{uRWlafq_5YTKk zAvu=RhvJ9Bfu4JO>{hFlFgBy}86X|hXf$BI--B)2Fc=K-#G%HPk=RN~seACrjQ&30 Y8%Q=6Wc7a30ssI207*qoM6N<$g7b~m1^@s6 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_volume_on@2x.png b/Telegram/Resources/icons/player_volume_on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f931fe24158c86141698f0433383bc1c0165173d GIT binary patch literal 1151 zcmV-_1c3XAP))Y#e_in%Lxtw#pd#SVQw%1yBt+ju@z4zI#03ihE@6VRt zpG6)9?h}aj2>K)7kATY_@TbsEJ8))ZhTPxZllAp=Qe9pB({Q6dZe%g}m6Vi#TDG>f zASWlsP5ZF{kDZjAoeiI#pDG8qySsy~t}dq}yeH7o(gNMx-H@1=sDbM5?*}@CG!kE5 zUobp8toeUqc6di17!1PF(h>)^va(_Xl$MqT6B85g^76ucnJ_jsW{j~R;tc^6JOV<1 zHVs2rSs9$3o-*uKjU&<4)@B>0hI< z5puaBfZ!Jv79;?o5}{EETw!4$TwY#^VL+Ez$;T#-a{_@t0OsfCrG`~SY#4hLmr~Kj zy4YB4Z7n=MKf}<_kP+C_)RYvzy1Hug6LSU_ z3tDR>KR=()rHy1{WN80oWo40uh6c^98Yoe2s;jFbdwYA9-q+Vh=!(VvLm?$4g@4>|p|`hJ z^I^VN+aBhss;a2Z|0zjHNn~_%R7<|Gu_4*$cOdB|B_czqD;z4cL7rb60ZjMt@nIb= zM4!~uRLjnq+uz^k@uDA-ZAXAQd0HqaDPKZD0-@7LvOPRJkgKaJZp+NfW+2Jp)PUaI?dYn-#hjG0|At5;#0OGzK{}iXHOy z_C}_sr?phAt*w%6cXwCPRVAbvM7_Peos5i(7>^RTyw%s&i|$cnaS9C#43MLvBPk|1 zIhoL%m)r0tv9q(o^+) zAM+2_W`K&5F%gomy9*!^F%KT6i;IgT8~eY!yj(j@H#IdGeOXMnc1{2jcyXaAC@27W z3gtbI0zDIb2R!JF|i|HdfeUK-UfQ_bqYSV1hBK{ z^Sbpmy1BUtH8nMEfLpP)uM#*szrENV=6*YP#OD);_bB-z;E#aI9{BT9=pPt*v$002ovPDHLkV1m6N9ozr_ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_volume_on@3x.png b/Telegram/Resources/icons/player_volume_on@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5d10c66a684389cbbc38af996351993c3056d85d GIT binary patch literal 1674 zcmV;526g#~P)cIf!-Y$RV@!m}L^vv_c-)WGUsp_t-`d&>> zPfzQB5W?h7D+~gT47nzLC!hi1q=E)W1H>V~QEM5b0pbwgsI?5z0C5O#)LI5zCKpS3EmAi@$yQ zW^UhY8xH(<-@kv?XJc>ty3=nvwp`k(6mdY{L zI)E}WGx6>1tuEG=mls@HTgweBEG!K7_xE!_wY0QwZ7Bq0c|aK%8Tjt*P6tOgIXO8| z927jgc6WD$rqp9aMTKH}GO#QQ2;k^vjyN(IMesXeBWbMDp=jUhq<;xdcJ(Yc!7myk_5Dv}xpr9ZOb0L~e zUk0;j)_iGUVS(FT-|iCk}$k} z(8|}ZU%BlmcFhAQIXM|$UtiPwl$B8&!~h7&SWXnJ~DCoC^7N8{t; zx@+-CNJt1eIy#d0NTwHv+^&d>hvFu(*NUhTICy@3p8Cs}Qb;_N_#!a$(T#PDb z2^9l^+sc+oaBwgxEiGlbG&eVg$m@(mPv&D1nVdi|Ah|I|t^;%G{`~pFG*9L}XnlQM zq9-c|$lu>zB4-H{17aDlrkqUv5SeE&U07XRmFVCh5E&UMk+TGL4G4mgyJhzG_o;CQ z1O!m!G@;!CijIz^#q}n;yu769J{2Ij@#Ny-f(l5kjktl`XOK7`CD*jcD65^_1G>7p zV#S77w-PI}Xol<_(DwE=Ev`2i>sIecM3yaSHY_fCcz8f1B_)U~pfUUY`ST}L zx4gVem9vD-EQMGOw;22?MMXv21v7ZD{q^e?BA<)JW=wKjQ&WT1*4CJ|;7vb2KVPDU z1v9c`Mk414R4pJ8V~Xk*%)|9v(JWBoi)rdwaQU_3gZ$ zD+`#?klUHsFB)=yHa0e}l0|niFf$kJl`Q&G;xr#1=u9mnii0>XFc6c~L+%d(pM3x% ztt>7sa@*7TCNlE^0{dzpeZ(K~RHL!M@Zm5nF3xrVsexoHpr)oKDjX1Yc6J&I2iloG zgM>cd`#kRxv`|;gv9-0835V>8#Xdeh_5lcj=0Q>e2DZPzW-3;J&qFY1tFcL`Yq<;( zItNI!JwnIF$BKhVNJzlswSmRvO&1ZO=!N*z_Y4H&ZU z$B!STgafv0ACQubF4K1ed_)F`_~kYah|WH4aU@P1bgJ)q29LFou8j$vNz}>uMRvQ26|N+s6LdZ zcG}o3#vp65)c|qmYk)LB90DA*mO&aI4gro@%ODL9hX6;dWsnAlLx7{!GKd4{AEu75 UI9tVND*ylh07*qoM6N<$f_bq4=Kufz literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_volume_small.png b/Telegram/Resources/icons/player_volume_small.png new file mode 100644 index 0000000000000000000000000000000000000000..8cbcaf5c4d1ae51d057fc8cee0aa9f512f703581 GIT binary patch literal 341 zcmV-b0jmCqP)hCZwg*-(R8P005!GntiO1cknB4xx>a=6a)dpaeN6pD_~uu9a)xI7ijBL7f+dTh2+}l_@;LEG0E1NVBY|-op>10go988grfFbZSM5V$ zv8pQAwoOcxUOE_B$#YiPRKSI|`lAUEc2%%zqU$>4*NWO-@9YWc^yd3MxULKAVDFf* nz#S;AmAVKo{v&<`E_d+@R#r$vI4wRm00000NkvXXu0mjfeYlIX literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/player_volume_small@2x.png b/Telegram/Resources/icons/player_volume_small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3098bed94ea155715b9fd712d6593653ece5fdac GIT binary patch literal 668 zcmV;N0%QG&P)y-p3IceNfm*Ew&1Mrqp^zXwHg{4BNqGW+0GiEaNNMOeQAM^x$6$&@>H=$77nWrB4e;rBW!D%gKm3 zjlq`zLVh$FSqMK*&;p9ZB08VXsMG1t1cdrucmvy(PN$*U?LsUTv)CjO38+*mmU*{{ zNF)No;Si3;BjA55H*=*s*JJ;n?S{8Fi8_+PJAl+WjlHQMf-zT-t!C={3? zz-olq8>ZoK82bIbG3M-Aoi67hH(%H^^d&1FR2E3H-ww%e_X2ir2&b!lW^SSKvZown<^3M+ezooTmwF=Q_6jrMh-0yd3xUYab5%6jwujU+YVy`xp ziK_(2j3y73$^cK)WcsKK$c!crmdXH6)MWbjJ_FxMo5;H>VO=Kx0000!lvNA9*S9-cQ zhEy=Vo#pRs|Wwd{0!Q#4ezs{U`V_(BI?c(#BmCt6LuS+kSU&_fKVZUOg0LP3QCv6lR z8U!>26qs5B9PTV3np&r&A=T@&HLCUY?Pv>ITi2k{^SWAHee%bTAAj@t^JK|f8@bJ^ zS8E^t91yYlb3tEU-;L|nryqQ_Jb(Lb7LNlz*Upi*n#|7?ekHTxoaT!U9}3iD4rU}W z%F4(rC=e41Fq)aNH!gouXIeS;as};zGa_5IZasSK+O<2k>b~7={`UR*)TzlYyp}EK z?&kjX?c1@k^76Y4Df|oe?zO%4wyd{Q`+Hi0OT)v06JARvEuPS1qxe*egXO`WKQfO# zTIlHO&+g-9YYxy5Nk~pU{AEt1jJCFRz{-#XmtQ)p4V$fgBqn*vI*#_ka`N(1ry9KP ztYHoQ*`fPw_t)RGY9dN)AOG3>g&>%Jb3!lRhX+%BGuu~)*hRt?rX1KXWvc_XG{4Ww|&>8 z@88RJ?B2cE>ddE~ryAtsxOXJd#K>&p@; z-5H(iw`=V9U%!4`uXg$C(@&p-qoxbCJz z@3xmMC9K>(7XL6 zbizi9P*ut2)ho)`CPZwgu> uQr}dn$jQ{=pzgrJq1dp)(~(%}KV!r5Kkth#M&AHtN(N6?KbLh*2~7ZiPrp0> literal 0 HcmV?d00001 diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 3d8a71a2a..1629b6a89 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -2104,6 +2104,8 @@ bool OverlayWidget::initStreaming(bool continueStreaming) { || (!_streamed->instance.player().active() && !_streamed->instance.player().finished())) { startStreamingPlayer(); + } else { + updatePlaybackState(); } return true; } diff --git a/Telegram/SourceFiles/media/view/media_view_pip.cpp b/Telegram/SourceFiles/media/view/media_view_pip.cpp index 275336f5b..54163ab1d 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip.cpp +++ b/Telegram/SourceFiles/media/view/media_view_pip.cpp @@ -20,7 +20,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_controller.h" #include "styles/style_window.h" #include "styles/style_mediaview.h" -#include "styles/style_layers.h" // st::boxTitleClose #include "styles/style_calls.h" // st::callShadow #include @@ -292,6 +291,14 @@ void PipPanel::setPosition(Position position) { setPositionDefault(); } +QRect PipPanel::inner() const { + return rect().marginsRemoved(_padding); +} + +bool PipPanel::dragging() const { + return _dragState.has_value(); +} + rpl::producer<> PipPanel::saveGeometryRequests() const { return _saveGeometryRequests.events(); } @@ -433,7 +440,7 @@ void PipPanel::paintEvent(QPaintEvent *e) { } auto request = FrameRequest(); - const auto inner = rect().marginsRemoved(_padding); + const auto inner = this->inner(); request.resize = request.outer = inner.size() * style::DevicePixelRatio(); request.corners = RectPart(0) | ((_attached & (RectPart::Left | RectPart::Top)) @@ -453,7 +460,6 @@ void PipPanel::paintEvent(QPaintEvent *e) { const auto sides = RectPart::AllSides & ~_attached; Ui::Shadow::paint(p, inner, width(), st::callShadow); } - p.translate(_padding.left(), _padding.top()); _paint(p, request); } @@ -515,7 +521,7 @@ void PipPanel::updateOverState(QPoint point) { setCursor([&] { switch (_overState) { case RectPart::Center: - return style::cur_default; + return style::cur_pointer; case RectPart::TopLeft: case RectPart::BottomRight: return style::cur_sizefdiag; @@ -655,6 +661,11 @@ void PipPanel::moveAnimated(QPoint to) { } void PipPanel::updateDecorations() { + const auto guard = gsl::finally([&] { + if (!_dragState) { + _saveGeometryRequests.fire({}); + } + }); const auto position = countPosition(); const auto center = position.geometry.center(); const auto use = Ui::Platform::TranslucentWindowsSupported(center); @@ -665,7 +676,7 @@ void PipPanel::updateDecorations() { (position.attached & RectPart::Right) ? 0 : full.right(), (position.attached & RectPart::Bottom) ? 0 : full.bottom()); _snapped = position.snapped; - if (_padding == padding || _attached == position.attached) { + if (_padding == padding && _attached == position.attached) { return; } const auto newGeometry = position.geometry.marginsAdded(padding); @@ -675,9 +686,6 @@ void PipPanel::updateDecorations() { setAttribute(Qt::WA_OpaquePaintEvent, !_useTransparency); setGeometry(newGeometry); update(); - if (!_dragState) { - _saveGeometryRequests.fire({}); - } } Pip::Pip( @@ -690,18 +698,6 @@ Pip::Pip( , _panel( _delegate->pipParentWidget(), [=](QPainter &p, const FrameRequest &request) { paint(p, request); }) -, _playPauseResume( - std::in_place, - &_panel, - object_ptr(&_panel, st::mediaviewPlayButton)) -, _pictureInPicture( - std::in_place, - &_panel, - object_ptr(&_panel, st::mediaviewFullScreenButton)) -, _close( - std::in_place, - &_panel, - object_ptr(&_panel, st::boxTitleClose)) , _closeAndContinue(std::move(closeAndContinue)) , _destroy(std::move(destroy)) { setupPanel(); @@ -725,39 +721,131 @@ void Pip::setupPanel() { }, _panel.lifetime()); _panel.events( - ) | rpl::filter([=](not_null e) { - return e->type() == QEvent::Close; - }) | rpl::start_with_next([=] { - crl::on_main(&_panel, [=] { - _destroy(); - }); + ) | rpl::start_with_next([=](not_null e) { + switch (e->type()) { + case QEvent::Close: handleClose(); break; + case QEvent::Leave: handleLeave(); break; + case QEvent::MouseMove: + handleMouseMove(static_cast(e.get())->pos()); + break; + case QEvent::MouseButtonPress: + handleMousePress(static_cast(e.get())->button()); + break; + case QEvent::MouseButtonRelease: + handleMouseRelease(static_cast(e.get())->button()); + break; + } }, _panel.lifetime()); } -void Pip::setupButtons() { - _panel.sizeValue( - ) | rpl::start_with_next([=](QSize size) { - _close->moveToLeft(0, 0, size.width()); - const auto skip = st::mediaviewFullScreenLeft; - const auto sum = _playPauseResume->width() + skip + _pictureInPicture->width(); - const auto left = (size.width() - sum) / 2; - const auto top = size.height() - _playPauseResume->height() - skip; - _playPauseResume->moveToLeft(left, top); - _pictureInPicture->moveToRight(left, top); - }, _panel.lifetime()); +void Pip::handleClose() { + crl::on_main(&_panel, [=] { + _destroy(); + }); +} - _close->entity()->addClickHandler([=] { - _panel.close(); - }); - _pictureInPicture->entity()->addClickHandler([=] { - _closeAndContinue(); - }); - _playPauseResume->entity()->addClickHandler([=] { - playbackPauseResume(); - }); - _close->show(anim::type::instant); - _pictureInPicture->show(anim::type::instant); - _playPauseResume->show(anim::type::instant); +void Pip::handleLeave() { + setOverState(OverState::None); +} + +void Pip::handleMouseMove(QPoint position) { + setOverState(computeState(position)); +} + +void Pip::setOverState(OverState state) { + if (_over == state) { + return; + } + const auto was = _over; + _over = state; + const auto nowShown = (_over != OverState::None); + if ((was != OverState::None) != nowShown) { + _controlsShown.start( + [=] { _panel.update(); }, + nowShown ? 0. : 1., + nowShown ? 1. : 0., + st::fadeWrapDuration, + anim::linear); + } + const auto check = [&](Button &button) { + const auto now = (_over == button.state); + if ((was == button.state) != now) { + button.active.start( + [=, &button] { _panel.update(button.icon); }, + now ? 0. : 1., + now ? 1. : 0., + st::fadeWrapDuration, + anim::linear); + } + }; + check(_close); + check(_enlarge); + check(_play); + _panel.update(); +} + +void Pip::handleMousePress(Qt::MouseButton button) { + if (button != Qt::LeftButton) { + return; + } + _pressed = _over; +} + +void Pip::handleMouseRelease(Qt::MouseButton button) { + const auto pressed = base::take(_pressed); + if (button != Qt::LeftButton + || _panel.dragging() + || !pressed + || *pressed != _over) { + return; + } + + switch (_over) { + case OverState::Close: _panel.close(); break; + case OverState::Enlarge: _closeAndContinue(); break; + case OverState::Other: playbackPauseResume(); break; + } +} + +void Pip::setupButtons() { + _close.state = OverState::Close; + _enlarge.state = OverState::Enlarge; + _playback.state = OverState::Playback; + _play.state = OverState::Other; + _panel.sizeValue( + ) | rpl::map([=] { + return _panel.inner(); + }) | rpl::start_with_next([=](QRect rect) { + const auto skip = st::pipControlSkip; + _close.area = QRect( + rect.x(), + rect.y(), + st::pipCloseIcon.width() + 2 * skip, + st::pipCloseIcon.height() + 2 * skip); + _close.icon = _close.area.marginsRemoved({ skip, skip, skip, skip }); + _enlarge.area = _enlarge.icon = QRect( + rect.x() + rect.width() - 2 * skip - st::pipEnlargeIcon.width(), + rect.y(), + st::pipEnlargeIcon.width() + 2 * skip, + st::pipEnlargeIcon.height() + 2 * skip); + _enlarge.icon = _enlarge.area.marginsRemoved( + { skip, skip, skip, skip }); + _play.icon = QRect( + rect.x() + (rect.width() - st::pipPlayIcon.width()) / 2, + (rect.y() + + rect.height() + - st::pipPlayBottom + - st::pipPlayIcon.height()), + st::pipPlayIcon.width(), + st::pipPlayIcon.height()); + const auto playbackHeight = 2 * st::pipPlaybackSkip + + st::pipPlaybackWidth; + _playback.area = QRect( + rect.x(), + rect.y() + rect.height() - playbackHeight, + rect.width(), + playbackHeight); + }, _panel.lifetime()); } void Pip::saveGeometry() { @@ -768,9 +856,7 @@ void Pip::updatePlayPauseResumeState(const Player::TrackState &state) { auto showPause = Player::ShowPauseIcon(state.state); if (showPause != _showPause) { _showPause = showPause; - _playPauseResume->entity()->setIconOverride( - _showPause ? &st::mediaviewPauseIcon : nullptr, - _showPause ? &st::mediaviewPauseIconOver : nullptr); + _panel.update(); } } @@ -788,10 +874,47 @@ void Pip::setupStreaming() { void Pip::paint(QPainter &p, FrameRequest request) { const auto image = videoFrameForDirectPaint(request); - p.drawImage(QRect{ QPoint(), request.outer / style::DevicePixelRatio() }, image); + p.drawImage( + QRect{ + _panel.inner().topLeft(), + request.outer / style::DevicePixelRatio() }, + image); if (_instance.player().ready()) { _instance.markFrameShown(); } + paintControls(p); +} + +void Pip::paintControls(QPainter &p) { + const auto shown = _controlsShown.value( + (_over != OverState::None) ? 1. : 0.); + if (!shown) { + return; + } + p.setOpacity(shown); + + const auto outer = _panel.width(); + const auto drawOne = [&]( + const Button &button, + const style::icon &icon, + const style::icon &iconOver) { + const auto over = button.active.value( + (_over == button.state) ? 1. : 0.); + if (over < 1.) { + icon.paint(p, button.icon.x(), button.icon.y(), outer); + } + if (over > 0.) { + p.setOpacity(over * shown); + iconOver.paint(p, button.icon.x(), button.icon.y(), outer); + p.setOpacity(shown); + } + }; + drawOne( + _play, + _showPause ? st::pipPauseIcon : st::pipPlayIcon, + _showPause ? st::pipPauseIconOver : st::pipPlayIconOver); + drawOne(_close, st::pipCloseIcon, st::pipCloseIconOver); + drawOne(_enlarge, st::pipEnlargeIcon, st::pipEnlargeIconOver); } void Pip::handleStreamingUpdate(Streaming::Update &&update) { @@ -906,6 +1029,20 @@ QImage Pip::videoFrameForDirectPaint(const FrameRequest &request) const { return result; } +Pip::OverState Pip::computeState(QPoint position) const { + if (!_panel.inner().contains(position)) { + return OverState::None; + } else if (_close.area.contains(position)) { + return OverState::Close; + } else if (_enlarge.area.contains(position)) { + return OverState::Enlarge; + } else if (_playback.area.contains(position)) { + return OverState::Playback; + } else { + return OverState::Other; + } +} + void Pip::waitingAnimationCallback() { } diff --git a/Telegram/SourceFiles/media/view/media_view_pip.h b/Telegram/SourceFiles/media/view/media_view_pip.h index cd1249dc9..7ad917029 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip.h +++ b/Telegram/SourceFiles/media/view/media_view_pip.h @@ -53,6 +53,8 @@ public: void setAspectRatio(QSize ratio); [[nodiscard]] Position countPosition() const; void setPosition(Position position); + [[nodiscard]] QRect inner() const; + [[nodiscard]] bool dragging() const; [[nodiscard]] rpl::producer<> saveGeometryRequests() const; @@ -113,6 +115,19 @@ public: FnMut destroy); private: + enum class OverState { + None, + Close, + Enlarge, + Playback, + Other, + }; + struct Button { + QRect area; + QRect icon; + OverState state = OverState::None; + Ui::Animations::Simple active; + }; using FrameRequest = Streaming::FrameRequest; void setupPanel(); @@ -132,16 +147,30 @@ private: [[nodiscard]] QImage videoFrame(const FrameRequest &request) const; [[nodiscard]] QImage videoFrameForDirectPaint( const FrameRequest &request) const; + [[nodiscard]] OverState computeState(QPoint position) const; + void setOverState(OverState state); + + void handleMouseMove(QPoint position); + void handleMousePress(Qt::MouseButton button); + void handleMouseRelease(Qt::MouseButton button); + void handleLeave(); + void handleClose(); + + void paintControls(QPainter &p); const not_null _delegate; Streaming::Instance _instance; PipPanel _panel; QSize _size; - base::unique_qptr> _playPauseResume; - base::unique_qptr< Ui::FadeWrap> _pictureInPicture; - base::unique_qptr< Ui::FadeWrap> _close; bool _showPause = false; + OverState _over = OverState::None; + std::optional _pressed; + Button _close; + Button _enlarge; + Button _playback; + Button _play; + Ui::Animations::Simple _controlsShown; FnMut _closeAndContinue; FnMut _destroy; diff --git a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp index 3fde55bfb..4ccc929e2 100644 --- a/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp +++ b/Telegram/SourceFiles/media/view/media_view_playback_controls.cpp @@ -31,10 +31,9 @@ PlaybackControls::PlaybackControls( , _playbackProgress(std::make_unique()) , _volumeToggle(this, st::mediaviewVolumeToggle) , _volumeController(this, st::mediaviewPlayback) -, _speedController(this, st::mediaviewPlayback) -, _speedLabel(this, st::mediaviewPlayProgressLabel) +, _menuToggle(this, st::mediaviewMenuToggle) , _fullScreenToggle(this, st::mediaviewFullScreenButton) -, _pictureInPicture(this, st::mediaviewFullScreenButton) +, _pictureInPicture(this, st::mediaviewPipButton) , _playedAlready(this, st::mediaviewPlayProgressLabel) , _toPlayLeft(this, st::mediaviewPlayProgressLabel) , _fadeAnimation(std::make_unique(this)) { @@ -46,9 +45,6 @@ PlaybackControls::PlaybackControls( fadeUpdated(opacity); }); - _pictureInPicture->setIconOverride( - &st::mediaviewFullScreenOutIcon, - &st::mediaviewFullScreenOutIconOver); _pictureInPicture->addClickHandler([=] { _delegate->playbackControlsToPictureInPicture(); }); @@ -68,14 +64,6 @@ PlaybackControls::PlaybackControls( updateVolumeToggleIcon(); }); - _speedController->setPseudoDiscrete( - 7, - [=](int index) { return (index + 2) / 4.; }, - _delegate->playbackControlsCurrentSpeed(), - [=](float64 speed) { updatePlaybackSpeed(speed); }); - updatePlaybackSpeed(_delegate->playbackControlsCurrentSpeed()); - _speedController->setAlwaysDisplayMarker(false); - _playPauseResume->addClickHandler([=] { if (_showPause) { _delegate->playbackControlsPause(); @@ -142,7 +130,6 @@ void PlaybackControls::startFading(Callback start) { showChildren(); _playbackSlider->disablePaint(true); _volumeController->disablePaint(true); - _speedController->disablePaint(true); _childrenHidden = false; } start(); @@ -150,8 +137,7 @@ void PlaybackControls::startFading(Callback start) { for (const auto child : children()) { if (child->isWidgetType() && child != _playbackSlider - && child != _volumeController - && child != _speedController) { + && child != _volumeController) { static_cast(child)->hide(); } } @@ -161,7 +147,6 @@ void PlaybackControls::startFading(Callback start) { } _playbackSlider->disablePaint(false); _volumeController->disablePaint(false); - _speedController->disablePaint(false); } void PlaybackControls::showAnimated() { @@ -183,14 +168,10 @@ void PlaybackControls::fadeFinished() { void PlaybackControls::fadeUpdated(float64 opacity) { _playbackSlider->setFadeOpacity(opacity); _volumeController->setFadeOpacity(opacity); - _speedController->setFadeOpacity(opacity); } void PlaybackControls::updatePlaybackSpeed(float64 speed) { _delegate->playbackControlsSpeedChanged(speed); - //const auto percent = int(std::round(speed * 100.)); - //_speedLabel->setText(QString::number(percent) + '%'); - _speedLabel->setText(QString::number(speed) + 'x'); resizeEvent(nullptr); } @@ -205,19 +186,15 @@ void PlaybackControls::updateVolumeToggleIcon() { _volumeToggle->setIconOverride([&] { return (volume <= 0.) ? nullptr - : (volume < 1 / 3.) + : (volume < 1 / 2.) ? &st::mediaviewVolumeIcon1 - : (volume < 2 / 3.) - ? &st::mediaviewVolumeIcon2 - : &st::mediaviewVolumeIcon3; + : &st::mediaviewVolumeIcon2; }(), [&] { return (volume <= 0.) ? nullptr - : (volume < 1 / 3.) + : (volume < 1 / 2.) ? &st::mediaviewVolumeIcon1Over - : (volume < 2 / 3.) - ? &st::mediaviewVolumeIcon2Over - : &st::mediaviewVolumeIcon3Over; + : &st::mediaviewVolumeIcon2Over; }()); } @@ -249,14 +226,8 @@ void PlaybackControls::setLoadingProgress(int ready, int total) { const auto percent = int(std::round(progress * 100)); if (_loadingPercent != percent) { _loadingPercent = percent; - _downloadProgress->setText(tr::lng_mediaview_video_loading( - tr::now, - lt_percent, - QString::number(percent) + '%')); - if (_playbackSlider->width() > _downloadProgress->width()) { - const auto left = (_playbackSlider->width() - _downloadProgress->width()) / 2; - _downloadProgress->move(_playbackSlider->x() + left, st::mediaviewPlayProgressTop); - } + _downloadProgress->setText(QString::number(percent) + '%'); + updateDownloadProgressPosition(); refreshFadeCache(); } } else { @@ -337,44 +308,48 @@ void PlaybackControls::setInFullScreen(bool inFullScreen) { } void PlaybackControls::resizeEvent(QResizeEvent *e) { - const auto skip = st::mediaviewFullScreenLeft; - - auto playbackWidth = width() - 2 * skip; + const auto textSkip = st::mediaviewPlayProgressSkip; + const auto textLeft = st::mediaviewPlayProgressLeft; + const auto textTop = st::mediaviewPlaybackTop + (_playbackSlider->height() - _playedAlready->height()) / 2; + _playedAlready->moveToLeft(textLeft + textSkip, textTop); + _toPlayLeft->moveToRight(textLeft + textSkip, textTop); + const auto remove = 2 * textLeft + 4 * textSkip + _playedAlready->width() + _toPlayLeft->width(); + auto playbackWidth = width() - remove; _playbackSlider->resize(playbackWidth, st::mediaviewPlayback.seekSize.height()); - _playbackSlider->moveToLeft(st::mediaviewPlayPauseLeft, st::mediaviewPlaybackTop); + _playbackSlider->moveToLeft(textLeft + 2 * textSkip + _playedAlready->width(), st::mediaviewPlaybackTop); - _playedAlready->moveToLeft(st::mediaviewPlayPauseLeft, st::mediaviewPlayProgressTop); - _toPlayLeft->moveToRight(st::mediaviewPlayPauseLeft, st::mediaviewPlayProgressTop); - if (_downloadProgress) { - const auto left = (_playbackSlider->width() - _downloadProgress->width()) / 2; - _downloadProgress->move(_playbackSlider->x() + left, st::mediaviewPlayProgressTop); + _playPauseResume->moveToLeft( + (width() - _playPauseResume->width()) / 2, + st::mediaviewPlayButtonTop); + + auto right = st::mediaviewMenuToggleSkip; + _menuToggle->moveToRight(right, st::mediaviewButtonsTop); + right += _menuToggle->width() + st::mediaviewPipButtonSkip; + _pictureInPicture->moveToRight(right, st::mediaviewButtonsTop); + right += _pictureInPicture->width() + st::mediaviewFullScreenButtonSkip; + _fullScreenToggle->moveToRight(right, st::mediaviewButtonsTop); + + updateDownloadProgressPosition(); + + auto left = st::mediaviewVolumeToggleSkip; + _volumeToggle->moveToLeft(left, st::mediaviewVolumeTop); + left += _volumeToggle->width() + st::mediaviewVolumeSkip; + _volumeController->resize( + st::mediaviewVolumeWidth, + st::mediaviewPlayback.seekSize.height()); + _volumeController->moveToLeft(left, st::mediaviewVolumeTop + (_volumeToggle->height() - _volumeController->height()) / 2); +} + +void PlaybackControls::updateDownloadProgressPosition() { + if (!_downloadProgress) { + return; } - - auto left = skip; - const auto playTop = height() - _playPauseResume->height() - skip; - _playPauseResume->moveToLeft(left, playTop); - left += _playPauseResume->width() + skip; - - _fullScreenToggle->moveToLeft(left, playTop); - left += _fullScreenToggle->width() + skip; - - _pictureInPicture->moveToLeft(left, playTop); - - auto right = skip; - const auto volumeTop = playTop + (_fullScreenToggle->height() - _volumeController->height()) / 2; - const auto volumeIconTop = playTop + (_fullScreenToggle->height() - _volumeToggle->height()) / 2; - _volumeController->resize(st::mediaviewVolumeWidth, st::mediaviewPlayback.seekSize.height()); - _volumeController->moveToRight(right, volumeTop); - right += _volumeController->width(); - _volumeToggle->moveToRight(right, volumeIconTop); - right += _volumeToggle->width() + 2 * skip; - - const auto speedTop = volumeTop; - const auto speedLabelTop = playTop + (_fullScreenToggle->height() - _speedLabel->height()) / 2; - _speedController->resize(st::mediaviewVolumeWidth, st::mediaviewPlayback.seekSize.height()); - _speedController->moveToRight(right, volumeTop); - right += _speedController->width() + st::semiboldFont->spacew * 3; - _speedLabel->moveToRight(right, speedLabelTop); + const auto left = _playPauseResume->x() + _playPauseResume->width(); + const auto right = _fullScreenToggle->x(); + const auto available = right - left; + const auto x = left + (available - _downloadProgress->width()) / 2; + const auto y = _playPauseResume->y() + (_playPauseResume->height() - _downloadProgress->height()) / 2; + _downloadProgress->move(x, y); } void PlaybackControls::paintEvent(QPaintEvent *e) { @@ -387,7 +362,6 @@ void PlaybackControls::paintEvent(QPaintEvent *e) { showChildren(); _playbackSlider->setFadeOpacity(1.); _volumeController->setFadeOpacity(1.); - _speedController->setFadeOpacity(1.); _childrenHidden = false; } App::roundRect(p, rect(), st::mediaviewSaveMsgBg, MediaviewSaveCorners); diff --git a/Telegram/SourceFiles/media/view/media_view_playback_controls.h b/Telegram/SourceFiles/media/view/media_view_playback_controls.h index e2d20b887..31fed6214 100644 --- a/Telegram/SourceFiles/media/view/media_view_playback_controls.h +++ b/Telegram/SourceFiles/media/view/media_view_playback_controls.h @@ -75,6 +75,7 @@ private: void updatePlaybackSpeed(float64 speed); void updateVolumeToggleIcon(); + void updateDownloadProgressPosition(); void updatePlayPauseResumeState(const Player::TrackState &state); void updateTimeTexts(const Player::TrackState &state); @@ -98,8 +99,7 @@ private: std::unique_ptr _receivedTillProgress; object_ptr _volumeToggle; object_ptr _volumeController; - object_ptr _speedController; - object_ptr _speedLabel; + object_ptr _menuToggle; object_ptr _fullScreenToggle; object_ptr _pictureInPicture; object_ptr _playedAlready; diff --git a/Telegram/SourceFiles/media/view/mediaview.style b/Telegram/SourceFiles/media/view/mediaview.style index 40edc751a..211e02ece 100644 --- a/Telegram/SourceFiles/media/view/mediaview.style +++ b/Telegram/SourceFiles/media/view/mediaview.style @@ -20,61 +20,85 @@ mediaviewPlayback: MediaSlider { activeFgDisabled: mediaviewPlaybackActive; inactiveFgDisabled: mediaviewPlaybackInactive; receivedTillFg: mediaviewPlaybackInactiveOver; - seekSize: size(11px, 11px); + seekSize: size(12px, 12px); + duration: mediaviewOverDuration; +} +mediaviewPlaybackTop: 52px; + +mediaviewControlsButton: IconButton { + ripple: RippleAnimation(defaultRippleAnimation) { + color: mediaviewPlaybackIconRipple; + } + rippleAreaPosition: point(0px, 0px); duration: mediaviewOverDuration; } -mediaviewControllerSize: size(480px, 100px); +mediaviewControllerSize: size(481px, 75px); mediaviewPlayProgressLabel: LabelSimple(defaultLabelSimple) { font: semiboldFont; textFg: mediaviewPlaybackProgressFg; } -mediaviewPlayProgressTop: 11px; -mediaviewPlayButton: IconButton { - width: 25px; - height: 24px; +mediaviewPlayProgressSkip: 8px; +mediaviewPlayProgressLeft: 8px; +mediaviewPlayButtonTop: 5px; +mediaviewPlayButton: IconButton(mediaviewControlsButton) { + width: 42px; + height: 42px; + rippleAreaSize: 42px; - icon: icon {{ "media_play", mediaviewPlaybackIconFg, point(3px, 0px) }}; - iconOver: icon {{ "media_play", mediaviewPlaybackIconFgOver, point(3px, 0px) }}; - iconPosition: point(3px, 1px); - - duration: mediaviewOverDuration; + icon: icon {{ "player_play", mediaviewPlaybackIconFg }}; + iconOver: icon {{ "player_play", mediaviewPlaybackIconFgOver }}; + iconPosition: point(9px, 9px); } -mediaviewPauseIcon: icon {{ "media_pause", mediaviewPlaybackIconFg, point(1px, 1px) }}; -mediaviewPauseIconOver: icon {{ "media_pause", mediaviewPlaybackIconFgOver, point(1px, 1px) }}; -mediaviewPlayPauseLeft: 17px; -mediaviewFullScreenLeft: 17px; -mediaviewVolumeLeft: 7px; +mediaviewPauseIcon: icon {{ "player_pause", mediaviewPlaybackIconFg }}; +mediaviewPauseIconOver: icon {{ "player_pause", mediaviewPlaybackIconFgOver }}; -mediaviewFullScreenButton: IconButton(mediaviewPlayButton) { - icon: icon {{ "media_fullscreen_to", mediaviewPlaybackIconFg, point(0px, 0px) }}; - iconOver: icon {{ "media_fullscreen_to", mediaviewPlaybackIconFgOver, point(0px, 0px) }}; - iconPosition: point(0px, 1px); +mediaviewButtonsTop: 7px; + +mediaviewMenuToggleSkip: 4px; +mediaviewMenuToggle: IconButton(mediaviewControlsButton) { + width: 34px; + height: 34px; + rippleAreaSize: 34px; + icon: icon {{ "player_more", mediaviewPlaybackIconFg }}; + iconOver: icon {{ "player_more", mediaviewPlaybackIconFgOver }}; + iconPosition: point(5px, 5px); } -mediaviewFullScreenOutIcon: icon {{ "media_fullscreen_from", mediaviewPlaybackIconFg, point(0px, 0px) }}; -mediaviewFullScreenOutIconOver: icon {{ "media_fullscreen_from", mediaviewPlaybackIconFgOver, point(0px, 0px) }}; -mediaviewPlaybackTop: 28px; +mediaviewPipButtonSkip: 5px; +mediaviewPipButton: IconButton(mediaviewMenuToggle) { + icon: icon {{ "player_pip", mediaviewPlaybackIconFg }}; + iconOver: icon {{ "player_pip", mediaviewPlaybackIconFgOver }}; +} -mediaviewVolumeWidth: 60px; -mediaviewControllerRadius: roundRadiusLarge; +mediaviewFullScreenButtonSkip: 8px; +mediaviewFullScreenButton: IconButton(mediaviewMenuToggle) { + icon: icon {{ "player_fullscreen", mediaviewPlaybackIconFg }}; + iconOver: icon {{ "player_fullscreen", mediaviewPlaybackIconFgOver }}; +} +mediaviewFullScreenOutIcon: icon {{ "player_minimize", mediaviewPlaybackIconFg }}; +mediaviewFullScreenOutIconOver: icon {{ "player_minimize", mediaviewPlaybackIconFgOver }}; -mediaviewVolumeIcon0: icon {{ "player_volume0", mediaviewPlaybackIconFg }}; -mediaviewVolumeIcon0Over: icon {{ "player_volume0", mediaviewPlaybackIconFgOver }}; -mediaviewVolumeIcon1: icon {{ "player_volume1", mediaviewPlaybackIconFg }}; -mediaviewVolumeIcon1Over: icon {{ "player_volume1", mediaviewPlaybackIconFgOver }}; -mediaviewVolumeIcon2: icon {{ "player_volume2", mediaviewPlaybackIconFg }}; -mediaviewVolumeIcon2Over: icon {{ "player_volume2", mediaviewPlaybackIconFgOver }}; -mediaviewVolumeIcon3: icon {{ "player_volume3", mediaviewPlaybackIconFg }}; -mediaviewVolumeIcon3Over: icon {{ "player_volume3", mediaviewPlaybackIconFgOver }}; -mediaviewVolumeToggle: IconButton { - width: 31px; - height: 29px; +mediaviewVolumeWidth: 75px; +mediaviewControllerRadius: 9px; +mediaviewVolumeIcon0: icon {{ "player_volume_off", mediaviewPlaybackIconFg }}; +mediaviewVolumeIcon0Over: icon {{ "player_volume_off", mediaviewPlaybackIconFgOver }}; +mediaviewVolumeIcon1: icon {{ "player_volume_small", mediaviewPlaybackIconFg }}; +mediaviewVolumeIcon1Over: icon {{ "player_volume_small", mediaviewPlaybackIconFgOver }}; +mediaviewVolumeIcon2: icon {{ "player_volume_on", mediaviewPlaybackIconFg }}; +mediaviewVolumeIcon2Over: icon {{ "player_volume_on", mediaviewPlaybackIconFgOver }}; +mediaviewVolumeTop: 10px; +mediaviewVolumeToggleSkip: 11px; +mediaviewVolumeToggle: IconButton(mediaviewControlsButton) { + width: 30px; + height: 30px; + rippleAreaSize: 30px; icon: mediaviewVolumeIcon0; iconOver: mediaviewVolumeIcon0Over; - iconPosition: point(8px, 8px); + iconPosition: point(3px, 3px); } +mediaviewVolumeSkip: 4px; mediaviewLeft: icon {{ "mediaview_next-flip_horizontal", mediaviewControlFg }}; mediaviewRight: icon {{ "mediaview_next", mediaviewControlFg }}; @@ -229,4 +253,16 @@ pipDefaultSize: 320px; pipMinimalSize: 100px; pipBorderSkip: 20px; pipBorderSnapArea: 16px; -pipResizeArea: 10px; \ No newline at end of file +pipResizeArea: 10px; +pipControlSkip: 6px; +pipPlaybackWidth: 2px; +pipPlaybackSkip: 4px; +pipPlayBottom: 16px; +pipPlayIcon: icon {{ "player_pip_play", mediaviewPipControlsFg }}; +pipPlayIconOver: icon {{ "player_pip_play", mediaviewPipControlsFgOver }}; +pipPauseIcon: icon {{ "player_pip_pause", mediaviewPipControlsFg }}; +pipPauseIconOver: icon {{ "player_pip_pause", mediaviewPipControlsFgOver }}; +pipCloseIcon: icon {{ "player_pip_close", mediaviewPlaybackIconFg }}; +pipCloseIconOver: icon {{ "player_pip_close", mediaviewPlaybackIconFgOver }}; +pipEnlargeIcon: icon {{ "player_pip_enlarge", mediaviewPlaybackIconFg }}; +pipEnlargeIconOver: icon {{ "player_pip_enlarge", mediaviewPlaybackIconFgOver }};