From a4b76ffe034fa4c22682e079d8b58409fcf4b593 Mon Sep 17 00:00:00 2001 From: Sanjay Madan Date: Fri, 9 Jun 2017 13:42:53 -0700 Subject: [PATCH] Forward/backward 15s buttons --- PlayerUI/Definitions/Images.swift | 8 ++ .../back15s.imageset/Contents.json | 23 ++++++ .../back15s.imageset/back15s.png | Bin 0 -> 597 bytes .../back15s.imageset/back15s@2x.png | Bin 0 -> 1176 bytes .../back15s.imageset/back15s@3x.png | Bin 0 -> 1769 bytes .../back30s.imageset/back30s.png | Bin 680 -> 654 bytes .../back30s.imageset/back30s@2x.png | Bin 1401 -> 1408 bytes .../back30s.imageset/back30s@3x.png | Bin 2152 -> 2206 bytes .../forward15s.imageset/Contents.json | 23 ++++++ .../forward15s.imageset/forward15s.png | Bin 0 -> 565 bytes .../forward15s.imageset/forward15s@2x.png | Bin 0 -> 1142 bytes .../forward15s.imageset/forward15s@3x.png | Bin 0 -> 1742 bytes .../forward30s.imageset/forward30s.png | Bin 667 -> 642 bytes .../forward30s.imageset/forward30s@2x.png | Bin 1379 -> 1362 bytes .../forward30s.imageset/forward30s@3x.png | Bin 2171 -> 2160 bytes PlayerUI/Views/PUIPlayerView.swift | 72 ++++++++++++++---- 16 files changed, 110 insertions(+), 16 deletions(-) create mode 100644 PlayerUI/Resources/Media.xcassets/back15s.imageset/Contents.json create mode 100644 PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s.png create mode 100644 PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@2x.png create mode 100644 PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@3x.png create mode 100644 PlayerUI/Resources/Media.xcassets/forward15s.imageset/Contents.json create mode 100644 PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s.png create mode 100644 PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@2x.png create mode 100644 PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@3x.png diff --git a/PlayerUI/Definitions/Images.swift b/PlayerUI/Definitions/Images.swift index 658279e4..930eb88c 100644 --- a/PlayerUI/Definitions/Images.swift +++ b/PlayerUI/Definitions/Images.swift @@ -26,6 +26,10 @@ extension NSImage { return playerBundle.image(forResource: "airplay")! } + static var PUIBack15s: NSImage { + return playerBundle.image(forResource: "back15s")! + } + static var PUIBack30s: NSImage { return playerBundle.image(forResource: "back30s")! } @@ -34,6 +38,10 @@ extension NSImage { return playerBundle.image(forResource: "bookmark")! } + static var PUIForward15s: NSImage { + return playerBundle.image(forResource: "forward15s")! + } + static var PUIForward30s: NSImage { return playerBundle.image(forResource: "forward30s")! } diff --git a/PlayerUI/Resources/Media.xcassets/back15s.imageset/Contents.json b/PlayerUI/Resources/Media.xcassets/back15s.imageset/Contents.json new file mode 100644 index 00000000..7788ee08 --- /dev/null +++ b/PlayerUI/Resources/Media.xcassets/back15s.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "back15s.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "back15s@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "back15s@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s.png b/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s.png new file mode 100644 index 0000000000000000000000000000000000000000..b729c07fc93e314de61c6b9c2fb35808b00b3b78 GIT binary patch literal 597 zcmV-b0;>IqP)*I7`{?gE@`e|C@#5AO9-goN^F06e z<1UqoS+;G@#Do(=rj7{1aMZG_kG}6$_4u%MMgg16<~(wMUq);dzmGOxlcmXfir!&I z%?-n_vG?w31jYk%fj%ykO0HmyMx${+@Qq&BYnInzci0yAmo)sTm~8>xyeG2}@Gq!) zidgA%ddg4}<;+M5%d#+IQbFYgX&KJW>g1*2O8+*C#bOD1KTM zz}D{_g9`nlBWB#>bHw5^x>5*k=>-3m67pYFZjjC}{h8-^Ri<778q=n9|V jy2KKfzO_W~e+&2vAUpu=yKnGg00000NkvXXu0mjfYV94c literal 0 HcmV?d00001 diff --git a/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@2x.png b/PlayerUI/Resources/Media.xcassets/back15s.imageset/back15s@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dfef0b1feeb590b6bc584390b6f0ea859f4f009b GIT binary patch literal 1176 zcmV;J1ZVq+P)j|)NX3Jw;DRWMC-vfTaYghZC?2$K=*3!0OVgH$){t~b{C$r%k9jXIY0{<S;=;)~F>FK!&pk*oe51WatVoclCNF?&% zUxSjTH7eHD);5mCeK{J9t{JEVY=j{%Hjl^CO`c}xG5nRPs;ZC9ydJ8w9zYjRlsc6z z<3?n)F7iQ(02XD2E>>4p?}zVEfoxN$gxTx?B^Y+I*&e|ARBkV2yj@UGFcZOjCHzPI zV!)kNxjl-JUKT&odKPx9F4y?Rnwpw9+IUcGdwct+-rn9NROloDrm7$^tzNHpPGx1~ z2isIqy&J{F#j`PZq>P87FE20u&6>L7_xl$R|EtO&(@J4>$k+x<1f`{=KX6(OxLuI! zo?&YxB_%(}anO-qsf^=*DI>sL#!0I8T*-!`FDxv4>WDj0#tDImlBsQi76Yyx3W+S! zO{P_k$#jmCaZ+Gn0H7GvJIBtQ3;$AN*=V+1nT>>QIh}85QHWbC|FC zF^Nc(zSB)$IxNtROa?IQzCqg^IyG!k%wT&17$7E_0j?Jn71eVg>0m6t+|Ku^V$FO< zpPPOe?-Z~gPrsIL;$6wWI!l;{hfu(R@N#FEj_*7i+Mzdqm43+000y7~1b3@WTmtMW z03Lpy zds77?$86n}IL6^L(E`_PEuPm&xi!ek3&78y+O_6AV5O!zLFN3~I3X)%e}}SJ#>P}S z6bXlAWn}>>qI{xel?;0TJ_O8b^z)$+Tq_lp3d@!deOFFfT<_z?1a^b;Uy@0eP7 zQK!?M;Uh7O<~AKl7uN$Kf^ZwXdOsWnJsy7|NeB?LBIVTXv^r1Qrs1@*5DboTb zu?cVo5c2Qrt&H_X;Kx3nZ?2jSU8nQdbwi(^Gmz}+J@ghRv9-OYbmvrfjz^XK{r%Gj q8s>iZnai@AMsh7zfm{WKQh~qbwyCs|L&@9#0000YiJx*6vvz0JeDTXXx>So3RTfsBoPHGe%V?_0d>L8xo@;wI8HfN(n~&V1uQIij9v_O9Odr%tKr9+C2Q7C3n0t zJCmK+ooqI^1DAX6x#ym9{^#7++?f?CvX46t3=9n1>W*`1xN=ib+uPe)O8*aLW@c8A z-0|&p2~Gzcd+SJtu>Tj1mK&UO28iHc7(Pf zK&W3QP1`XnBU(OZ=p!te+pRVS02i&UuHH?)f%L1DVHwt&WOvZ*HWnTsGGs#x-`6NU zPdVdOSAr14wklE>`>rE*dd?HLTi}l^MkbJ|$Gj(6sJq%H5!Q~-w7zN)jIA70ny|4% z*{$c;^dvSN5}IwaYHDh}gGpY550KC4oinA(T5>cmFYiw58M3p9NI#|MwjiYuFN^{9 z88+a10D4Jv$fUfyy!<@&J?&sq?asXA6xR(9aA^#GMutc-hz=x5mWr=4Mw zlaqG{Jt0V8Dl03yOk|(HYxh&_6oeUvaqmFR;`Z|Ekp7?J3Fwm zNa&tGN{8a&;t`^{4FM04B0^j0hec-A&IVTB7(UM+l`w#QPI(O zs@Q0N#2~raFaT2Sz<`6$j|!uUr%dtC?{DsgnpJ(NbGs;wW8_ZW73G$$+k=5dByr53 zhklFBY61zUv!przzC-SMf&ofyw)IQih;F&GMcap! zLSAo?c@6b2+fA7EExEb54IBmrEIhtf4Uj2HHi1OeW2AxvG9TcZ;wSKIOu(10nUPb3 zL*w|MPYTgAC*!zW5;z%IK^CAOLVB5WHxXOQ5Zy|-%OW!D^x@RPm#FHruggW-e_Kc* zDGRk@yy+l7y_-)9o49%ZL+f_|Zy#r#c0#LFbcXIO%1LiG{76+bH8mAh^7Nd&`kd5# z8LliM?;)#6Q!oS2xPt(+Nfx0-fOTlRHvm3F+k{4QT?F9UFvm>|Rxjo0uo_uyh}c;gaY~{%5SK; zp0lUQZz*zkP|pP0$Zx8m=WH`3XCPN^b}R!>_Wam<6eh#_jy+s7VDvW@wr6EQu+U`x z%w^knQ>SCl&m_+W5M73)+{wB5MV;nLB>4sG6p@SqLLKl|Q|)9(?O`Z>OBx4UE%jGW zew%IpZL)Cq^5Cp4R#f@gW*Yv!fRwEQ0P@Gk`^s9%Ye>zkq>2=mW6Z~R{nNOHyD%9#N%EfwgV_aeTk&9 z4n>VDENu+Uy+qOJmzUo$su8E0Q2pHI^A5a%?2DAoAm=!X)=A0>&S~S#!L1^dLZk8#r43yta^@5b21Pj00000 LNkvXXu0mjf1dvJ7 literal 0 HcmV?d00001 diff --git a/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s.png b/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s.png index 580e36178b5cd1dd44c79c0686a8c30ea6d38353..58cde350386d196bf3e694ffdb15c47e91094fce 100644 GIT binary patch delta 613 zcmV-r0-F7(1&#%fG=D`&L_t(I5!IB>OB+!T$K8!<3IV;8qzR241SRxP5&a_y#Y5YZ zrtx3!(jO;(+=P0nQoW|wQ+sGnJrsK>xinB(^dhBDludTYk3$J1noZ(ow)>W~tR^0P zFqwJZ`OfUTdGj(b5VCCBz8eDfg!CYz+wI;kP4h*&-ToNF`+v0u6|r0{&mwvD8N^oj zRkTJm21%9)dXDWT*EG$>-nlFh90$%X^oLX`^;fuBsZ`1X=7ND2BF9)apk#gr=j%7Vd(MB+zq->)5-tl!}Od4955 zt(K-#f3Jv^WyLvmUt^+k8#6qi@6BfOh#R#KcjmmC%JZ~r$8jupyI_X;NSKyNp3?Zb zVHgwGp9ol$3aMxwozr!F5q}nYfeIgoB~h3p+l)q|xqo;({*$0X_7QP*I-N(TW5(q* zGxrAHZ?FgAyJ+bUzqDGd365HYyaX{zpv+ksy{`hP>;Ortz0z=Qi;e!{Hk?r?u$e~W zaqm?sl@z*)j3H``VhH9g5)aYGhv=*TJf}UmfUh)tJr;{Kz^XV6nl4XDCObp#=8*gB z@6bPY+Fm)uDsd-p-@%FE+m_iJ#8?AdZ!{Wm#1gWB<1@NIz${09k1Z4ami}#tEsMA| znEVC30)P1r^?nJwc@FS4%-?XmULOhbT_5ZWCf6_q12OE+00000NkvXXu0mjf7H%ks delta 639 zcmV-_0)YLF1*ip(G=E=7L_t(I5v7z(XcJKo$FrN5B{9h*WXVTQ9;Bizl~M#14;~6) z55=D|`gGZ1Z)I8EriZQK7cnal&?r-*+eeu4Ni!He`HlT9l8 z;`jR{QLZ@7^-nhAKf~ehY2tY~i0URKK9G>0F}NdcFeI0=*{p;83Px!)*^L`$Ed=y! z6FVFT1jhPa(~FU7I$+)jjuxCf5SfrbxYH!l4@?G8NPo!q!gW=eO9Nk_vl85|kUuIp z*dK~%nz3@ZT#x|IL0qcvLs>=;@;!ZBhm0g4s*jDFxt8Q2K3G*0q4_77n#>@08f zxd25v$Rr>@s=9@}$?~YgTw+7?l-PZK2HWj>d&t^1Aw5pw39hYU<-fL-N~JdN%k8+9 ZzYDt|B_LL|OnLwS002ovPDHLkV1k5KE1m!V diff --git a/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@2x.png b/PlayerUI/Resources/Media.xcassets/back30s.imageset/back30s@2x.png index 0c6f1e3f6d6c6ca0e40efe4fa27fa760618b13ce..5ee6f9966bb18cf90b7a1c7f75c40fce6ec870e8 100644 GIT binary patch delta 1373 zcmV-j1)}=-3V;icG=DcqL_t(o3GJ9|Xj^3z$D7-vjdjz+u1V7{XQ8^ymsU4WD!znK z(GM~dsvv@&q=Ku6eh@)$3_<-g>I+WBbl@jnDejBY4xLOC#lh(2z&Th6Yx={7nw_2X z^!E0?Ff%iA3i;k*{;Os8E*7Y-ukR-4Fg`IrE#|uFwgoFj+u8tg8j7uY)+Gd-SFz#Y z;po)V)JFh%cnR~@%q6d4wC$O6I(_D9gOag7N5N2^7%x1H@iSF zJaOnd5cu-X_2;8bsP^SyoeRZS9%7R#LrB{C@u(IDdSr&TGMIYHI#wO?6gPRoz4U zbDBfiN@1RraUL*HR99DDWYQymdk&JPXU(o)Fqk68tF8nO$#@WFw z#e&LN4*$EEXH`^G{Kmf2x0wG@ZT5CS@FoIxkRWDGWZ$}ku7iDSA9B{TaTB#1E6R1%RypOt|z54hwDzEeRterfnu zj-N%0CFV_A+T7H~RSa`1r3Vx2l1B@|AQ*#$FtBdpJ*0c`|3z5uU3EHhVpm zmzQ_ZUYTL99AIhhj=%kh1 zjXv6XQrKYxlG4u=Qyt_ZY|yZ)M++sRIU*W~16Coc9kDL44> zGT)ou)1{X*pKP!@N$?X2zbf6FBu80)kHRxzbKa9(%)8y~D`Wi5^7Yf=2BsA==ipoT zzY9>F#CRXh?$0PmFbus$g<9b@Cl^X2SRbe0MYo7~LDm)P f6IaDph&YUiXK=k2GxQgW*Q12rl#~D+u0X0GMU*tcBjwz zHTTE)-DYZj^V?;r3wO@ro_o&sp8NbwQ`7&sOioT-JTfvelz&R4@(DHnu9L-$1|s5*i&H-3GnG0`i+B`xXNMBQu);HK3!0LZLnF?d@-B zT|Io=z{u3P>FMdmte{6*T3VI?u3+hXiy_}V=)fZHgS#$z3D07-KWHM!QO8ONzzfVY2>eCX<<0$w2FT zWsKut5j*iyvgUEjbe+KIqv3G4K>JnjH(=8Py^&g}oPUl)B7Gby$0{|7&KEH0z=*Gd z$dn2IUA`jNGJ;JQC0Esgd_KP#c^%brO);4B==wT4J3lk_n)(JNojJo2WacB-ZjZB2 z=m!G!c64+c*LnbUaBXd2Fe|klTe%^Y0&bty3tty7=}3@PviBP7{UVz}uqV-X_kW{!nf5uR0sCLr6t~#B*6-ps{+e+3J0o2I-Q+4^2s#hlC#=WCS}#2IZ$a*& zU8d0~*k3|6cS55^C$w&0(wP7yf;|D1DawmZiUeV*SN$n@e`VUR@1+(^3-&iNkjITI zG!QW3h+sPjv;;YAbkIYJ_pq$NFHmgMO2BQ%W`DDBqpN$383&rC)9LxSTu!oahTyw( zo6Q3x!X`Qhy-BrgWNi+LJfpx=fSOpQ@7}4YDcRkoWXOI}rg=uD(s=btlgZ=|AoS4^ zXXh>wKMe&2s1g`Hv<7r%!+{9^z}Y9i^Gt7O#snBw*a4xY0Q73%8x9O0IqEqB4C=h~ z8h;L~4Ct%@#_oY2Kp6x0 zL2As%vq?#aywTjkj17t4fFV13;Ln&=K!069)*dwSY*ChvyxA5Q|4ier0R32G2N;Sx zNH-gUGJSGcAvs0rGe&lSN!IwvSqqhm)hTrB!NE&V*Uq#Bp}Zhg(0`NV;{}$~H%8|PNPpJk z8M4(h3I)_7fO{Y6`TWv0et3K>$9@O?^jk2+-w1=+k8X7IbdZT>vmwCO_MbLa{qg}(cehSffj@a!=mgh^1V4iiW+BJKCO!YIE z@3m6%{|HQs$=qd-r>PIu7+AVhDrvw!$L`w-b-ybs8P){Mbd*0y_-Y3tl!kM;K@Q|7!F(Eazz YA0S>W>i;#k^8f$<07*qoM6N<$g4mv zL<9{&41)M3U_ePQ5|BhRDw6OBAVNfA1QSt{{(-?50}ZbVK_H5SVr)xGA6S~cd-XTh z?#F&#_iL~1^|;3SlD(aootd54*`3{Qzl(?nKmLtCX=&+L|9?1d3|Dk-x-Bj)PCS?{v)t9oKo+`(|8OWY#ZEc;^QysyQ>vklos;ZLe>gqP)+`M2J+1q})$j)w*E?b0fDvk)QC4$R<{oY>S zKLG#XzIMXn@p$Q{hJG%_#>O5^Nl7X4r%%gCGUt6L*iE_9A3>d`-N{FES}TckWjCqG@BUu5iOQ8^k*c^7o0YGaIPsUD{B??B+5A_LqEhf%kH4t zZ6zKdGG*hKzV87p1rE9FN)V#3Et8UieYa7&J?9DB82Ek3$mXPyXdj7P;C}6sC_8}C zpuTDmjDOi2R5oK{va(yRv1u_jZ4;U?T0@5pJp_}y2ydcp)rCU^CYO8@6BBbk_EeZ` zBGNA@y3t8#WE5&~_BA%(hjH|h5(uR_EiLUl_Py+4(>)ax6~m;>)k!6ok&$tb5xW~l zhoBC7LHFq2Xyv>W}9WV|LD$i6=Ry6vP=hNIsB zkH*n`iWaJMugN`l#YiQ91tf%%_*lnVJDp<(qHj#B>QXR zoPTzQBk3HG{)+!EBH7`@BcJAYMH$Dr?+zk2l2XsxM*-)<0$#i1Wx87zUfiH1pldvG z6VQ=`zWnIu=p*tj7_6CLIoWQ^QocPd$CyOj0B*s2C|3@J+;P6o+sNk_?YlqG`E{ryr z`yt`yEIS-W^5B_8k;^C3BX=`<>3dCQx=e!IrO6GtjPlnM=j~TLBYl=q>QoBvQy90} zNf(?5W^vJb44%=>c68aMIy{k-cbG*RoxFj>9Y+^4XnpqmQ>N<_y+h!Q81o^9 zSZfYPPmnC0)A=wglWBRoP6JPe{-RDp&mQDo;R@wX;Ci`Tpk1y}t|~rcVu0UPc%W-> zQZk-oI$yz%FHN0b6_s3iiR#PmtYcE+k?~RXxph1(Y1i7E*HlE zf1>H|aeuUymzRqHaT;#}?~#9KxJ=6jF;*x2!r-{wzepZfrZLAhHa5!b+J21|5Kto7 z<%2OXthEg~BWr5|PBrN?U}y6B$U2>C|#C@I4rlOZysyOD+2>`)Qg^gU=X6#e)vX-1?RkJSXXRHN}=xFj(f{A<7p- zVS76c+V)^@wt}^~)7w0Blp<#h9&nGGM9)BEwQk!$=nVq-HC;7n`A5hYqIQ=?Q(&qB zR87bKD%hpAO;>p2zj{4+On>%>9=T|9b@BvlhbehDRY+;UVA;6kO#3<|pZ#^YC{RyS zRMbBTRyF*_FHWkR+SX1#9du~CMo=;`{p6S$vFVJ^jcbyOJ6jhLMI@f}C{zEZi^b6o zIDekxqtF52C5!%zF6z9sFH|12lML*8Xtx;&?z#ul=Tu~EhY6GvwrMi|ievIQ zju|tb@*DUP6Q|h9fPa0Y+M=0;*Azlyb7f^^%8(&Lj0pp!Ns3o$aGCB>eETKxKR|mx z+T;Nqk252fHh;BIuK%*#I3rNW8v6A*M;pYFSPkTxF+|SUY{ao+6En}Z9)&@s>s7@m zM%UNZzol@!ZvUY9tWHCjZ0Od303)~1Zu|1fQEwZ1V|6*AFn7zO>F0R+FTj)89&GNO)w?8TyBCD&blWS^fj?;OzBKle9k%ePmR4ri*p z0ZrDV?WI>3?idmU_sogY02TND%oQHJB;Lw9-<8 zzKg&|aqfF;$pvmUOSDm~^sksu5Y6VF%{m;(+8K_bYU%>s>@T>zHYr)Rn)N7~{zUZ1 zyXy%YJB49Z!g7-f)59YW9)a)(ghwDe0^t$p`w{pLURs>O*C4Y|00000NkvXXu0mjf Dvr8-G delta 2123 zcmV-R2((FlY?MFa%Y z;1LX^}FP{0EfMFIwhhLB1P2{njFG)Pc63)loTc%np1fF70}(w5T8&u_D{ zzMY-7+jigE($!5SznS06@A%Gdt~c*(j~@SlpC^_WD=I2_Hh(oWO~Yok$K%$_w+Xbkr1sEXPNb>>umfJvM0YU`c z3bM4cbR_`q3xDJAyv)qZ>M-?=RJjK7gfIN)+Ca>4KDJv_hHVR!qqK<$hik|~;LXhSt3jT-} zaZq?KCnx7X6smlpQG*2FwE%Q;L;sWm!?W4h*}rxctP}fWT4#;7Q*H`RE=TFil~q+$ z8SRt_YJV1WB#ELN-M)ujAEa3;Fa-aEB?t0EQVJ;tnGV@U#|h-_XN4|-w)+=#Br)8Y zl$3NY^!Er>|42_yzX=EPNqNc1$-S6!!;za!DkMc*Xy}xD(mta4cm!KP)g9`|AW5xI zTU(oT_UzfMI5ASIvKEg4Zc?8Jqj)GMB0s10` z^ChZmpyvVl1V9T6bpaNK{BZy&0Icl+13hn`=lOt;A>#^2v4evTK{k-QQa1en@G1^2 z3V%1`=&)=+eh@CI0F`T$5 z9ScltkZmT70I2a|Eb7(OWK{9ww89EH3&@RQ=O~B)oKtB$vCkF z8nVaXcs)Zl-P+zRkGvc{zJ!j^+epM2IYa2!@2qvMM^YKXfhK^=mPJCGQGB5|yvAA% zmq)gh`iDs&cSGp$@I3p1E+4Zpn z1UA5W;OG*Nx?`OwOVj}REwVT0@&H}Ws0mDqm+`gVz$5sJdsI3Qsy5ES;)NfgPR%`AO!?KzffQ_I$D*x^>7ss3|TqKRVhG< zGB2|^R$e9LZVyt1EXjD9;;1(yE`LA@2%`3bQ2hu03gLD8ND2rd88Tdj&oBN#5=r0d zinxv>5l)hD#sx?sW_$Y(Hy~L>eOrY9(tf@VF5)7R3`-+OB3v$@ePdRkhndJ-iX4aX zIW8SwqmBAyi_+~T#cv}>F!(OK1CgYmJh^{O=r@y=^YFQ!vhg~>O@}+G8-KsOL{jc) zLw-D^$fMZ53lD%EKp^P$oAP`jJ1j){0%G9zWc=)9aH*O%VZo84H~Q%f5%v((r8@rt zE6Yb1rr!=Q`L0<4!xhF}Q%iu3qqTIxdHQB=dwM@OE*18ao+=1?a$t?gizFg4_I9aBH$1rU+V>{@irflHzbEdB@Z7-MkUc5hF zU6i2kVx>f*2T?kOdF(p`Yjutn>Dcio6@Y>JRI3qu*~cgx4Gnq)A#Lm;*@M%ql+)4~?2xm}t zz*J^&8Ous8d*B3Y+WLsS8tmPMy(1<)if5}pHBgjEKM{jPq<@I-5ix$4c7=S-QiKDg zN{1b#Z4&wiQ$LFQBT(DODIM7OoBU)(&mP6IqwNMM3K+UWA=_~z*G{3%#~FEW{aF(E z-=MNEq@hDrXX&tkq+2Lo1Z~$3J%@OVn$GjC?bTRqnNPpl|eTP9RLFUas=FMt=j!`@}DWD{3kF{rb>V9+@q*4UfX>8DoDfd@A zhiNfq(G?ukJ_cw@XLLsmQj8K!56k`SM0O6vNtD|?zf4a1!E9yTz0JHUHnr&p&k>MT zg8)pGEdY8a>1OI=)eL(C1XL4kU^WJFY1^+uC-9Hj0H&L^@x^dl;l zF|2a{kwU~}!D=K`u+5b9?%n&i0M%vxFL$5^{sEW7Kvg>fG?oAW002ovPDHLkV1oNC B;iUio diff --git a/PlayerUI/Resources/Media.xcassets/forward15s.imageset/Contents.json b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/Contents.json new file mode 100644 index 00000000..06def79f --- /dev/null +++ b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "forward15s.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "forward15s@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "forward15s@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s.png b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s.png new file mode 100644 index 0000000000000000000000000000000000000000..9f22c6b952c0063153877ac23945d8fbec8f0414 GIT binary patch literal 565 zcmV-50?Pe~P)^KT(=>0g+3Z%eTJ@+{O%0s-nM|fCSWVMzFe}k$^udbdA%jZ&RGJ4c(p>Qu(eT_+ zqN1+r+u?9{-%*VhZT5Zc@wV^8tGBSR=YcSsLO}7p9iVJP^&DdgIB8ycDvn)P$+a)Pt=^A?pZ4$ z;p>U4S&Se+D` zk+qJ>*q8z{OjYaikqwMN<}0^;*@}1s0)cz+yD7Wi_$R?NkU^e9wSgVrWUqq3;EP2@ z;!PavkXUuZVzC4ApK1E&=^#QuD3TbOz#1!HHooFTftly zX3m_MIschC_hfR5ivIV<@AqE~27{H^=E0e*VIJ&OhC-n?ot>S_vWYdEz={%yM9sj! zz^(T7_KQ6|J!3Ng99Ccg1b}P9;czPe7mCi#M+BG&VjKYP0`5#85GebXfEic-x2399o7(n@1XA^JWJ$-GF1=s{pD6Yzg=Vy`5@a*Ga~7-B8Kb%F4>Nm6w-yXS0CuR@&c~hK2^q#hXo_eA^`N zv3v*4HC_SO-)69ovA@k&Uakx7K?hx^Pc4p|;GPQTKxh!W#l^*=b)8+tEregM=yL|v z-Q7Koh0hako(jq(8ib8evi9tuOWmi9Q;COB9*~Kg&KURKsz@aAieLsP37Uc%*-W8N zs~U91XutQD(qXsbSK0+JQplQ?fg9ZkOiDsY+9*?Ib8jXHstbnEJ zyCh?u^`1)yVwZCP7GU?wX+*1=IjLAAr;w+sg)Sp<1fO<`YGC5OBw^i;L1Y6DTa*V^>#K##dW8X8>hs007{I zjJFh@HP8~Ml@PDY7#`-2lEobYN^v=?pLJzlU*9}^oQuqLQmy&>k*ARDCOVku$cweP zBV^7iV=3hWv_po3wb1svlLb~}A8Gu1vl3&31DR@nQ(_&!qN$9S} zVzHoVB!z4?e;jglX0yQ`CSBGYi0_0}h>m+vojv189#jn6I2-@OWik~{*WKb9BZiAz z2PskVCkdSgaO#>UH{%_~<_dBc+KIl!)W0NlvneMJzk17J1YE?#DP+B@Vml~KtSFA_ z;c`Fh2h3ZjO#>C-M}D=wfTiXN9H_U$o1hcWTgY;i=+4>7Z1@Hs)JM7(b|2#3ce~xq z>Nx3h$x`adp_FNlYWdvR2%rf6U*A<$R;q5K@Dwso$be+vCnbTsk|C9G1poj507*qo IM6N<$f(w!#yZ`_I literal 0 HcmV?d00001 diff --git a/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@3x.png b/PlayerUI/Resources/Media.xcassets/forward15s.imageset/forward15s@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bd196ce0e3f1ba4ea14fc01005b1cbddee0a1533 GIT binary patch literal 1742 zcmV;<1~K`GP)Ylu{37{_PtZH%zC?!CgTRWUFraAOq=gb4bulwS<2Ha06Q zOh`hc%rF8!l=VfrC}`$~NU4Y}5Tp>uMuz5=25lKed!K19vm3j!yEFZsY0v3B@0>F` zXLin9a1Ok@@AJI3=l?v0M{*p?cIc-S;5SCm=xX|C#%z0r+1FXbY^;~Ib z>EpGvwZEzSL}}MrNz_;-^04HF+1c4kSoK-bNf{}rLYWZWt`B2O+U3pj&S2S2#_F{M zWqf&ONe#><=%1K@w`qI}neQNdxa<ATg6xts>*r^Us^PuJJi4~d+PAQ|)< z$UjC{AqDg8189J-qoJYUv@OVifq_o8RBr>UJm0|S@&fdcIFMNI2?`$73+Ef{XvujO zJp-V;wjcoQ$D~X$Ov66|&~Xe>`493%3H_9xBlh}pJG+h|qs*=!sDhd93c#lj{9QFu zNe7v&o?#Gwr0_gXCb8o&WdPh)Wo2dCYHDiwOy+#TJf{J0yPi2u2dUh~hPcNeKdWrO zg%IF*tmin7#1`~mFnBWs@3NB?3+~8OfXFLDXH6o2f+=Rn>FH_N$;5qV=_)RIDlQ|- z4CML;&)WmI!=$4NiDS6ya)*MVshs)%<@!7s14%_cny~}ZZ^z6MZ;GL_kFDAvr#TJMwN@M|6hJyCChyn{(m^qK$G$Esnb92& z=hj^zUPeF;4GsALcW7#A>PbxixlY-l z@#N~im`m**;u1YC5zRH~tK`3|m+>4V@BZrncmjcM*E@Hj0eF*JfKF`*-<3NgYDmvR z$TBX+UPHUzx&bKd;HI^DdyAnxu_WM@5xzz+%e@i8M*y6RVs((8abW&rA)uUEY)>qn zfJB&ERe*q-fZk2mOt_!0&{v}tp#E9Tl*d(`n{+Z-b<rb>feDE7o%S+9ne zQCm|z^rDW;@XDE)nU~Py=S_Pp)n zsl5N*LU_>mfeIliEKwSgWCi~ICh@}>-%}DmI!L*Hjr*9nPcar{N43$&BrU&>T0k0O zGEC-aqo5XVp`o|PcePp8+Hgf;xfwMis!X{qH6Jm=KzH>eQN3kXfcU0C`e z;W2sU^Aa#^m&&Qd2q^eQJDCg~rK9xy zAbtOtWWVxv%A;6OTs`iy1u3QIAj)KPjL?FH+M$oa?j{aNUR+CQX3*~y!YYK9d1Az_ zdE}6#<{iJ^zml?!|2Cv$Mzj+kojhE%gq>G2?z)O`cpJdvUma0G4{6I1lFoh$Z51?7 k&_F>01q~E5a6M??Upo(XIKt1J#Q*>R07*qoM6N<$f}g@h=Kufz literal 0 HcmV?d00001 diff --git a/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s.png b/PlayerUI/Resources/Media.xcassets/forward30s.imageset/forward30s.png index 41a7e3fcd08d70ecd2ef2779e41d5131a49d1cb9..90cd768feb4b5b9727fa50d195269aa485fc9dc9 100644 GIT binary patch delta 601 zcmV-f0;c_&1%d^TG=DisL_t(I5zUi5Xj4%X$MZgtSPd?Ld})0a1F!Q1m;tz z)Q)G%M+TV=lj$;q>E4XL8Gn55_^i5VnoEg9V%e(

qg4gK*48`q$+{!*$&w^k7#B zZBf}e!uvy%`c`HmG^d3)dj_%A5TO7)^Tc$|lF6jkGh6jYnz=rTkR*cF1nwbn-ydV^ zW{+^RgMux~%74V;@wW#KwHWK2^%D}kvBY{S()Lg>jz7VT$8>;3X-~OaKBe0v{()k= zzsHW_lslb{!}=wGha`x9^8$XS*=*+VyUdFN#o(SM_!hTyjfQ6-pQpmB_)MPDQ!pP4 z2Gi`nXHRVFua$*Dp|21xas6xIaCisucPg|=e&!Ls;t0=cwVKQR3+z<_CxrvPQ@E{SCQUMIC})nqE098J(}PGPGS82k#h+z= z8RwqbKdJD9!aeUo#z*`PbAkDj1UV>axlJ$wFGmZ0NZh~yF(bU%7lc7sOHEp$rP z^#bY`gFAZ(=zjtUpHx-7NW#}jrLvcdW&FqSf5ShGf5kzu9TtpTohRWk31v;wP9+kF zOgG#u-zR;!aX=%ZtCOo!U( zbk5j0Z^z7agv)ED#LIncI9A7W@IY$M&XF4WuOWr`MSlqB#J`Yuw7b|Vc_gJ)tLfa^ zcP2(G7CR7+$E9HZYBU;+eXUl@+DtecPOJ2oH1Zp=Bh6;>1>dgy>PDx3AK{m>d6rBj zx2$#w27~u-7}zu|l}ASo=?u#0IX{*{U*|*%l3>A7snidXmj%7v+bN(;p64e*sunj>P;B-w_(UhOPiv?Z*u3AJIJ{a%a*P2yp)}(3NW}&)Ghc6S9f-ga; zevzS21rZc+6r2SSK@`C;1pOw3`9WnU`pNk=+!rewI+-Yn16_6CCae^jzS%U5v1!^S z^>;4Mxjf0%EKRdkST8)B^PK0r{O>u>eeSu}t3|zD?;^eq zFkWtJYnv$m27iD$Qu`)K&%m!$na|eN);?LQcWgj?$^2e;6|WWbx>=D-38*zgLMeSd z-vO$1OE?_<-YF%A-p+hJ|7%hC&Y<*?-|s)x($ezJN&$27FIfiS3^JaIL?XvEj#ElN z?I{M;*w}bSb8~Z26)zP9(7WuZ7eb*>+K!=n>^@s4nSWXZP{YJ|nkVopJGSx)Y>Ntn zO8M-0wRr%2*wE1MT&bIPfKkSRbE+D9>OwaIpfNUhPit%IkqfQcGR>GRyHxzgfk0qy zQ&ZDqIRTufviOOKMxzA>Z#j;tt>d0!)pop6f9t@Oo5A&rEjME;J}&4!JLu!LaTYcc ze6YU0{(n?37)+G{GB!3AM*nu~e06noKXGo36zf-fT;Tj>9QP3*W;^8&O(E;!RkI&H zZ?AC^t#qr0Sijqr!~X!lZUDwrUeO+#oSfVYsACEW06E6L;uKjEH7gy$pA&(826OJ!%3U zAwyBRiZ=8=6&bpc&HZNGQ&A~tDo@~`gOLQ#E}Uo7A#2|dBqnp@TPf*~WD8(t4A2Df z&C=J44zhZ_F@~Ta9Xe+ z;l=4645tmpag1{ON%o#qJ7n|916*UONPo&+qZ4>XSCx+Hf>0d2aj~Bss?R=pjW%gJ z`(_hP<$Q``e+5~5i!wX^CU{y0RUay)F1R>)LMp)aobV1X3=iVe*$+lx8$UgM#PP#Y zRy7iep_j4248N{np99^=#~3>EUjl zXa2QOSdy4ceaa|wu$SKF_0$Eu0q`#(?@?p!{#)VsfR$eVpzwg*NHydi*=?Nkx6aPa z9!Bi^D3h>F%6ef`hryEnE`PM;7N_WbhusFXEv5wNXa7AYC6+bwo;-@(&SG7e zqj#FGvn~bZX3Q+k5xf_rn;3nf%qaK}6+N$e3y_hfYsVU!BQhj|2t>Sx##SvRsYu~o6Rg}CJsSstiDp-H?X$0w)bjkYEId} zfO-&cFI!!uyl-HDN;Wn&-b3JTY;eH!0qzN_tAzKJZX1ZA@1VZM0Cb7!0iA)rx1*!u zL)Dc_eE}0Nsee>z3t%?TLIAlQdaEmV9DO(7MqT=nV#UA!vk@@80Jx8KX-V(%opXTO z0=P5ts?uDrboYGk^z`&*rs_Z})w_3yN_wEU=jyhJO2K0 zAE~RW>jTh)bofQGs>a zsDS#^%GKZst}q^ zr}G9@zZ^WDw1Hw2Y6tB`!Y6z%Jyir9r8y)LK@m)(@9fh_T+jD$z4yl|6Mhd?}`G$7n z=zdnqPM6M?2$%pb+z-7?9g&bM$E?RSTcXbc6M-9$6kc#Bha$0Wt4(kfct0<aL_t(&1?`y$h*eb>$KUKV&f+xtSfn*p24fg0rb#tWgxM4% z6;V!1mP=q^Nn}*oh6b8YCYm6X(I%!AS!4!y*rGW_E&4=2PZZea%otZ6R zub%8d#}{@p>3;xI2z`VTc&3AIBf}k}k0qN-eHWl#)zsAF+0dCpz{|C^wsu5YTiXQ2 zjbe!;b#-+OM1o#&3%Up18Dg8q@?Ed%^azp+#k0YS88Dmv_4>e}+z05U=;-KKIXOAi z5~n9fHvMGe>!_neG29A3YpHW`b8|Pif~>5pEa6JE3V&en;RenbFF+si1IY|NisD+Q za=6i+Giff-?Enhv83dsFo|Hp|WB3;UdhS66pFl22s6fAyw!cfTr)xbi%IW%n9+`fokEkYWAKe! zi2v}A4}U5fa18`7pV{*~M~nx0U0vO!D2{WBmKmHgQ~?sNY@LFh0175!CR^o>U?*I;}Om@eSjarQFcmeB9$ ztK%UJGA1Twe0FyBp}vAs;|AiLQ27eF4Fy1PI;24cofVG(5s)5<2|IRVCc|#ZJOYl) zq(@@Hj{U!w$$r1_@a3<7JMcAB`K*%7_3RY=b?^<61T01V znhC^G!Is-wiEN2o#4yTIq!V(G%;0JQicwAoW<9|Watt+%eY8l)rA0rxy}kV| zohN+(&J51e`Pi$#UJ?5_g+I>u&~NH;Y^5;fIh_|$kn-mXd zH51@s=q-w8wl_IwAHWyDyGZe|*9fqw*!zNhGjA!!N!on+woj=5E#~9gWoleVLGo*_ z0K@X>Qq_$a85w2DncfoEPMxNosMGAN4Cq-pkN$d2(Sr`2Z`iP53$Z6J*s8=6izLV> zAw6Bm>epDk%Cy~EbA_%zkcV}ezJEL-Y{21tJ6Jpi6%pRG}}wD4?)2dq|>`H#AeqyL>w>*GT@le!bt=kU0irE{CmIF_%1 zF- z?WXU+lNtEQtOuDP6>K{8?|-4L;?UT`Lw}@W{ND~b-9g((?D)y?W!Nw>$bQ&|lLi!% zZ6kfY1oo3WY#(s&1133fzd>25QScFkue%}S(vW4c$I*YEdJBQ6589=sOf^bZ(YBUx zS&X;wpi6~eELRlTU~I5yoG0!l(<_i$x0v&y;CuM$2KXl05`8rGr+-veR~ITC^a<6M z7X3_k@j6fMBO9U9=vU*XNqA~c`q;S35U4Eb`m$`FB>M-bGvqfPv@2kekw~CPs-hQX zGo%sRTI9Lbrm^HiwSFJ6g=`?j7Oz>i>-vuVoesKG(H2OaK}P|(QVED_iFdorjHB z{;#fa*s4!RNO)W6*_;TIC6UeZW;=rdeS9qD1!IwnB>;JsJAcAheL0sA{2TChuq95@ zmpA*zpzotv1-|T`Otp_hz{#G>!FQ5wn$S|vYosowyOnx5vn%)8BC1u8zk;0?6~hmt z2*`d4%ko3I)0AQltp!qa06HI#%X-lF6A_f01=9)abElAVU=H?HQe9(p>O&t(PEMYf zl9E!VWVYq1n1AW%>F01*MCMBfKr$I{VVwLVT@~m6blU;&lp8>?!C4`;rla>y05-Sr zMlwMMC}UhfiU6bCI9Nx`mzPxNwXhGLmnQN_(6`?gYX41>Bo| z#>TRQ$D${%VpZIIcRMflz1fJ!BN>QfAd-Pd1|k`VWZ--T{smjLdV?QpZn*#e002ov JPDHLkV1jz_GI9U_ delta 2142 zcmV-k2%-1z5c?32G=DNlL_t(&1?`%9Y*a-Q#wmRl?1Rz=G-4D%h&K8ana&fT3R})qkp4g68%*sCMNF8$;r7G zt-hl|5`xRx+uJu-Nd26Wk}@$nJNq|_%(blRBrjaJ&>!?=cro6}A}%iOR9afvxXjGV z8mrumd~Y|5T5ZP1#}Bm=lzL>t8yXsRlcrep-N?I6GASwP6ke;-z(eqMrt)@DS8=#% zT!>|5Wz~`_(SJya41)KUm6g5bR38bs>m&u_z<~p|;mws!fLWB5l$4Y#cdGBM-1UXW z3Xnx;GoD*ym6<$)&_RAS1G2-&B9%s!Bn0Cjx(o1AH3ATAVWGM^FE8(Ntv*~?R7na* zh^9icm~5d28lo2y5)#Je=H?#L>cf$_MiMfKEGQ#L$A1EBBr%tmP3$Lm2-Xez!3@+j>S!?6)Uo3N+6=_6!MvNFmd@*&f5kTDWWibv!){v2)Y?JhyV8I&gh6URncb}I{|QJ?^*-G9`-iwE|TZ?fxFR8$OMn(sqC#9n90 zv^(6lZ{O+Z>FL!*)}1scl6Y_v1Q!SD2w(@OU&$izos%8|HGzGq?0Do|sRrz9XMpCD z%CwG1=yJLOY#qQH2?C~+0hkN9&jKOB&Rp!giB6J}9@Ba?1lKy%hbs^0Nr2g}EqwYB z?|%{J0Ibrd!cyp*>d%orZ4ukEGOZsfC@6T(UJ;41BS{F##nTa@>TO1SeSUua3P{ST zsRr66G1a$GIYU)INc&0_m}zXvk2vXcSFWBX0hh|u+7^J|2E6xFAc6vnfqIc75W&+B z9OEWI!J(35W4)fb>qNmGAoeN*pR~*EWq$@pF0SU;<(6`BYHI3O2>xo3xsvspuIxi^ zWFPuHApPnfcnE@bkOuW~W~$a>$M3X3`z_d6Oxo%SE1OY2PqwzUuFwe5PVQ>v1WQo* z!OkX0O`vTD&+>9s;)kO}Q2O@qmb|DTc?NKP`GpUlqi?07c8jS%np1eZq z?6M*W8THI~S&`JdC^DW&ZFAtH9 zpM#L~7?Sd*6Ejc#COpqxdl#JA3?UCm?pcnZU}WAD#araLB=x%__A13dhJQ2bI?ln~ zD;dgPgIjJeS_GbFx^jJgj=Y@weFBOZG?3Ft%m(hG#(;CV6(Hqt;4U&U4@nryT>Zod zZRvxya!eJOfombp^!O--g%7Atw4!$R;)((u6Nu#tO7 zCMPHFp`zYYSkmOi#zyaaw|~h0^(?oFs~tcTv-o^t>bxZRVp0BTbGoQn%KgtU(;jt@y( zd;+D-T4Q7r@#X@Dx~Pd6>|_=jxpPw23A+~sm=8%2@UiVG6e}dJgn!M9qH7;PDE;|} zAQ;c9;VsgeeJVN&;FkY3583PdNXl1@C@-@sN*Ut`Oq2KNXo6Pnri{MjORim{v$cM} zEC>9BYMmy;ko;9THD&{HozPNDO^5!nak zI_V%k&If;Uxz#%!KqurX2Jk8x$snrt!Nwp2S23fWH)So2(}Y$TL`SgsJxFI6R=G7V zo~L|(SJ2C>(8boeQ1hJwJCFVzr){cJd-`leXAytFzwM-BiAkj-S$8(*7qGG)Ykh zOaiO!8nW_7t$(^`iJlt)a&5#-yvLvE{CGd;ZbBkytaeV{cOV*-n*+$nr)x`i-epFF z9Ks?gy+AOY-OqHkSWi$a47umv8l2_UVh!YW2B)rTg-z0GPR?~auS=0l6Y|!&Q1f_A zp5uLZ?hRf`Ur?5nyIUb5Bn<-j4wkd$B)ls}ppgK)9#_(drrsfyg-BN6qr^|;6-4@% zgKk*jh?2A;5Q0@zRoC!($fGWYn2d+o7=&h~VL9Iao!3AKr2LL|c3c0KyBLAL0iwG; UsLTouzyJUM07*qoM6N<$g6-!HM*si- diff --git a/PlayerUI/Views/PUIPlayerView.swift b/PlayerUI/Views/PUIPlayerView.swift index 16fd4ba8..8d6d2055 100644 --- a/PlayerUI/Views/PUIPlayerView.swift +++ b/PlayerUI/Views/PUIPlayerView.swift @@ -511,23 +511,45 @@ public final class PUIPlayerView: NSView { return b }() - private lazy var backButton: PUIButton = { + private lazy var backButton15: PUIButton = { + let b = PUIButton(frame: .zero) + + b.image = .PUIBack15s + b.target = self + b.action = #selector(goBackInTime15(_:)) + b.toolTip = "Go back 15s" + + return b + }() + + private lazy var backButton30: PUIButton = { let b = PUIButton(frame: .zero) b.image = .PUIBack30s b.target = self - b.action = #selector(goBackInTime(_:)) + b.action = #selector(goBackInTime30(_:)) b.toolTip = "Go back 30s" return b }() - private lazy var forwardButton: PUIButton = { + private lazy var forwardButton15: PUIButton = { + let b = PUIButton(frame: .zero) + + b.image = .PUIForward15s + b.target = self + b.action = #selector(goForwardInTime15(_:)) + b.toolTip = "Go forward 15s" + + return b + }() + + private lazy var forwardButton30: PUIButton = { let b = PUIButton(frame: .zero) b.image = .PUIForward30s b.target = self - b.action = #selector(goForwardInTime(_:)) + b.action = #selector(goForwardInTime30(_:)) b.toolTip = "Go forward 30s" return b @@ -619,11 +641,13 @@ public final class PUIPlayerView: NSView { centerButtonsContainerView.setCustomSpacing(6, after: volumeButton) // Center controls (play, annotations, forward, backward) - centerButtonsContainerView.addView(backButton, in: .center) + centerButtonsContainerView.addView(backButton15, in: .center) + centerButtonsContainerView.addView(backButton30, in: .center) centerButtonsContainerView.addView(previousAnnotationButton, in: .center) centerButtonsContainerView.addView(playButton, in: .center) centerButtonsContainerView.addView(nextAnnotationButton, in: .center) - centerButtonsContainerView.addView(forwardButton, in: .center) + centerButtonsContainerView.addView(forwardButton30, in: .center) + centerButtonsContainerView.addView(forwardButton15, in: .center) // Trailing controls (speed, add annotation, pip) centerButtonsContainerView.addView(speedButton, in: .trailing) @@ -639,10 +663,12 @@ public final class PUIPlayerView: NSView { centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: volumeButton) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: volumeSlider) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: subtitlesButton) - centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: backButton) + centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: backButton15) + centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: backButton30) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: previousAnnotationButton) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityMustHold, for: playButton) - centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: forwardButton) + centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: forwardButton30) + centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: forwardButton15) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: nextAnnotationButton) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: speedButton) centerButtonsContainerView.setVisibilityPriority(NSStackViewVisibilityPriorityDetachOnlyIfNecessary, for: addAnnotationButton) @@ -709,8 +735,10 @@ public final class PUIPlayerView: NSView { nextAnnotationButton.isHidden = disableAnnotationControls let disableBackAndForward = !d.playerViewShouldShowBackAndForwardControls(self) - backButton.isHidden = disableBackAndForward - forwardButton.isHidden = disableBackAndForward + backButton15.isHidden = disableBackAndForward + backButton30.isHidden = disableBackAndForward + forwardButton30.isHidden = disableBackAndForward + forwardButton15.isHidden = disableBackAndForward updateExternalPlaybackControlsAvailability() @@ -839,11 +867,19 @@ public final class PUIPlayerView: NSView { seek(to: annotation) } - @IBAction public func goBackInTime(_ sender: Any?) { + @IBAction public func goBackInTime15(_ sender: Any?) { + modifyCurrentTime(with: 15, using: CMTimeSubtract) + } + + @IBAction public func goForwardInTime15(_ sender: Any?) { + modifyCurrentTime(with: 15, using: CMTimeAdd) + } + + @IBAction public func goBackInTime30(_ sender: Any?) { modifyCurrentTime(with: 30, using: CMTimeSubtract) } - @IBAction public func goForwardInTime(_ sender: Any?) { + @IBAction public func goForwardInTime30(_ sender: Any?) { modifyCurrentTime(with: 30, using: CMTimeAdd) } @@ -1230,8 +1266,10 @@ public final class PUIPlayerView: NSView { pipButton.isEnabled = false subtitlesButton.isEnabled = false speedButton.isEnabled = false - forwardButton.isEnabled = false - backButton.isEnabled = false + forwardButton15.isEnabled = false + forwardButton30.isEnabled = false + backButton30.isEnabled = false + backButton15.isEnabled = false controlsContainerView.alphaValue = 0.5 } @@ -1242,8 +1280,10 @@ public final class PUIPlayerView: NSView { pipButton.isEnabled = true subtitlesButton.isEnabled = true speedButton.isEnabled = true - forwardButton.isEnabled = true - backButton.isEnabled = true + forwardButton15.isEnabled = true + forwardButton30.isEnabled = true + backButton30.isEnabled = true + backButton15.isEnabled = true controlsContainerView.alphaValue = 1