From d1230167bff1b150d9bf6181ecf679b1209f7ac8 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 24 Feb 2023 11:43:02 +0400 Subject: [PATCH] Improve title controls in Windows media viewer. --- .../download.png} | Bin .../download@2x.png} | Bin .../download@3x.png} | Bin .../file_corner.png} | Bin .../file_corner@2x.png} | Bin .../file_corner@3x.png} | Bin .../more.png} | Bin .../more@2x.png} | Bin .../more@3x.png} | Bin .../next.png} | Bin .../next@2x.png} | Bin .../next@3x.png} | Bin .../rotate.png} | Bin .../rotate@2x.png} | Bin .../rotate@3x.png} | Bin .../save_check.png} | Bin .../save_check@2x.png} | Bin .../save_check@3x.png} | Bin .../icons/mediaview/shadow_bottom.png | Bin 0 -> 210 bytes .../icons/mediaview/shadow_bottom@2x.png | Bin 0 -> 304 bytes .../icons/mediaview/shadow_bottom@3x.png | Bin 0 -> 461 bytes .../Resources/icons/mediaview/shadow_top.png | Bin 0 -> 2152 bytes .../icons/mediaview/shadow_top@2x.png | Bin 0 -> 6985 bytes .../icons/mediaview/shadow_top@3x.png | Bin 0 -> 14022 bytes .../mediaview/title_viewer_button_close.png | Bin 0 -> 280 bytes .../title_viewer_button_close@2x.png | Bin 0 -> 451 bytes .../title_viewer_button_close@3x.png | Bin 0 -> 653 bytes .../title_viewer_button_maximize.png | Bin 0 -> 300 bytes .../title_viewer_button_maximize@2x.png | Bin 0 -> 388 bytes .../title_viewer_button_maximize@3x.png | Bin 0 -> 606 bytes .../title_viewer_button_minimize.png | Bin 0 -> 236 bytes .../title_viewer_button_minimize@2x.png | Bin 0 -> 296 bytes .../title_viewer_button_minimize@3x.png | Bin 0 -> 414 bytes .../mediaview/title_viewer_button_restore.png | Bin 0 -> 423 bytes .../title_viewer_button_restore@2x.png | Bin 0 -> 639 bytes .../title_viewer_button_restore@3x.png | Bin 0 -> 921 bytes .../mediaview/title_viewer_shadow_close.png | Bin 0 -> 419 bytes .../title_viewer_shadow_close@2x.png | Bin 0 -> 660 bytes .../title_viewer_shadow_close@3x.png | Bin 0 -> 934 bytes .../title_viewer_shadow_maximize.png | Bin 0 -> 360 bytes .../title_viewer_shadow_maximize@2x.png | Bin 0 -> 554 bytes .../title_viewer_shadow_maximize@3x.png | Bin 0 -> 722 bytes .../title_viewer_shadow_minimize.png | Bin 0 -> 259 bytes .../title_viewer_shadow_minimize@2x.png | Bin 0 -> 361 bytes .../title_viewer_shadow_minimize@3x.png | Bin 0 -> 481 bytes .../mediaview/title_viewer_shadow_restore.png | Bin 0 -> 450 bytes .../title_viewer_shadow_restore@2x.png | Bin 0 -> 699 bytes .../title_viewer_shadow_restore@3x.png | Bin 0 -> 969 bytes Telegram/Resources/icons/mediaview_close.png | Bin 172 -> 0 bytes .../Resources/icons/mediaview_close@2x.png | Bin 351 -> 0 bytes .../Resources/icons/mediaview_close@3x.png | Bin 495 -> 0 bytes .../SourceFiles/media/view/media_view.style | 71 +++++-- .../media/view/media_view_overlay_opengl.cpp | 8 +- .../media/view/media_view_overlay_opengl.h | 2 +- .../media/view/media_view_overlay_widget.cpp | 32 ++- .../media/view/media_view_overlay_widget.h | 2 - .../platform/mac/overlay_widget_mac.mm | 3 - .../platform/platform_overlay_widget.cpp | 187 +++++++++++++++++- .../platform/platform_overlay_widget.h | 22 +++ Telegram/SourceFiles/ui/chat/chat.style | 12 +- 60 files changed, 286 insertions(+), 53 deletions(-) rename Telegram/Resources/icons/{mediaview_download.png => mediaview/download.png} (100%) rename Telegram/Resources/icons/{mediaview_download@2x.png => mediaview/download@2x.png} (100%) rename Telegram/Resources/icons/{mediaview_download@3x.png => mediaview/download@3x.png} (100%) rename Telegram/Resources/icons/{mediaview_file_corner.png => mediaview/file_corner.png} (100%) rename Telegram/Resources/icons/{mediaview_file_corner@2x.png => mediaview/file_corner@2x.png} (100%) rename Telegram/Resources/icons/{mediaview_file_corner@3x.png => mediaview/file_corner@3x.png} (100%) rename Telegram/Resources/icons/{mediaview_more.png => mediaview/more.png} (100%) rename Telegram/Resources/icons/{mediaview_more@2x.png => mediaview/more@2x.png} (100%) rename Telegram/Resources/icons/{mediaview_more@3x.png => mediaview/more@3x.png} (100%) rename Telegram/Resources/icons/{mediaview_next.png => mediaview/next.png} (100%) rename Telegram/Resources/icons/{mediaview_next@2x.png => mediaview/next@2x.png} (100%) rename Telegram/Resources/icons/{mediaview_next@3x.png => mediaview/next@3x.png} (100%) rename Telegram/Resources/icons/{mediaview_rotate.png => mediaview/rotate.png} (100%) rename Telegram/Resources/icons/{mediaview_rotate@2x.png => mediaview/rotate@2x.png} (100%) rename Telegram/Resources/icons/{mediaview_rotate@3x.png => mediaview/rotate@3x.png} (100%) rename Telegram/Resources/icons/{mediaview_save_check.png => mediaview/save_check.png} (100%) rename Telegram/Resources/icons/{mediaview_save_check@2x.png => mediaview/save_check@2x.png} (100%) rename Telegram/Resources/icons/{mediaview_save_check@3x.png => mediaview/save_check@3x.png} (100%) create mode 100644 Telegram/Resources/icons/mediaview/shadow_bottom.png create mode 100644 Telegram/Resources/icons/mediaview/shadow_bottom@2x.png create mode 100644 Telegram/Resources/icons/mediaview/shadow_bottom@3x.png create mode 100644 Telegram/Resources/icons/mediaview/shadow_top.png create mode 100644 Telegram/Resources/icons/mediaview/shadow_top@2x.png create mode 100644 Telegram/Resources/icons/mediaview/shadow_top@3x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_close.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_close@2x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_close@3x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_maximize@2x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_minimize.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_minimize@2x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_minimize@3x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_restore.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_restore@2x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_button_restore@3x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_close.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_close@2x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_close@3x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@2x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@3x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@2x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@3x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_restore.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@2x.png create mode 100644 Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@3x.png delete mode 100644 Telegram/Resources/icons/mediaview_close.png delete mode 100644 Telegram/Resources/icons/mediaview_close@2x.png delete mode 100644 Telegram/Resources/icons/mediaview_close@3x.png diff --git a/Telegram/Resources/icons/mediaview_download.png b/Telegram/Resources/icons/mediaview/download.png similarity index 100% rename from Telegram/Resources/icons/mediaview_download.png rename to Telegram/Resources/icons/mediaview/download.png diff --git a/Telegram/Resources/icons/mediaview_download@2x.png b/Telegram/Resources/icons/mediaview/download@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_download@2x.png rename to Telegram/Resources/icons/mediaview/download@2x.png diff --git a/Telegram/Resources/icons/mediaview_download@3x.png b/Telegram/Resources/icons/mediaview/download@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_download@3x.png rename to Telegram/Resources/icons/mediaview/download@3x.png diff --git a/Telegram/Resources/icons/mediaview_file_corner.png b/Telegram/Resources/icons/mediaview/file_corner.png similarity index 100% rename from Telegram/Resources/icons/mediaview_file_corner.png rename to Telegram/Resources/icons/mediaview/file_corner.png diff --git a/Telegram/Resources/icons/mediaview_file_corner@2x.png b/Telegram/Resources/icons/mediaview/file_corner@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_file_corner@2x.png rename to Telegram/Resources/icons/mediaview/file_corner@2x.png diff --git a/Telegram/Resources/icons/mediaview_file_corner@3x.png b/Telegram/Resources/icons/mediaview/file_corner@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_file_corner@3x.png rename to Telegram/Resources/icons/mediaview/file_corner@3x.png diff --git a/Telegram/Resources/icons/mediaview_more.png b/Telegram/Resources/icons/mediaview/more.png similarity index 100% rename from Telegram/Resources/icons/mediaview_more.png rename to Telegram/Resources/icons/mediaview/more.png diff --git a/Telegram/Resources/icons/mediaview_more@2x.png b/Telegram/Resources/icons/mediaview/more@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_more@2x.png rename to Telegram/Resources/icons/mediaview/more@2x.png diff --git a/Telegram/Resources/icons/mediaview_more@3x.png b/Telegram/Resources/icons/mediaview/more@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_more@3x.png rename to Telegram/Resources/icons/mediaview/more@3x.png diff --git a/Telegram/Resources/icons/mediaview_next.png b/Telegram/Resources/icons/mediaview/next.png similarity index 100% rename from Telegram/Resources/icons/mediaview_next.png rename to Telegram/Resources/icons/mediaview/next.png diff --git a/Telegram/Resources/icons/mediaview_next@2x.png b/Telegram/Resources/icons/mediaview/next@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_next@2x.png rename to Telegram/Resources/icons/mediaview/next@2x.png diff --git a/Telegram/Resources/icons/mediaview_next@3x.png b/Telegram/Resources/icons/mediaview/next@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_next@3x.png rename to Telegram/Resources/icons/mediaview/next@3x.png diff --git a/Telegram/Resources/icons/mediaview_rotate.png b/Telegram/Resources/icons/mediaview/rotate.png similarity index 100% rename from Telegram/Resources/icons/mediaview_rotate.png rename to Telegram/Resources/icons/mediaview/rotate.png diff --git a/Telegram/Resources/icons/mediaview_rotate@2x.png b/Telegram/Resources/icons/mediaview/rotate@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_rotate@2x.png rename to Telegram/Resources/icons/mediaview/rotate@2x.png diff --git a/Telegram/Resources/icons/mediaview_rotate@3x.png b/Telegram/Resources/icons/mediaview/rotate@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_rotate@3x.png rename to Telegram/Resources/icons/mediaview/rotate@3x.png diff --git a/Telegram/Resources/icons/mediaview_save_check.png b/Telegram/Resources/icons/mediaview/save_check.png similarity index 100% rename from Telegram/Resources/icons/mediaview_save_check.png rename to Telegram/Resources/icons/mediaview/save_check.png diff --git a/Telegram/Resources/icons/mediaview_save_check@2x.png b/Telegram/Resources/icons/mediaview/save_check@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_save_check@2x.png rename to Telegram/Resources/icons/mediaview/save_check@2x.png diff --git a/Telegram/Resources/icons/mediaview_save_check@3x.png b/Telegram/Resources/icons/mediaview/save_check@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_save_check@3x.png rename to Telegram/Resources/icons/mediaview/save_check@3x.png diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom.png b/Telegram/Resources/icons/mediaview/shadow_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf350f2b9ee612b77eebfaffc58054460fc0583 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^j6m$h!2~3mv@$^wjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(gTe~DWM4f_uni= literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom@2x.png b/Telegram/Resources/icons/mediaview/shadow_bottom@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6d0c8762d26e9f53a29512a36a0b00a8241e2181 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^OhDYj0U~eay}u2l7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TW!7X#q2w-2+ni_}r#QAT`U=#W6%f z^lq>t-vI><;m7~?zv-G1VC=89`%H=>cdn?B@#bq$$B#2C5MC2=e3h`bL`%DtW#aEu zGE0@FGHkq)cy6c49fKnc2FDrVRxt=pm9}4axnE1Q?e5z6Pku?0gxPbRZrR)4lKkM$ zw>dsJrNQmW?=Ia9=4Ly%qx5F#rGn literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png b/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..52ea5cfd1e65a639165ffc66bd158f3d52c41e16 GIT binary patch literal 461 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 R>;K+Z`r0O1H5x9F{}1={bL0R3 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/shadow_top@3x.png b/Telegram/Resources/icons/mediaview/shadow_top@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..57d6e4fdb3ca9379f34793ea1eefeda0984e5ed8 GIT binary patch literal 14022 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 Zg(TPYaGlfPfB%qaztDePqh=TR{{TiRgmnM_ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_close.png b/Telegram/Resources/icons/mediaview/title_viewer_button_close.png new file mode 100644 index 0000000000000000000000000000000000000000..6cacc40cf2f52eeed1e77ca6c9479182f77a4eed GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(z!2~3qsqpFoDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXD)mgv{XDfgdTF&EI1f-fgT^vIq zINwgW%juxV(fT;=8k66Hf6hNjS{zw~hI*D~(3 wl=IJ9=FT=eE9(EH>%3O8nTZ1f3lO!j)J>}JmhP6nHVNb^Pgg&ebxsLQ09o)*DgXcg literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_close@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..04a35b7db1177299141877e468c8bc84d5498efe GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^5kTy~!2~1)i`1tADaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDjaa}8XFGrtZWovm3{Eakt z!T9#ZLB1vfftJKaH`5>ez0b-gQ+2#kN@dB*JWtNp&&5I#UeB3Tjd*l86dD+quoE9@ z^y}Jh?WuoaJvqzt{O3(Nk1eX6Eu3-avdK#ae>)$y+K`;s>r*CWE^J8RdOe}O`GV-} zS5tN8Y&6*JP_`(|(|Cfc*^^^VR}Zb55PH@#ojcupmUAn=OqP7u;p?llHt7GabemG| zvYL%w?4Hh?{;S@vZS`d59?WfgTXw``@?o>*ue;2+dFy6rYuyVe zQLTqsV}1SZUQ|d6HNFry^Kx+Ew31_f{*RwA|CIi>m!avw(KF{4z0&PI6#8@a`%1rl fT;6LqP|Boly3k&2(#^IvpaArA^>bP0l+XkKDBqUU literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_close@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_close@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..74b637e15bbede7ca164bd84e33c7a9aa99f1f7e GIT binary patch literal 653 zcmeAS@N?(olHy`uVBq!ia0vp^EkK;W!2~3OKl`QtDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDZCSt!XD5IZ3I{z&2P*sS>Eakt z!T9!;Z(oyv2t$JL@q*+>hpH73OXQ&#Yk%#JDf$yU=SWVwzy8FQ16p6Q9Cod{X4T00 zt~I!{_GFZ}$0Bv<>)D+d;xjI9ztgv+fBAQ=$zLVrm4)1q`1Wqc)j!W)2Ud0OyXvuR z)o01`%eKv0Yqgu>%=V)NOMiViyOI0aI#+dVL2iNe{k^egFCTrbEvS3)SjoO?YgxoD zi2LPU-EFn_fY$e{0}-c}i#7VZIJ05e#4q!rU1CJ;?9O@lN4r2f$jkj|a*b(rX;S|w z%i?cNPJNeVC;huOdsQ8i#ZCEpvu`Clop=8E*Q&ku-!I*&q$;Gm*Cg;y$br{$g9Yz% hk{bB1C=1Z~!0q{LPwxY>OP~bD;OXk;vd$@?2>^k;^wR(U literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png new file mode 100644 index 0000000000000000000000000000000000000000..84df61a0aed7ab53308b363096af4c8ea0e07c35 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(z!2~3qsqpFoDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXD)mgv{XDfgdTF&EI1f-^Ux;TbJ zaK4?gk&{7@$Mva20f)Eyg~*tbig%8m<6JZMz^PYyy{!wJxYk?LNg3+5{cvb?IKaRI zM1O8JT(f%qN2f_ZwBUVxF~7z0thLu}y*wzuBwF!)dCAlie#NCaOP5SpCd(OkP$YNK z^|snJ1D9}K;kzuqOSfE`5_D|Fy~GI4qY~{`I?r~Ve|2Qe3r=PO24;hTGY7aAcLj?c S2{^eF0*24t`p$U&>UQ9bwOY*#j7%&X z0tyZdsEj|G9b&IPw$MBM$*-@&#o&?o#qQ~zTp~{e?HL~x9+KI(!T0i+&o;inS-bYV z-@PvS`qtdrAs-eUz5R>t@PyiZ9XU61J~;gS?C@-wpuq1o`53QWsUvvaHxKEM$ zCkSLuVX|8E|s+fW=*-nPjSi|c^y ceQ=CPen+IB%k$C?iJ%bhboFyt=akR{0P#9}C;$Ke literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7dca97312ab495edfb0e679be798d2a464754cca GIT binary patch literal 606 zcmeAS@N?(olHy`uVBq!ia0vp^EkK;W!2~3OKl`QtDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDZCSt!XD5IZ3I{z&2P!+^>Eakt z!T9#p#!eI(ebTg{jlaP;%Bp4~0NYHD}{_Trumf|N5U{vg&nT zcUeevci+aw`RRLBZNC5hHK+M(-v^;{rEcF_v~Np=!iRkQjkX(3d^q*>98c_ys}CN1 mK6|K(v_OOf{ej(_f0$}-`EOaFd~F&iZarQ7T-G@yGywohztf-q literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_minimize.png b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize.png new file mode 100644 index 0000000000000000000000000000000000000000..b1577578a7704d5c3036759d7b54bcbc8fd9941a GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(z!2~3qsqpFoDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXD)mgv{XDfgdTF&EI1f;?|T^vIq zINx5_%?q^E!SQV(aZ>bfF;lJi5W#W&=<=r$4l&b}92yuHnOHak6llZv z&KmbUy8h10Ag!e>0&+3sJ%QP|Yi(y#)?Kmby!SiZ@$3!BeajzIpWj$?&hVJ%W)N5D r=Z!P}Yb5{mBEaj? z!TENIAy>15fUEC@0LSc&fzf+gDpLcC^q#byfkGwc+QJkS4U)$j%Erk z%QfF1mb6t5-@o~HJ~^VTk%`Fx=$=MP?@Y)gz3%WL~4`0}#J)YQ(``(Hh_aI5>CTpGJPQ);g2)Bcl%GN{g)5S5Q zg7NK*jjNgxMA$#<3E^{8aV%c&;F8S62f{bP`Y%eGT$!=?;RWU=dHxp!SoSus^a^%( zi|8HQ%f3g1w|41^>EFNQb9}abWx2mEzV2yJg(Cx#Km!Ad0s|w50|s-GmckxwL)SpI zX2-2jwNnn{ZI51mee=yX6*hKVKly*_p8i$$aO>T?=(S?)P4}+}&RXWHChX>ZAz)*K zO4HxE`xz!R_n#k_c+|UNQHF%u4U@+oExI*}PJ0TpoK15U>prUVw)@%TeGV1>oEAC+ zCvU$!Ri(4`=;xn%V)TCh-S@oG<-smJ-_@IRHuwKBUcC6?i`JPR#gcB9Ma+I|v1NLl z<0ZYR!R}wGY*)4HdvZ1FsNTw(IoGnbmhC>v=Up>J*kx(Z!YiH&FTdQ7y+G_jsqOsd zQ*M~fT>tu7dp^UX?ZEKv_`Or%wX7fuqpHll`|0yOsNb7heC3PplU^6^2;yVCR8ML zKf3Jobno+}uFq@i_Q&Y?3u?3}&DRSO)^C4pAF?!PWsKhDYzrB_<(E5Un**@~H!Ko< a2sFxPZj`Hzk5y~}MZTx2pUXO@geCxBWBLUE literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_restore@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_restore@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1651e5d620e1348ed891577815cb39266c8798ce GIT binary patch literal 921 zcmeAS@N?(olHy`uVBq!ia0vp^EkK;W!2~3OKl`QtDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDZCSt!XD5IZ3I{z&2P$Xwba4!+ zV0?SaFk8t{8~L<2rg?4HBy1vo@LWh((^QU0r{dOLX0zV!z`>yzlp*|y zkwwtO<%nB=u*jLa4bu+_+&HslXQAzXGs(H;pRe8T-n`n{-Q7mOfq{{QT;hj6OW*e| zwK1`=szRNUCksz~9KSYf@x>QEf9|}Qvv2?Y)jW!Bp$;LBwy$;He%p6x(5lRiU_p(k zUfZ%hmIv&N2|MZ3Gs(e1X5RVdx34HqKdqT+B)w(*^PcYR?g*V_73T_e-(6HU)92XZ zk83KIU(Pg;km*03w)NyU#RuPivo|;Xv3dIWXTRLPcTNg({Z1#{xqtutBY`zVTCq}5 zz90I3$LNKt2nl+h`nd61*R9uIXE$x%zCAxbKT76fMa(&cb&I3cPP_JDE{pYci6qa7N=K6l z&1RomuGO2hRjYfU(EApN=X$|@7Yu87L=GG52({`;T$;S2KS_dZyO+D+ni8JxfjoyF zguT>go7(qq-(js|MLR{lAHIHM*L@{kk!KIO0@q)^zGiFG*@pFDT+i#6uUARGI(Ys1 z_44xa$tPX@>{@4c%IC>JQRhFue*gH9!4__QI#D-xmsQ(i&9=mX)g|X*mmRsrTUei2 z`=-~;Iff&0Z@+$R(V7>D;wQxA&WdYI?RvYrdN%V>+Yg^V7oUC7QZM$QYVYBP1(UDF z{eJfB+2;gWp-rBV|nU&o9r` p`o`0hl(9@nhWte4kg%ThA47)P@>kQs{Y608!qe5yWt~$(69AGnY2p9? literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_close.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close.png new file mode 100644 index 0000000000000000000000000000000000000000..9f319e196a3d3c68d5b2520dba4958409ced214e GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(z!2~3qsqpFoDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXD)mgv{XDfgdTF&EI1XRZB>Eaj? z!TEN|L9SK>0atJBC^445jsgGwn||ZGx+pAA@ckzi$({>1i#`$m1)U}V&riO& z_V$p(CfVdO``*tpQh74rz@8g=5)pDy*#-&L2Xf{p^W2P?(&pJDcf9ugIy(tg#@#Z) zR~Y>gBgLYY^T=OR`{4J$_CRh)sl)5Vt5#*sT6B&n$^^^Q pfBrKqT~B#GC!?YQOUr@D2iVUPRCb8}O7;Q;kf*Dk%Q~loCIIUmm8}2( literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..088b66f1c07307a06500c8090c108c902aaf284f GIT binary patch literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^5kTy~!2~1)i`1tADaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDjaa}8XFGrtZWovm3{>{d)5S5Q zg7NK*+pC%!MA#nKyqV3j%ac<}|JC34Q$j9G)(+FJo|h9S!;yo;hn( z!_lNdyZQ6aFW0SG^Q~Y_U)%T1QEMk?30?CK`R_<+mp`99X~q{`(U$Kex~PqSM1QL*)45jkc+mWEDA{G?X4pOAOZNI<$99 zpNBI0!wnI7)AyD#ZdF*>a9@opaq|m5$s;GUD;f-<7Hqt`M_>({MW-T5!?Wt{~0Siinmao@e=wG&6u_S;+Yuf0-wUGBBmRm3$zd<8cr$CSTy``@cA)?TrA z7wf%9!9V8v-EW8_G-fubGBd`S&aCb1I`Ea}u)zIU6NL8ZKRA2quV3e`13dxv^*^k9 zSG4m)1V?WZXH)Kvg!#w#-_M+gD~5pa_92?(UVX&FA2M%v@<1uV)78&qol`;+0KB9M AKL7v# literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ee92d25bc0ddb25255f8d5c548ced7ac25a602a GIT binary patch literal 934 zcmeAS@N?(olHy`uVBq!ia0vp^EkK;W!2~3OKl`QtDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDZCSt!XD5IZ3I{z&2Pzlvba4!+ zV0=6KcHScc5m)Y~N`=)A_#K%3{jV1I!0553U?KzOE>-W9?L6Bi^Id*i_OT)8blID& zbLJeGvv2RmMg|rI21X7C1}1?9@|Zuk8jpob?cbHV_~MJNRaU28mh8I!eyjiY^}kly zHXLayOZ7NhV)eFc_pFmYYwqQk9e-?C7*@BnZomCZpRT%VueVf^TeXX zMkUeVb2N;-z6csD%Q7lO{NQ^|c$?cw)tHm+S6Zq*tLMMHv8Bh$uE>1h$*AcQUo5`- za?1RqyNAN(T)2Dkhv~z%UlMY$D-XW^aOir2{5|zMB1T3F8Pf|=E!I5z5m@&kX!RbS zCo0a#ygv#K{dxb!Cq+&9u6v)_r^yo^DF+MBnsxE5K<^vzx=ox9T4x_fp1NB2uD<53 zO=S~i_N?e!Q~N|k`J&4{yG;{;-sxByf8z9dshfA#f0`g@w(xG>-MsM9`s+~#E>svz z5Hwv_yZpfK1h?z$rIMOzcclI^+WDOJF#l*=b7Shl8uiqhA$PlbmdKI;Vst0Awh9 A9{>OV literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png new file mode 100644 index 0000000000000000000000000000000000000000..07e3a28e6db58d15c3ae115ffe1eb07055bea636 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(z!2~3qsqpFoDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXD)mgv{XDfgdTF&EI1f(u`x;TbJ zaK4>#kgHWe!1c9a6WgOhwblRsN8kC*F65!ml&@gay(PwFcIIW-=jTjhFRnYx&Z)qt z(!erL@WuR_Wzz+myl#HK-fHNU{nqAu^+D#+yQ@P^NL-GZzA5vr#AY3Du6)*=rBB)t zB@}oR54?Z&+LKwuiQ`6`OwwJ}_kT@%Umo81V9sHIrDspg-TCk7!EmYe8z+=IdtGh| zw(jQO(p>u3B2Sht-@|dwExyjI3uZ0Fe7g=RhIobETDPt1;gqc1h6{i6X8$%3Zu4LO dIV(Wr1AFf=<96%#vsXdB^mO%eS?83{1OQ1Jc%J|O literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..312be953486dd5f7bbafe79b206520cac1835a65 GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^5kTy~!2~1)i`1tADaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDjaa}8XFGrtZWovm3{*D7)5S5Q zg7NK)z3ZAB1l;zT;_LK*q~;~HJp z!j}EX-yR(~tu$7p z{FZ#vq_U(W9U literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5509cfa31796b1ea04f24932ff2f93f5baa41c GIT binary patch literal 722 zcmeAS@N?(olHy`uVBq!ia0vp^EkK;W!2~3OKl`QtDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDZCSt!XD5IZ3I{z&XJBBm@pN$v zsbGA2JGR>~P~_N0OXD~pajvCPik|kd?cs|BD|JWwm%YR}$p66t*{Tuyl z-^TOD+4Wfj92gkMA$~M7%}hKSIgOXCIdA*zmnB~;HypbCw#-J3zx{C8?yJuaoKRe- zv|K7^f|SARvtQ(d)@pP_ZHm$R8fWrA_xk>OleTJPF1|S9{PVYEyE7cFd`;VY^Zoa& zcI&QZhn#u-xW-Oi$>30mkzjDbfk^>gOG;FkFWvu?)mFDwlT&E<>N&Fljic61+qUvl z7c;xY+(~R~HAW$qPENl*Yq#TEzvZW&2K_ratGxK-)DX=qw~DU@i_@O?mF|tpH=BJY zx<5{)*X{DlFBkKd%H(hHT{>r5y56kBE8?>pjeA&nyb@C{@F+7b4vLU8IqY#@g-96N zSpy*ht=6doq!X|3eE)yo_~VZS7CemJHD8{Hn@XDk{c+#l!96psYL=S$%Ua3IbrQM3 zjmwL&ZoL$kaNbh(YR(m&(9O5sW?8lIc+Xk4DQ$h)ny}R=zuSZ~V^srAF~%*wP^wn5 z|Ni%?y>~9RHtJPLBy5a`cpErt?%mIl_NITYx2H1I=e9VJ7lRHAjU`O??^_kHc})T&mkGTG|sx~sU+gQo>+wb;N h$@zLX9C5+v0kd(JbgJBo|E(Zzdb;|#taD0e0s!MJW^(`l literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..df9993eefb9e9a1a1dbf58994cec86e1cc7b12d3 GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^EkK;W!2~3OKl`QtDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDZCSt!XD5IZ3I{z&2P*USba4!+ zV0?S+G-tDe07F2pLI&%#g#TM3nng7@lGutqPdVYnR&!6R?D=Q5*wv?;8yFawSU3a} z9B9C3{K8avj_dX|*|vr6fA7+Zd{`)RdefQDdvc=>9rNB6wQBE-BNlzWm#1)5bZvhB z+r*di`9~|!S&5SGkNj5?&GLU|z}gi=}s0o_cgzIw)p^Eaj? z!TC1i^g0&@5t$g4gU8&OrcV9;Uuk1f3y0&LWkss8FJFHv@lU(C*Q&p0)vf|L{>mlH zml$6*lr)@YY~?TO-=uTe#P`ze@3k_=QzJcEjeo?jh@?ciU6eTD9EoAQ8tT$$h zx$Ul(in=y3K4**w4ZZ(;_Oi(9Q$Oll{k8DZcFl;%DvZLdEqylUA6uC594?%bIZJ~< zSyYVimjXwgx?3O%vjS7y9j1TUT-_H+Wj8;oJhofiIrlc-VSzihw@p;4SI~JR!@Fr) z?$68{9)|aCZ1xbpuhUuCq~E<_RhC5Cy4MvuINg4f&e?vX&+GCOA4_|YCFk!uznasy zfg?s_v8nIx-_yUgnPb zQo;CkMs)Wf1A*47>%;>bkFL^xG`r*f|NTGIeki@`?zr~4>gM6Fwg6Ax{J`m#mwQ&J z&HZWRdFx5h9*+hVJm_AZ!@p3$tFOPhEe_NWDPfG!n|}D=hN!jYo^SS>ob*52q2W-0 zg^4G#NZMw}f*Bo?Gv=tA+gNKo*Kci@aiROkEm3PPzua>Fz3-QerngS@*e>dPoVVS0 zV&}5^@27jIW~L?XS*G-%YW;QXduCey-HR>zCZE5bt~X`-?cB{bQyLG*f7af;@an{g zq1$gCEooTz&Hk2$MD~-UjSTZYR_L?_tPPVts`>2(L*o3;K*_VWt-xHzTbPwO>RdiAn-ezeW{8!FD4Z(*?sOw2#DpX*(Iwv&%y$J;6EPMsFi zoqP4%=3A1>jNRR91RNL`S;!=sI8>TM`c~!WP2as|kBznU?Y~TM@$u=KZ{F`e|NHmv zcdXwlQ~pd^=yT`JogZei&Oe{)mu?{Oqfa32U`oY8=dPO4(y1p?YS{gk2DLgl@*mGI z`6R2dr0KZgQC|I=2|jDqt%_PJ)_wHqvWfa1y^p0B6()tRzy5WK1?N*Ok3X|CRh`Yh zek{CjTVvvn`|*73&f!xIK0dOZIehNrmnA!6>}+lSviuEmY){>MGv!kC^OeT?_wWC| z?Z-X74PWO}ty+8g|D#7vegA%SPM<#gW5u2K->=55cHOmi@7E(2mwns6cW>o6>8s1` zrf9HVzkYq!-{uQbyq0<`y_B`p1k`Z%vT28CvR|k`S9Vx zmoHmBF8?~Wyu7^dO#9KaEZOf4-zM-lcdALM9G=jy(EH&@1<5uRp4d~2wvy8An$qQN zQ|B{#wZ$#3o?<%T%I%o*=QzyyH6)AbYij;vtxZ*0Htp?^G?ss&7r&Rk%nm&9^XJYe zbziHDzRS1R=5zet&mTYh(pRu1Pv-HxwD$bvRU~v5&6%5X&h4F1xm#O}e)x+`UKq8qoHuTJC`;+}sE>PYnfyMQVPsOh(A9U{m0fq& z%`*$Xc&Phv>~+z5GwVbm>;HdU@BVo`qj<-Po!Q%O?~Qx!p5Ff|;k7o`RG#|o8z#Hv s`7M_!&5v0qENcGTmE08D7_aexKlAeO7YAMZ7lX2qr>mdKI;Vst0JL?FaR2}S literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview_close.png b/Telegram/Resources/icons/mediaview_close.png deleted file mode 100644 index 891b4735a05ca3204ee2762a3671fa3ca8ea8e7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@RheVow*x5R2ZeQ!M!o7;vyC_TN>n ztUtZPW3rmjv<_8sGoB<%CF6~~DoT%DcqOfMO%vM2xMG#^43$+}47ZQ`Uda9X!_Pk! zjW!GPa*{6_=dj#z&t10f`ofj>vQ)nSh6E6hYFHulRLD398kFO9p`Lh)a>De1dQgVlz59lbD9fkjhaMQ;`^X;kQa@_hYc@v5zXUsGWbP1X zq<{m;595S#PiW2Ik1^(&gE8cshZ)Sh=AfvqvGORbs&&_F@Wg0PDW&Un%nZyOYTx(T xBYJOG&BUCc8qBfELI@C%C72eKQhI6W{Q|o!EA9zxA>{x7002ovPDHLkV1i4wm2dz6 diff --git a/Telegram/Resources/icons/mediaview_close@3x.png b/Telegram/Resources/icons/mediaview_close@3x.png deleted file mode 100644 index b52db954cb0f4cbe42fc30edcf73ebbc3cd9b2c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495 zcmVFnMz1Zqzqq72*%$SW8gZbX@X^0z*-BR z_cRS_EqL!?nx@j6J1WKq007&zsl{1qVc&NE0EjV`aOcH5&u>&Jjkqf+Rg4kldH#mw zP#SSLR1sH0X~NY|S)BL2I#~m*1(j-D*R!vuNdniizT-Hq>+5Ug#0{WMm`2KE4g zuzlaja0sY7Oal%H^$nB6A)@jy2^=!24CBNRpz1IV91-eo7$uGn)dr)$5u@5+m^cPh z9}EM>gzATl;22TQU{7$)IZo7bST8Pwz=;}z_2L*&<1j27G71MaiX%Yb!JguXP`EH- z3^?bSH;NDfIOix(@^6grOI!{`jFUwX;^a|8I385%hJuKrN2RmkaU7gDderrF&xqqe zUHh4Ed?;odFNzVzk7B~fpcrs+C}Nx}iV!D{BEsoFJ;62qACpEQ<8+}Aar#gwIIXB* zTx&8%0`&ysms=PtyIjdI1rlKAVgfHl6?g002ovPDHLkV1jen)m{Jq diff --git a/Telegram/SourceFiles/media/view/media_view.style b/Telegram/SourceFiles/media/view/media_view.style index be94ae617..23116be7f 100644 --- a/Telegram/SourceFiles/media/view/media_view.style +++ b/Telegram/SourceFiles/media/view/media_view.style @@ -101,28 +101,27 @@ mediaviewVolumeToggle: IconButton(mediaviewControlsButton) { } mediaviewVolumeSkip: 4px; -mediaviewLeft: icon {{ "mediaview_next-flip_horizontal", mediaviewControlFg }}; -mediaviewRight: icon {{ "mediaview_next", mediaviewControlFg }}; -mediaviewClose: icon {{ "mediaview_close", mediaviewControlFg }}; -mediaviewSave: icon {{ "mediaview_download", mediaviewControlFg }}; -mediaviewRotate: icon {{ "mediaview_rotate", mediaviewControlFg }}; -mediaviewMore: icon {{ "mediaview_more", mediaviewControlFg }}; +mediaviewLeft: icon {{ "mediaview/next-flip_horizontal", mediaviewControlFg }}; +mediaviewRight: icon {{ "mediaview/next", mediaviewControlFg }}; +mediaviewSave: icon {{ "mediaview/download", mediaviewControlFg }}; +mediaviewRotate: icon {{ "mediaview/rotate", mediaviewControlFg }}; +mediaviewMore: icon {{ "mediaview/more", mediaviewControlFg }}; mediaviewFileRed: icon { { size(25px, 25px), mediaviewFileBg }, - { "mediaview_file_corner", mediaviewFileRedCornerFg }, + { "mediaview/file_corner", mediaviewFileRedCornerFg }, }; mediaviewFileYellow: icon { { size(25px, 25px), mediaviewFileBg }, - { "mediaview_file_corner", mediaviewFileYellowCornerFg }, + { "mediaview/file_corner", mediaviewFileYellowCornerFg }, }; mediaviewFileGreen: icon { { size(25px, 25px), mediaviewFileBg }, - { "mediaview_file_corner", mediaviewFileGreenCornerFg }, + { "mediaview/file_corner", mediaviewFileGreenCornerFg }, }; mediaviewFileBlue: icon { { size(25px, 25px), mediaviewFileBg }, - { "mediaview_file_corner", mediaviewFileBlueCornerFg }, + { "mediaview/file_corner", mediaviewFileBlueCornerFg }, }; mediaviewFilePadding: 18px; @@ -211,7 +210,7 @@ mediaviewControlsPopupMenu: PopupMenu(defaultPopupMenu) { animation: mediaviewControlsPanelAnimation; } -mediaviewSaveMsgCheck: icon {{ "mediaview_save_check", mediaviewSaveMsgFg }}; +mediaviewSaveMsgCheck: icon {{ "mediaview/save_check", mediaviewSaveMsgFg }}; mediaviewSaveMsgPadding: margins(55px, 19px, 29px, 20px); mediaviewSaveMsgCheckPos: point(23px, 21px); mediaviewSaveMsgShowing: 200; @@ -269,6 +268,56 @@ mediaviewDefaultTop: 120px; mediaviewDefaultWidth: 800px; mediaviewDefaultHeight: 600px; +mediaviewTitleMinimize: icon{ + { "mediaview/title_viewer_shadow_minimize", windowShadowFg }, + { "mediaview/title_viewer_button_minimize", mediaviewControlFg }, +}; +mediaviewTitleMaximize: icon{ + { "mediaview/title_viewer_shadow_maximize", windowShadowFg }, + { "mediaview/title_viewer_button_maximize", mediaviewControlFg }, +}; +mediaviewTitleRestore: icon{ + { "mediaview/title_viewer_shadow_restore", windowShadowFg }, + { "mediaview/title_viewer_button_restore", mediaviewControlFg }, +}; +mediaviewTitleClose: icon{ + { "mediaview/title_viewer_shadow_close", windowShadowFg }, + { "mediaview/title_viewer_button_close", mediaviewControlFg }, +}; +mediaviewTitleButton: IconButton(windowTitleButton) { + width: 44px; + height: 32px; +} +mediaviewTitle: WindowTitle(defaultWindowTitle) { + height: 0px; + bg: mediaviewBg; + bgActive: mediaviewBg; + fg: transparent; + fgActive: transparent; + minimize: IconButton(mediaviewTitleButton) { + icon: mediaviewTitleMinimize; + iconOver: mediaviewTitleMinimize; + } + minimizeIconActive: mediaviewTitleMinimize; + minimizeIconActiveOver: mediaviewTitleMinimize; + maximize: IconButton(mediaviewTitleButton) { + icon: mediaviewTitleMaximize; + iconOver: mediaviewTitleMaximize; + } + maximizeIconActive: mediaviewTitleMaximize; + maximizeIconActiveOver: mediaviewTitleMaximize; + restoreIcon: mediaviewTitleRestore; + restoreIconOver: mediaviewTitleRestore; + restoreIconActive: mediaviewTitleRestore; + restoreIconActiveOver: mediaviewTitleRestore; + close: IconButton(mediaviewTitleButton) { + icon: mediaviewTitleClose; + iconOver: mediaviewTitleClose; + } + closeIconActive: mediaviewTitleClose; + closeIconActiveOver: mediaviewTitleClose; +} + themePreviewSize: size(903px, 584px); themePreviewBg: windowBg; themePreviewOverlayOpacity: 0.8; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp index 88d72ffc0..880cc2b9d 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp @@ -558,10 +558,9 @@ auto OverlayWidget::RendererGL::ControlMeta(OverState control) switch (control) { case OverLeftNav: return { 0, &st::mediaviewLeft }; case OverRightNav: return { 1, &st::mediaviewRight }; - case OverClose: return { 2, &st::mediaviewClose }; - case OverSave: return { 3, &st::mediaviewSave }; - case OverRotate: return { 4, &st::mediaviewRotate }; - case OverMore: return { 5, &st::mediaviewMore }; + case OverSave: return { 2, &st::mediaviewSave }; + case OverRotate: return { 3, &st::mediaviewRotate }; + case OverMore: return { 4, &st::mediaviewMore }; } Unexpected("Control value in OverlayWidget::RendererGL::ControlIndex."); } @@ -573,7 +572,6 @@ void OverlayWidget::RendererGL::validateControls() { const auto metas = { ControlMeta(OverLeftNav), ControlMeta(OverRightNav), - ControlMeta(OverClose), ControlMeta(OverSave), ControlMeta(OverRotate), ControlMeta(OverMore), diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h index f143e712c..668a75113 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h @@ -130,7 +130,7 @@ private: Ui::GL::Image _groupThumbsImage; Ui::GL::Image _controlsImage; - static constexpr auto kControlsCount = 6; + static constexpr auto kControlsCount = 5; [[nodiscard]] static Control ControlMeta(OverState control); std::array _controlsTextures; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index f95668c54..aa4f64971 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -89,7 +89,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_media_view.h" #include "styles/style_chat.h" #include "styles/style_menu_icons.h" -#include "styles/style_calls.h" #ifdef Q_OS_MAC #include "platform/mac/touchbar/mac_touchbar_media_view.h" @@ -426,7 +425,7 @@ OverlayWidget::OverlayWidget() // // This doesn't make sense. But it works. :shrug: _titleBugWorkaround->setGeometry( - { 0, 0, size.width(), st::callTitleButton.height }); + { 0, 0, size.width(), st::mediaviewTitleButton.height }); _widget->setGeometry({ QPoint(), size }); updateControlsGeometry(); @@ -476,7 +475,7 @@ OverlayWidget::OverlayWidget() }); _window->setTitle(u"Media viewer"_q); - _window->setTitleStyle(st::callTitle); + _window->setTitleStyle(st::mediaviewTitle); if constexpr (Platform::IsMac()) { // Without Qt::Tool starting with Qt 5.15.1 this widget @@ -523,6 +522,10 @@ OverlayWidget::OverlayWidget() _touchTimer.setCallback([=] { handleTouchTimer(); }); _controlsHideTimer.setCallback([=] { hideControls(); }); + _helper->controlsActivations( + ) | rpl::start_with_next([=] { + activateControls(); + }, lifetime()); _docDownload->addClickHandler([=] { downloadMedia(); }); _docSaveAs->addClickHandler([=] { saveAs(); }); @@ -779,8 +782,6 @@ void OverlayWidget::updateGeometryToScreen(bool inMove) { void OverlayWidget::updateControlsGeometry() { const auto navSkip = st::mediaviewHeaderTop; - _closeNav = QRect(width() - st::mediaviewControlSize, 0, st::mediaviewControlSize, st::mediaviewControlSize); - _closeNavIcon = style::centerrect(_closeNav, st::mediaviewClose); _leftNav = QRect(0, navSkip, st::mediaviewControlSize, height() - 2 * navSkip); _leftNavIcon = style::centerrect(_leftNav, st::mediaviewLeft); _rightNav = QRect(width() - st::mediaviewControlSize, navSkip, st::mediaviewControlSize, height() - 2 * navSkip); @@ -1365,10 +1366,10 @@ bool OverlayWidget::updateControlsAnimation(crl::time now) { } else { _controlsOpacity.update(dt, anim::linear); } + _helper->setControlsOpacity(_controlsOpacity.current()); const auto toUpdate = QRegion() + (_over == OverLeftNav ? _leftNav : _leftNavIcon) + (_over == OverRightNav ? _rightNav : _rightNavIcon) - + (_over == OverClose ? _closeNav : _closeNavIcon) + _saveNavIcon + _rotateNavIcon + _moreNavIcon @@ -1759,6 +1760,7 @@ void OverlayWidget::close() { if (const auto window = Core::App().activeWindow()) { window->reActivate(); } + _helper->clearState(); } void OverlayWidget::minimize() { @@ -1769,6 +1771,7 @@ void OverlayWidget::minimize() { } void OverlayWidget::toggleFullScreen(bool fullscreen) { + _helper->clearState(); _fullscreen = fullscreen; _windowed = !fullscreen; initNormalGeometry(); @@ -1786,6 +1789,7 @@ void OverlayWidget::toggleFullScreen(bool fullscreen) { _wasWindowedMode = true; } savePosition(); + _helper->clearState(); } void OverlayWidget::activateControls() { @@ -4164,12 +4168,6 @@ void OverlayWidget::paintControls( _rightNav, _rightNavIcon, st::mediaviewRight }, - { - OverClose, - false, - _closeNav, - _closeNavIcon, - st::mediaviewClose }, { OverSave, _saveVisible, @@ -4695,7 +4693,6 @@ void OverlayWidget::handleMousePress( || _over == OverRotate || _over == OverIcon || _over == OverMore - || _over == OverClose || _over == OverVideo) { _down = _over; } else if (!_saveMsg.contains(position) || !isSaveMsgShown()) { @@ -4778,7 +4775,6 @@ void OverlayWidget::updateOverRect(OverState state) { case OverRotate: update(_rotateNavIcon); break; case OverIcon: update(_docIconRect); break; case OverHeader: update(_headerNav); break; - case OverClose: update(_closeNav); break; case OverMore: update(_moreNavIcon); break; } } @@ -4875,10 +4871,6 @@ void OverlayWidget::updateOver(QPoint pos) { updateOverState(OverIcon); } else if (_moreNav.contains(pos)) { updateOverState(OverMore); -#if 0 // close - } else if (_closeNav.contains(pos)) { - updateOverState(OverClose); -#endif } else if (documentContentShown() && finalContentRect().contains(pos)) { if ((_document->isVideoFile() || _document->isVideoMessage()) && _streamed) { updateOverState(OverVideo); @@ -4937,9 +4929,6 @@ void OverlayWidget::handleMouseRelease( handleDocumentClick(); } else if (_over == OverMore && _down == OverMore) { InvokeQueued(_widget, [=] { showDropdown(); }); - } else if (_over == OverClose && _down == OverClose) { - //close(); - toggleFullScreen(!_fullscreen); } else if (_over == OverVideo && _down == OverVideo) { if (_streamed) { playbackPauseResume(); @@ -5220,6 +5209,7 @@ void OverlayWidget::clearBeforeHide() { _controlsHideTimer.cancel(); _controlsState = ControlsShown; _controlsOpacity = anim::value(1); + _helper->setControlsOpacity(1.); _groupThumbs = nullptr; _groupThumbsRect = QRect(); _body->hide(); diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 91bd3cede..becfa9053 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -129,7 +129,6 @@ private: OverNone, OverLeftNav, OverRightNav, - OverClose, OverHeader, OverName, OverDate, @@ -492,7 +491,6 @@ private: std::unique_ptr _collage; std::optional _collageData; - QRect _closeNav, _closeNavIcon; QRect _leftNav, _leftNavIcon, _rightNav, _rightNavIcon; QRect _headerNav, _nameNav, _dateNav; QRect _rotateNav, _rotateNavIcon, _saveNav, _saveNavIcon, _moreNav, _moreNavIcon; diff --git a/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm b/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm index 39f5a1f33..877b8ea8a 100644 --- a/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm +++ b/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm @@ -118,9 +118,6 @@ void MacOverlayWidgetHelper::activate(int button) { void MacOverlayWidgetHelper::beforeShow(bool fullscreen) { _data->window->setAttribute(Qt::WA_MacAlwaysShowToolWindow, !fullscreen); _data->window->windowHandle()->setFlag(Qt::FramelessWindowHint, fullscreen); - if (!fullscreen) { - _data->window->setGeometry({ 100, 100, 800, 600 }); - } updateStyles(fullscreen); } diff --git a/Telegram/SourceFiles/platform/platform_overlay_widget.cpp b/Telegram/SourceFiles/platform/platform_overlay_widget.cpp index b9805c13d..af4a98858 100644 --- a/Telegram/SourceFiles/platform/platform_overlay_widget.cpp +++ b/Telegram/SourceFiles/platform/platform_overlay_widget.cpp @@ -7,11 +7,170 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "platform/platform_overlay_widget.h" +#include "ui/effects/animations.h" #include "ui/platform/ui_platform_window_title.h" #include "ui/widgets/rp_window.h" -#include "styles/style_calls.h" +#include "ui/abstract_button.h" +#include "styles/style_media_view.h" namespace Platform { +namespace { + +using namespace Media::View; + +} // namespace + +class DefaultOverlayWidgetHelper::Buttons final + : public Ui::Platform::AbstractTitleButtons { +public: + using Control = Ui::Platform::TitleControl; + + object_ptr create( + not_null parent, + Control control, + const style::WindowTitle &st) override; + void updateState( + bool active, + bool maximized, + const style::WindowTitle &st) override; + void notifySynteticOver(Control control, bool over) override; + + void setMasterOpacity(float64 opacity); + [[nodiscard]] rpl::producer<> activations() const; + + void clearState(); + +private: + rpl::event_stream<> _activations; + rpl::variable _masterOpacity = 1.; + rpl::variable _maximized = false; + rpl::event_stream<> _clearStateRequests; + +}; + +object_ptr DefaultOverlayWidgetHelper::Buttons::create( + not_null parent, + Control control, + const style::WindowTitle &st) { + auto result = object_ptr(parent); + const auto raw = result.data(); + + struct State { + Ui::Animations::Simple animation; + float64 progress = -1.; + QImage frame; + bool maximized = false; + bool over = false; + }; + const auto state = raw->lifetime().make_state(); + + rpl::merge( + _masterOpacity.changes() | rpl::to_empty, + _maximized.changes() | rpl::to_empty + ) | rpl::start_with_next([=] { + raw->update(); + }, raw->lifetime()); + + _clearStateRequests.events( + ) | rpl::start_with_next([=] { + raw->clearState(); + raw->update(); + state->over = raw->isOver(); + state->animation.stop(); + }, raw->lifetime()); + + const auto icon = [&] { + switch (control) { + case Control::Minimize: return &st::mediaviewTitleMinimize; + case Control::Maximize: return &st::mediaviewTitleMaximize; + case Control::Close: return &st::mediaviewTitleClose; + } + Unexpected("Value in DefaultOverlayWidgetHelper::Buttons::create."); + }(); + + raw->resize(icon->size()); + state->frame = QImage( + icon->size() * style::DevicePixelRatio(), + QImage::Format_ARGB32_Premultiplied); + state->frame.setDevicePixelRatio(style::DevicePixelRatio()); + + const auto updateOver = [=] { + const auto over = raw->isOver(); + if (state->over == over) { + return; + } + state->over = over; + state->animation.start( + [=] { raw->update(); }, + state->over ? 0. : 1., + state->over ? 1. : 0., + st::mediaviewFadeDuration); + }; + + const auto prepareFrame = [=] { + const auto progress = state->animation.value(state->over ? 1. : 0.); + const auto maximized = _maximized.current(); + if (state->progress == progress && state->maximized == maximized) { + return; + } + state->progress = progress; + state->maximized = maximized; + auto current = icon; + if (control == Control::Maximize) { + current = maximized ? &st::mediaviewTitleRestore : icon; + } + const auto alpha = progress * kOverBackgroundOpacity; + const auto ialpha = anim::interpolate(0, 255, alpha); + state->frame.fill(QColor(255, 255, 255, ialpha)); + + auto q = QPainter(&state->frame); + const auto normal = maximized + ? kMaximizedIconOpacity + : kNormalIconOpacity; + q.setOpacity(progress + (1 - progress) * normal); + current->paint(q, 0, 0, raw->width()); + q.end(); + }; + + raw->paintRequest( + ) | rpl::start_with_next([=] { + updateOver(); + prepareFrame(); + + auto p = QPainter(raw); + p.setOpacity(_masterOpacity.current()); + p.drawImage(0, 0, state->frame); + }, raw->lifetime()); + + return result; +} + +void DefaultOverlayWidgetHelper::Buttons::updateState( + bool active, + bool maximized, + const style::WindowTitle &st) { + _maximized = maximized; +} + +void DefaultOverlayWidgetHelper::Buttons::notifySynteticOver( + Ui::Platform::TitleControl control, + bool over) { + if (over) { + _activations.fire({}); + } +} + +void DefaultOverlayWidgetHelper::Buttons::clearState() { + _clearStateRequests.fire({}); +} + +void DefaultOverlayWidgetHelper::Buttons::setMasterOpacity(float64 opacity) { + _masterOpacity = opacity; +} + +rpl::producer<> DefaultOverlayWidgetHelper::Buttons::activations() const { + return _activations.events(); +} void OverlayWidgetHelper::minimize(not_null window) { window->setWindowState(window->windowState() | Qt::WindowMinimized); @@ -20,10 +179,14 @@ void OverlayWidgetHelper::minimize(not_null window) { DefaultOverlayWidgetHelper::DefaultOverlayWidgetHelper( not_null window, Fn maximize) -: _controls(Ui::Platform::SetupSeparateTitleControls( +: _buttons(new DefaultOverlayWidgetHelper::Buttons()) +, _controls(Ui::Platform::SetupSeparateTitleControls( window, - st::callTitle, - std::move(maximize))) { + std::make_unique( + window->body(), + st::mediaviewTitle, + std::unique_ptr(_buttons.get()), + std::move(maximize)))) { } DefaultOverlayWidgetHelper::~DefaultOverlayWidgetHelper() = default; @@ -36,4 +199,20 @@ bool DefaultOverlayWidgetHelper::skipTitleHitTest(QPoint position) { return _controls->controls.geometry().contains(position); } +rpl::producer<> DefaultOverlayWidgetHelper::controlsActivations() { + return _buttons->activations(); +} + +void DefaultOverlayWidgetHelper::beforeShow(bool fullscreen) { + _buttons->clearState(); +} + +void DefaultOverlayWidgetHelper::clearState() { + _buttons->clearState(); +} + +void DefaultOverlayWidgetHelper::setControlsOpacity(float64 opacity) { + _buttons->setMasterOpacity(opacity); +} + } // namespace Platform diff --git a/Telegram/SourceFiles/platform/platform_overlay_widget.h b/Telegram/SourceFiles/platform/platform_overlay_widget.h index 06e969653..307e5282d 100644 --- a/Telegram/SourceFiles/platform/platform_overlay_widget.h +++ b/Telegram/SourceFiles/platform/platform_overlay_widget.h @@ -15,6 +15,14 @@ namespace Ui::Platform { struct SeparateTitleControls; } // namespace Ui::Platform +namespace Media::View { + +inline constexpr auto kMaximizedIconOpacity = 0.6; +inline constexpr auto kNormalIconOpacity = 0.9; +inline constexpr auto kOverBackgroundOpacity = 0.15; + +} // namespace Media::View + namespace Platform { class OverlayWidgetHelper { @@ -26,6 +34,9 @@ public: [[nodiscard]] virtual bool skipTitleHitTest(QPoint position) { return false; } + [[nodiscard]] virtual rpl::producer<> controlsActivations() { + return rpl::never<>(); + } virtual void beforeShow(bool fullscreen) { } virtual void afterShow(bool fullscreen) { @@ -33,6 +44,10 @@ public: virtual void notifyFileDialogShown(bool shown) { } virtual void minimize(not_null window); + virtual void clearState() { + } + virtual void setControlsOpacity(float64 opacity) { + } }; [[nodiscard]] std::unique_ptr CreateOverlayWidgetHelper( @@ -48,8 +63,15 @@ public: void orderWidgets() override; bool skipTitleHitTest(QPoint position) override; + rpl::producer<> controlsActivations() override; + void beforeShow(bool fullscreen) override; + void clearState() override; + void setControlsOpacity(float64 opacity) override; private: + class Buttons; + + const not_null _buttons; const std::unique_ptr _controls; }; diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 104c72181..6cf89a6d0 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -320,10 +320,10 @@ historyFileOutPlay: icon {{ "history_file_play", historyFileOutIconFg }}; historyFileOutPlaySelected: icon {{ "history_file_play", historyFileOutIconFgSelected }}; historyFileInPlay: icon {{ "history_file_play", historyFileInIconFg }}; historyFileInPlaySelected: icon {{ "history_file_play", historyFileInIconFgSelected }}; -historyFileOutWaiting: icon {{ "mediaview_save_check", historyFileOutIconFg }}; -historyFileOutWaitingSelected: icon {{ "mediaview_save_check", historyFileOutIconFgSelected }}; -historyFileInWaiting: icon {{ "mediaview_save_check", historyFileInIconFg }}; -historyFileInWaitingSelected: icon {{ "mediaview_save_check", historyFileInIconFgSelected }}; +historyFileOutWaiting: icon {{ "mediaview/save_check", historyFileOutIconFg }}; +historyFileOutWaitingSelected: icon {{ "mediaview/save_check", historyFileOutIconFgSelected }}; +historyFileInWaiting: icon {{ "mediaview/save_check", historyFileInIconFg }}; +historyFileInWaitingSelected: icon {{ "mediaview/save_check", historyFileInIconFgSelected }}; historyFileThumbPause: icon {{ "history_file_pause", historyFileThumbIconFg }}; historyFileThumbPauseSelected: icon {{ "history_file_pause", historyFileThumbIconFgSelected }}; @@ -333,8 +333,8 @@ historyFileThumbCancel: icon {{ "history_file_cancel", historyFileThumbIconFg }} historyFileThumbCancelSelected: icon {{ "history_file_cancel", historyFileThumbIconFgSelected }}; historyFileThumbPlay: icon {{ "history_file_play", historyFileThumbIconFg }}; historyFileThumbPlaySelected: icon {{ "history_file_play", historyFileThumbIconFgSelected }}; -historyFileThumbWaiting: icon {{ "mediaview_save_check", historyFileThumbIconFg }}; -historyFileThumbWaitingSelected: icon {{ "mediaview_save_check", historyFileThumbIconFgSelected }}; +historyFileThumbWaiting: icon {{ "mediaview/save_check", historyFileThumbIconFg }}; +historyFileThumbWaitingSelected: icon {{ "mediaview/save_check", historyFileThumbIconFgSelected }}; historySendStateSpace: 24px; historySendStatePosition: point(-17px, -19px);