From 81a72caf0777854477cb8a9e3fab2af0ae2de628 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 31 Aug 2021 02:31:34 +0300 Subject: [PATCH] Added context menu to voice playback speed button. Fixed #16868. Fixed #16138. --- Telegram/Resources/icons/voice2x.png | Bin 479 -> 0 bytes Telegram/Resources/icons/voice2x@2x.png | Bin 1015 -> 0 bytes Telegram/Resources/icons/voice2x@3x.png | Bin 1550 -> 0 bytes .../icons/voice_speed/voice_speed0.5.png | Bin 0 -> 637 bytes .../icons/voice_speed/voice_speed0.5@2x.png | Bin 0 -> 1223 bytes .../icons/voice_speed/voice_speed0.5@3x.png | Bin 0 -> 1994 bytes .../icons/voice_speed/voice_speed1.5.png | Bin 0 -> 603 bytes .../icons/voice_speed/voice_speed1.5@2x.png | Bin 0 -> 1158 bytes .../icons/voice_speed/voice_speed1.5@3x.png | Bin 0 -> 1865 bytes .../icons/voice_speed/voice_speed2.png | Bin 0 -> 581 bytes .../icons/voice_speed/voice_speed2@2x.png | Bin 0 -> 1049 bytes .../icons/voice_speed/voice_speed2@3x.png | Bin 0 -> 1628 bytes Telegram/Resources/langs/lang.strings | 5 + .../media/player/media_player.style | 37 +++- .../media/player/media_player_widget.cpp | 169 ++++++++++++++++-- .../media/player/media_player_widget.h | 5 +- 16 files changed, 189 insertions(+), 27 deletions(-) delete mode 100644 Telegram/Resources/icons/voice2x.png delete mode 100644 Telegram/Resources/icons/voice2x@2x.png delete mode 100644 Telegram/Resources/icons/voice2x@3x.png create mode 100644 Telegram/Resources/icons/voice_speed/voice_speed0.5.png create mode 100644 Telegram/Resources/icons/voice_speed/voice_speed0.5@2x.png create mode 100644 Telegram/Resources/icons/voice_speed/voice_speed0.5@3x.png create mode 100644 Telegram/Resources/icons/voice_speed/voice_speed1.5.png create mode 100644 Telegram/Resources/icons/voice_speed/voice_speed1.5@2x.png create mode 100644 Telegram/Resources/icons/voice_speed/voice_speed1.5@3x.png create mode 100644 Telegram/Resources/icons/voice_speed/voice_speed2.png create mode 100644 Telegram/Resources/icons/voice_speed/voice_speed2@2x.png create mode 100644 Telegram/Resources/icons/voice_speed/voice_speed2@3x.png diff --git a/Telegram/Resources/icons/voice2x.png b/Telegram/Resources/icons/voice2x.png deleted file mode 100644 index f01a811168261f586f5dd8083ae14162a9fd0374..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmV<50U-W~P)%hKGW%RdV4sJ z^O>it*K1M~1>J5JkH-V=psFfTsTA(_J3ue8wA(2SD3`0B{BWg4na5x-@$K!}b zqw)YZEf5GGlgXe`sbDY|e2>X!nDJbpP=L*5gT-RO<#NH{a1io-zelxN#dJCa?}RZO zscf}ch0k6653G*K3@*S>^Z+*nqtWQ&4P#52%?66@k$4gOe!ob12bR2Atxzl$@dU>4 V4Yl55*be{z002ovPDHLkV1irN+x!3k diff --git a/Telegram/Resources/icons/voice2x@2x.png b/Telegram/Resources/icons/voice2x@2x.png deleted file mode 100644 index a37c17097fa076019cf4c60b8e92283604cdbd00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1015 zcmVe*#3z-FX7)QqphK7d1$HxanMMc=&-iBdsZ;zs*qj7(KkLv1b zOifMU{r%moz~0{8$j;72XJ;n@0|T+YzYhixj@Q@M74h)sk1^O7(`Yi8gi(&t)23lC z<~OP`XE}|Gj6_^q96mliaCmr#gM$N^&v}cFkC%0)r>D5Oy3)Vf*Vk9p@R&*^9v&X- zF|=A7o1C1KO_!FItO|+eg@=brA!(MA zljE=-SOU8|4Vd=s?r!Nk-01l*vDJKDULFDh0(4sQ^YdMIK37z?x3|lb>+5SuOiZ+k zBrGh9&d$zc4tFN5eC|vt@BdD9b91vu>iqnil9Q7i(x++m`1qLAkxJ9k)AA9v+UAt} zD97dH<)lt4*<^lxo~o*g(&Nva*s?ccP@EBzk^+mN^X#4f0{Bsj0+`hOMTi z=I?bpH#cWhsg^IiaY8}@Ei5dEn@>2_uvU<)b2imRg$2!T8L>khbCoCxvAn#D&(BY* zLg8X#eJXIw%*uJIXQ1V zzZ)@X6tNE7b=`6FNxZkFb;dMpZf+taB?U1tG3e^*f@*hezZCG*Co?lsFxVK=pgIyw zOiV~2u&Er_71VD?<^6bXjZMB#Wd#zI){c?aY)P+)tnD4OsAT(rUWkIz- lk6h?4E-s+Dnp}n0{s2r7lyfdwO~L>G002ovPDHLkV1n(d>UaPE diff --git a/Telegram/Resources/icons/voice2x@3x.png b/Telegram/Resources/icons/voice2x@3x.png deleted file mode 100644 index 6f60123cee0f94c8dd73d121c28aeefe41e3dc3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1550 zcmV+p2J!icP) zf{Io_p`~D$t=tGML^LW9L_x(C30hf11&Kr@{*Z>5simoDmS(4U-gu{X?w{BD-OuZR zyP27H=9x3kIp>+VZbZc5M{aIzv~%Z9N=Qhc*w|Rwx^*jgdU~SEB{n}lPai*iq}J9} zx_9p$efso?m^G-HvA4H3r=_KFZ*Q+?Uw!ua^=m$J<_rrb0yV?KoSmJ`U%!4`eP|7c zfbZ0)Q-48+goN<$@bIbztb_aT;REm5wTnG6GBRk}wr!Fti;IhN|NebyYipzL-@j{I zUugq(eSCcA*s)`D{P=N+VaJXgl#`P~)Ya9cc)7B&@*j8p2C2(_h_&kKY6ah$H*c6` zW@ePe!-o&M45TFo9X)zf!3VtV>({SWPJeWCbfwu~b3Ic$!0T@Mg}b|1lS?;Y36Dbv z5u97LY#~2CKbLH1S)h?+Zr;3!;H8d^4tn+K6^X=8B3LLiG*oV2&6+iI<;oT6?(QZL zIP~Jh3(CyQG}|D&c=_^W>gnl`<3!C^+7YG+de5Fc76UOlI+_u=zkmO>nA4}Hr#U$} zS$-Q45y9`@zn5d5JbA)m)5_eDk&)cr-!I1qC$Km{Wz7El`_0xvJy*;UXrV(G6Y3^3 z0k^leGk}Odk?jDvefxH~=#3jU_~*}`TK~6i-}u_KYm5r4ONX+uGWjjCLV9|-nZq0g zT~JUUC;$BUGoL$mjy*g)G|iHqpU-;Q1i-AUEV*z%Kmd!Qm*3)~P|*PT(4j;8<;xe@ z_weCExglffa~Sm7w{PX-wY9a%s=+g~! zLO|p9?%g{+aNvN|D(o;ltmzMtr}@sEI}!|ZuhhH-%>wQt=)|cgK0?OH%geJV8=MLn z9v8WofBpKU0hyYb;*^vWs{o)O5X449EbQI8ciEtqRa}guJ9+XX<>uxR3JI*fzMg7o zYOL~dN>m%*qv?)E};^J7`*|bk_<5U4;3&eDT%Q;7=o{^u1*tKMmixLo<4mlr^4nPR+IlIr2ryZ_{%P(Wj`@#$~j%hWSB|PrX!$#A!#A*RCa&2fI{rLf2*Gem1b_xp%S!ZoZNhK-#0YWILt^R@_TL1t607*qoM6N<$g7$S4 A_W%F@ diff --git a/Telegram/Resources/icons/voice_speed/voice_speed0.5.png b/Telegram/Resources/icons/voice_speed/voice_speed0.5.png new file mode 100644 index 0000000000000000000000000000000000000000..a209f0ff13eab09969354e92d2717680194f981a GIT binary patch literal 637 zcmeAS@N?(olHy`uVBq!ia0vp^5N^5+IfWVg?501&j>LK$;OGwtxvPE3tqX&K3YEyyR+^1620h)5S5w zLU8L8+x3}_B5m>4Lo=_ibSl)fHoa-jT-T&=MM}1Jg^8V3r-z4%-6QcAD_j;S zh;RtaElpdSvOC(ZTvmJL%)QSZ*QV_^u9jw)pe5hEf7YhM4;{3oHeJoSy6fNSyLsDJ zTz`Ed$L##qB}ZPCSY6C#&EB|7>4N;R59f5nxSbXX@UR_@R+ZuF7RxT;aM+w`AmQ=c zI&}a2=}%`ZWBAfkBR2UY%k|fymtTs^DgIGocPGzWLwae5mgtu%Taj*8$^XB89je;f zb}?g0Onl(lFyY^!>ZQA5cin$~CC6;((>cEvU(|T}y}D@k-6tO_PUM&c+s$8o{ITQ4 zh@P_DvZhkJGfyY2Ir&=R3zLOh|COw*DI4zQ2|u?{pM91qVQ0*xr$q~W)SO@K$*_<) z^-Qe0)uD2o+=s(TYI1z+c?-&P%07I~Fmc)$<7ObyQe{2GOLZrY+T_mm`Qpw(v0s@D zW}g+{V0rMhYUxuOxqjuje#%0f2c8xk%-il9>-wa~^2gsg6(LSw$b_s8o%?0~aq;de zNkQ#CuO?*L$O%9H{4+-9Rf$!J-TcnC0f&s%2WWJ(*6^*q>Xmaj`p67%hUf3aY#nqS zouA!ozop#y@&%K~{yBcnkJpK^u^G5JPViBy|C|1u#o&qXM_%7&j|^tq@OA`6y{D_6 J%Q~loCIA{B{}liL literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/voice_speed/voice_speed0.5@2x.png b/Telegram/Resources/icons/voice_speed/voice_speed0.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ee279c33368c64c4a67e81676f929c92de400974 GIT binary patch literal 1223 zcmV;&1UUPNP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91AOHXW0K3=wjsO4zF-b&0R9FesSj#K5T@>Gk&t*bP z$R#DWfkGJ|rIcI}Lj$DvA4p70TnYmNnP4Wx#C;-Bj3~Lyl$2|fYbdw%t>0#^cRz=7 zyr;MCd(T<*oW1s1Yp>_G_F8*A&v{%*DdH<&DJWo(e**uEz^u{Dpu8n1Id3`pG-NFD)(k3+^vCfbE+geg%Li{hff( zEepQ_u*+s)VSy486Wxvf_c<^Ciy>hAHUK`b#zv3+0Nwxv7Mp<8=%kIhcbntmW47@R za>rt0l>qz$s_!U%JAksXGBr0hr%Yd-pPyId<>lYrF*!L|ZEtTYPWzXOYgnbFrKyUF z3UzdJq-JJjR9IM;!%tCBk-E6JP+a?8bPmJMiLR&I++4fNq{i4r_u%*UcZVJm$lBW4 z9Ja9U=;-)jYYU2ti)mtFLPT9%UE(7$GLkqj(WRuMXq^a{0ao1S^ZH;s1(2SePA@Mn z_Id~Z`ua*485zcz9!Ez}Ej)ZpNt_<+Ca>S~$q@9z_` zVQfXgj86eJwx61@r5Hn0Quu?z7+_VGas)UfL2=0N9*zh42 zK0G{Jg@lC29E|(iq5Ni|qeWCUv7MH$udjl z+gokV;AwAf&$yBC>FJ4ba&jC#Mahg$8Q9v|VoV=YP*7l4m7kw4yln#^dOIINRZ~+V zHld-Ripx&V&(F{G*x%o;GBYzZzp}ET`uh4bkE~2iPAWdcdj8Xoj?_~I_@N_h6uX6* z#f6RpLJP#ayStn2@9(Lzvy=E?r*$}#y}i9uTU+aRAsZSRqRPrjZG#^!M@mXcA}$@W zGd?~(E?E#`X6y_gIIjUf-_p`TZ*On556wf?+}y0!13U<0U0ofSj-rLu51$K)ii)De z#YK_U*VhYBv}pTKM@L6%oftFYa{vgUw6v6FXJ_^9Vu!&)W;Vdi0AzW2dHQJ!TXZAT ze@{;jMMOmCH4P07#IFl9FfbrKj4!n7%gaj|8yged9|vHZ|ER3T)LB6PrQ|Kvug!L?`6KW3Pdz?a1oUSWWFgQ#Y`Fm1(+LfPPm5jy l@D!Lo$)%0@6DVJ>{0nSGtHNRVALRf5002ovPDHLkV1l>PCyxLC literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/voice_speed/voice_speed0.5@3x.png b/Telegram/Resources/icons/voice_speed/voice_speed0.5@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2d7c14d6cc0cf53e04bc368bc0d5b0b9b96a5cba GIT binary patch literal 1994 zcmV;*2Q~PKP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91FaQ7m09ljm;Q#;!G)Y83RA>e5T4|`xO%$Jdz4o2R z5|J%Y$QJox$yN#@Knbpp1tog9i_)ojZ4`j~_oKt`|W%`WrA{06lv2 zh>9w~HrSZT{=EJ;I8&!iEvmQ#cEQ$sKnei@s+mTqJSoSx5to_}b8g?ht!mY(Wx6t= zeEj&aYSgGvG$sl68Z>B7;5=Wxe4$B`CQ;3rHH9oASLoWX0k*&_K2Mlpkv35`QwU&=lF)hlYD~hzFd$f#`2sePoD6&qD3*AVzvhW z<>Vl4XUQNC0K{%*c-fK>2mne4mEy&Vt6{^2sl$g4E4VDb8PwCKPt}nlN7V4)!&QkA zB@)%ut5;8*I(15q#luPU`}FCPnlopP)>p1vIkjWQ4)yl!TRm5`YSmKC)4X|eb@l31 z_4@T|HEr6olydnoL}0pb;esE#1fLb@c9SMe=*Ep3fvnqc>((u5+O%nOywS6M{d#vu zV!dqHvNUnxL?L(P%o)nf%?;*ZAnESiyF#{g>(*9IFt`ER&ALqaTOL%WP91gP#0kY9 zv7Xd~#0zpb#ZOx;T(~eM zrapiEtoH8Rt4zjw<;oSYg|P)&wrr``YxVffoja?eM~{lNV_Wv`-{0zIr?GWZE?&H- z+O%mS`p^(=m9)iLv}oabrf#1*ca9b;SU_<17_p~_dCa`uzJ0Ue3_w)I$hzg|(WC7+ zQ{h;qw_0p#-Me>>Dp#&7^qX;}jBPQVGd+OVZH+!#u3WiNOuT&ga?3N7*|TR08O&Ru zLIuOt<=VAttqglDl`2)rw*7UYy?y(3F&>SvW5?2xB}+s5l-!F+k|$_!6C*Z|sB|rvZT+o~lc`ckkA~xP7Mn;ll?SIB;N~ zqg}gp#DUj{1?7ef8-g+BLHWWlfYN@8@jhn#zX;ctF?#s$q3HIUFT`G<2Nd41LV)~{P}agOSfOVcp>_E zyNEU#c;j%8w*7b$O_(r2ztsTV;K75{`}glHAAM7%OtEcKNtGxfQ7u-im=XK!Qn(=8 z%qP}tW&AC+Xwf3ebLIGTE!5!t*X5f!rwg=k<3?J#bSX7%+&GXy&~?e*23@*zp&vhf zxFVvyZQHg$rLi1C-=*EbR+?E{P=O9cgvP7(FJVYyjjS_t`aa`(%Z^UD-er} zfmN$kEzq9|qehLgW6W5TKE(h^dyAbtdzN+oqW10Ei)0KOB$nuR$sY$^!-fqNVimU0 z)~#Dr>C&a$A-e8g{W3sSX3d&4!PW54p+oh#&wZjh}#nL@EMOdpxZuF?%cUU$e^)4{9*|$w!Pt_^eMK* zST4O71o_&vYZLOCf)M0*o9KnTdGkgL89#nJA&)93EnBus>p?(w>HGKZ)UjhnVLV^O z5T^jHn68_({8fOU98dAuwQIow+z#*|XCA_(OP5?W@n727>yXUlM*v{);>EEqxlkhe<~t)Rip;!5jT%?>D+q5gR}bPB4#n_DoclP}5qwv+Q>RXJ z^X5&0KEyni_tyb(Co7Egf&dh}=KZ@LHaw##0Ekh|Xh3}91Ay@Tj8FV0o8MLF+cBGB zwg&*kPUl003@P-0_y)vmirJ2FBC=;cUXXYMm-gAuU*sow!4|_ed$GSzd>1WhZP=XZ zdquIu%$Cc3f@imytpq@2KjP&3syvTLxnmHMGWj#$M1WEvmm!QGNN0%M1vWDaPy$q0 cfD!=u7njX={ORG<6951J07*qoM6N<$f=Nu`zyJUM literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/voice_speed/voice_speed1.5.png b/Telegram/Resources/icons/voice_speed/voice_speed1.5.png new file mode 100644 index 0000000000000000000000000000000000000000..cae61e3e96b64ca516816e225e87b86aafbf5f3a GIT binary patch literal 603 zcmeAS@N?(olHy`uVBq!ia0vp^5N^5+IfWVg?501&j>LK$;OGwtxvPE3tqX&K3YEyyR+^15|d@)5S5w zLU8Mp{p%bZ1&-}M?7PKE(Mg1ZtM!m{hQ|sMDXTzD7tO%SlU9gilnCuX1=Q(eAr_DMp-!4em*;4DpIMlOoKxS?BW05V8A}K5D|A z<};NFxS!1aQe}I=RIt>zMToOA(?n|0a^ZE8*&D0&^0gmU zWSDbl^YAxG3 zeMdv7UI&L9GwF!6VJA05$aQ_({;y@_^yG~aMLT7@mJ0o;vp@83!<)J1)4%+#y}%ow zH$6~CY-xzqN2{OT+1d{?{yFr4bLYMgr7gE}O=kNR*sr>(WuYd)qcqnq*>1kF2$$#K z_QMbNvdL9B2=1D<{!D(gLhIwpn?81bTQ`$u@=2SgU#s?iTWJu{5bDA5v*zDpd28JR cO7}O!Kib!P^Qvic5-4IlUHx3vIVCg!0KbRsNB{r; literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/voice_speed/voice_speed1.5@2x.png b/Telegram/Resources/icons/voice_speed/voice_speed1.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..680a02eb9ffec0db14a2fbba912d473711e6151b GIT binary patch literal 1158 zcmV;11bO?3P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91AOHXW0K3=wjsO4y@JU2LR9FesSWPHxQ54?yxc-?!J=>)dl)N-4k=vf>U|e{s<%|C##f{6n`%N-FA9$`3RKR-Y36x@H{AZ#`yJ_ry?rwd{9ioyp0 zGi_#OW*{{+)!X^o`-Fk8Xd#TY1n|OYAAULkyaq~GOd+h=CS}yS+8iGrqmMJh8;glm z2si_3@F+e_ASNb8jf{+_ySqEJwzj4+GBRv;Yiepz*VoqyLvCqrZ*OX1VuI&HMn=zXk1^fH^;yXM%%;QBxMezFi%Hy}U zw~(HmE_;YGDnSv*&(8-;8yFuShpMV7S;vk*Vq&7$>+9=zbGO?qAoO9;GcPX>o}QlA zAJdD8Zf|eP{L0Eo%RDil5)=X2%;j?NVwjV%jvaxltSqrNG&FGizQ4bRo0}V$oScND zq$CTdmX;Rr*HNZ{fq?;wA7L;hXaf4=0ui8e(_*HZ9^2a5f{2I+3%Kd&X>I1`^71lx zJRXaWKLVewLbymk+1S`nS65eDea6PdR6;@mH++-w+|0~ORZ~+V>tJLRUSR2yg5VX6 z2P4eZ*Cob<WKJOEpCS++9}ny6 z>wqsM=<4c{gQALpFEwr#7Z*HE)g~t=2dIqh?(T|jTU#4rXl!hhF)E`-Tp}R`RLlqv zxla=?FR2c5ZEdZrJv1}~b8~aj_f~p)dwH+w>S{49E-r#uYNw{A#MaT#@wEhKquJS6 z*xTEaQ!pbywVggVnwy(pb#;~BAD5Sxu&}TI6%`c%1}`^9ZF6(ea>{g=v9YnRva-T^ zU`omyVTHD`=h!y7H_PQXCeJbiAT(TU6{G% zMBVR4Jynp9{#%8jKqQEznNB|)3Bp2{Z2l7h`qe~tz*a)xuSLHEY*{&MP|B#oaD5ui YFU3w#R!p2w_W%F@07*qoM6N<$g4@0NbpQYW literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/voice_speed/voice_speed1.5@3x.png b/Telegram/Resources/icons/voice_speed/voice_speed1.5@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..07faa2ea1ea36eb897bc3ebded1a0edf7d9bdd1f GIT binary patch literal 1865 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 saved() const; + +protected: + void contextMenuEvent(QContextMenuEvent *e) override; + +private: + class SpeedController final { + public: + SpeedController() { + setSpeed(Core::App().settings().voicePlaybackSpeed()); + } + + [[nodiscard]] rpl::producer speedValue() const { + return _speedChanged.events_starting_with(speed()); + } + [[nodiscard]] rpl::producer<> saved() const { + return _saved.events(); + } + [[nodiscard]] float64 speed() const { + return _isDefault ? 1. : _speed; + } + [[nodiscard]] bool isDefault() const { + return _isDefault; + } + [[nodiscard]] float64 lastNonDefaultSpeed() const { + return _speed; + } + void toggleDefault() { + _isDefault = !_isDefault; + _speedChanged.fire(speed()); + } + void setSpeed(float64 newSpeed) { + if (!(_isDefault = (newSpeed == 1.))) { + _speed = newSpeed; + } + _speedChanged.fire(speed()); + } + void save() { + Core::App().settings().setVoicePlaybackSpeed(speed()); + Core::App().saveSettingsDelayed(); + _saved.fire({}); + } + + private: + float64 _speed = 2.; + bool _isDefault = true; + rpl::event_stream _speedChanged; + rpl::event_stream<> _saved; + }; + + SpeedController _speed; + + base::unique_qptr _menu; + +}; + +Widget::SpeedButton::SpeedButton(QWidget *parent, const style::IconButton &st) +: IconButton(parent, st) { + setClickedCallback([=] { + _speed.toggleDefault(); + _speed.save(); + }); + + struct Icons { + const style::icon *icon = nullptr; + const style::icon *over = nullptr; + }; + + _speed.speedValue( + ) | rpl::start_with_next([=](float64 speed) { + const auto isDefaultSpeed = _speed.isDefault(); + const auto nonDefaultSpeed = _speed.lastNonDefaultSpeed(); + + const auto icons = [&]() -> Icons { + if (nonDefaultSpeed == .5) { + return { + .icon = isDefaultSpeed + ? &st::mediaPlayerSpeedSlowDisabledIcon + : &st::mediaPlayerSpeedSlowIcon, + .over = isDefaultSpeed + ? &st::mediaPlayerSpeedSlowDisabledIconOver + : &st::mediaPlayerSpeedSlowIcon, + }; + } else if (nonDefaultSpeed == 1.5) { + return { + .icon = isDefaultSpeed + ? &st::mediaPlayerSpeedFastDisabledIcon + : &st::mediaPlayerSpeedFastIcon, + .over = isDefaultSpeed + ? &st::mediaPlayerSpeedFastDisabledIconOver + : &st::mediaPlayerSpeedFastIcon, + }; + } else { + return { + .icon = isDefaultSpeed + ? &st::mediaPlayerSpeedDisabledIcon + : nullptr, // 2x icon. + .over = isDefaultSpeed + ? &st::mediaPlayerSpeedDisabledIconOver + : nullptr, // 2x icon. + }; + } + }(); + + setIconOverride(icons.icon, icons.over); + setRippleColorOverride(isDefaultSpeed + ? &st::mediaPlayerSpeedDisabledRippleBg + : nullptr); + }, lifetime()); +} + +void Widget::SpeedButton::contextMenuEvent(QContextMenuEvent *e) { + _menu = base::make_unique_q( + this, + st::mediaPlayerPopupMenu); + + const auto setPlaybackSpeed = [=](float64 speed) { + _speed.setSpeed(speed); + _speed.save(); + }; + + const auto currentSpeed = _speed.speed(); + const auto addSpeed = [&](float64 speed, QString text = QString()) { + if (text.isEmpty()) { + text = QString::number(speed); + } + const auto action = _menu->addAction( + text, + [=] { setPlaybackSpeed(speed); }, + (speed == currentSpeed) ? &st::mediaPlayerMenuCheck : nullptr); + }; + addSpeed(0.5, tr::lng_voice_speed_slow(tr::now)); + addSpeed(1., tr::lng_voice_speed_normal(tr::now)); + addSpeed(1.5, tr::lng_voice_speed_fast(tr::now)); + addSpeed(2., tr::lng_voice_speed_very_fast(tr::now)); + + _menu->popup(e->globalPos()); +} + +rpl::producer<> Widget::SpeedButton::saved() const { + return _speed.saved(); +} + Widget::PlayButton::PlayButton(QWidget *parent) : Ui::RippleButton(parent, st::mediaPlayerButton.ripple) , _layout(st::mediaPlayerButton, [this] { update(); }) { resize(st::mediaPlayerButtonSize); @@ -146,15 +294,10 @@ Widget::Widget(QWidget *parent, not_null session) instance()->toggleRepeat(AudioMsgId::Type::Song); }); - updatePlaybackSpeedIcon(); - _playbackSpeed->setClickedCallback([=] { - const auto doubled = (Core::App().settings().voicePlaybackSpeed() - == 2.); - Core::App().settings().setVoicePlaybackSpeed(doubled ? 1. : 2.); + _playbackSpeed->saved( + ) | rpl::start_with_next([=] { instance()->updateVoicePlaybackSpeed(); - updatePlaybackSpeedIcon(); - Core::App().saveSettingsDelayed(); - }); + }, lifetime()); subscribe(instance()->repeatChangedNotifier(), [this](AudioMsgId::Type type) { if (type == _type) { @@ -403,16 +546,6 @@ void Widget::updateRepeatTrackIcon() { _repeatTrack->setRippleColorOverride(repeating ? nullptr : &st::mediaPlayerRepeatDisabledRippleBg); } -void Widget::updatePlaybackSpeedIcon() { - const auto speed = Core::App().settings().voicePlaybackSpeed(); - const auto isDefaultSpeed = (speed == 1.); - _playbackSpeed->setIconOverride( - isDefaultSpeed ? &st::mediaPlayerSpeedDisabledIcon : nullptr, - isDefaultSpeed ? &st::mediaPlayerSpeedDisabledIconOver : nullptr); - _playbackSpeed->setRippleColorOverride( - isDefaultSpeed ? &st::mediaPlayerSpeedDisabledRippleBg : nullptr); -} - void Widget::checkForTypeChange() { auto hasActiveType = [](AudioMsgId::Type type) { const auto current = instance()->current(type); diff --git a/Telegram/SourceFiles/media/player/media_player_widget.h b/Telegram/SourceFiles/media/player/media_player_widget.h index e9d3bd747..a676af2cb 100644 --- a/Telegram/SourceFiles/media/player/media_player_widget.h +++ b/Telegram/SourceFiles/media/player/media_player_widget.h @@ -35,6 +35,7 @@ namespace Media { namespace Player { class PlayButton; +class SpeedButton; class VolumeWidget; struct TrackState; @@ -77,7 +78,6 @@ private: void updateRepeatTrackIcon(); void updateControlsVisibility(); void updateControlsGeometry(); - void updatePlaybackSpeedIcon(); void createPrevNextButtons(); void destroyPrevNextButtons(); @@ -113,6 +113,7 @@ private: bool _labelsDown = false; class PlayButton; + class SpeedButton; object_ptr _nameLabel; object_ptr _timeLabel; object_ptr _previousTrack = { nullptr }; @@ -120,7 +121,7 @@ private: object_ptr _nextTrack = { nullptr }; object_ptr _volumeToggle; object_ptr _repeatTrack; - object_ptr _playbackSpeed; + object_ptr _playbackSpeed; object_ptr _close; object_ptr _shadow = { nullptr }; object_ptr _playbackSlider;