From 91a8fdc392bfddabe235d098c2dd90816e130975 Mon Sep 17 00:00:00 2001 From: True Zhuanjia Date: Fri, 28 Jun 2024 10:27:06 +0800 Subject: [PATCH] OSCLayoutTool Improvements --- .../square_and_arrow_down-120x120@3x.png | Bin 2785 -> 1387 bytes .../square_and_arrow_down-80x80@2x.png | Bin 1495 -> 1069 bytes ...uare_and_arrow_up_on_square-120x120@3x.png | Bin 2834 -> 1389 bytes ...square_and_arrow_up_on_square-80x80@2x.png | Bin 1616 -> 950 bytes .../Input/CustomOSC/OSCProfilesManager.h | 5 + .../Input/CustomOSC/OSCProfilesManager.m | 59 ++++++++++ .../LayoutOnScreenControlsViewController.h | 6 +- .../LayoutOnScreenControlsViewController.m | 66 +++++------ .../OSCProfilesTableViewController.h | 2 +- .../OSCProfilesTableViewController.m | 104 ++++++++++++++++-- .../ViewControllers/SettingsViewController.m | 22 ++-- Limelight/iPad.storyboard | 33 ++++-- Limelight/iPhone.storyboard | 28 +++-- 13 files changed, 241 insertions(+), 84 deletions(-) mode change 100644 => 100755 Limelight/Images.xcassets/SquareAndArrowDown.imageset/square_and_arrow_down-120x120@3x.png mode change 100644 => 100755 Limelight/Images.xcassets/SquareAndArrowDown.imageset/square_and_arrow_down-80x80@2x.png mode change 100644 => 100755 Limelight/Images.xcassets/SquaresArrowUp.imageset/square_and_arrow_up_on_square-120x120@3x.png mode change 100644 => 100755 Limelight/Images.xcassets/SquaresArrowUp.imageset/square_and_arrow_up_on_square-80x80@2x.png diff --git a/Limelight/Images.xcassets/SquareAndArrowDown.imageset/square_and_arrow_down-120x120@3x.png b/Limelight/Images.xcassets/SquareAndArrowDown.imageset/square_and_arrow_down-120x120@3x.png old mode 100644 new mode 100755 index 75f855231679328b9c5ac53530405c104ed7ea98..b39ab97dac9d04db7ebfc2efe75408c8e7ad3bc8 GIT binary patch delta 1379 zcmaDT`kHHkWIYQ51HQyWI{z6_Rm$D zRW3EVEy7uK+tLMp!ySE8g?N?R)*f4;>)5S7;gZ{tE!y=_%@6uB7Q1S>9dwUgvCwVB zty|OWf2nV~A|T(|lyRBeu|sON?$Xz+Y;9fmt`LPXwMbI%I!KCDG{6I;vAEiKus zocm?ZBV&opIfkz-b1!ea{dnbygGD#&PNiEu<6ZjabRWZN^^ad8Pe0#qm#s2-jWdrz zyV==W2b2F8E}wFA=0*GP`Sq6%sdby4n7y%acEqw9`!*F$+Ii`qvDj_zi_te3O;n@jkDEtwu#?NWDUFAJKuIrX6>oRX2!qyWOu}HN5)O_i+)lb`k*HDd*}z* zBIEZiOtYtDo_c-a+QvUjv;Q(n+>gkcKeOg92hUuS$Vu01W1hz++&FD@c2iGp9b22; z=|%n%>VMX;wb|ZMb+J7EQ(7YK;hIJ3%lItjIL58(T&e4G=a|y+hIXS9-b>y*uW1Q8 z@-~vsGR~QEr{~)0mYuU+6jkxeTrxdc>5I|whU^t5FBJY+zUZv~9`D`z+ur){?$?gW ze01R5@$Z#=6+0JYRCfNqeOU8d&$&5f#)S`<*D=c%9?pDJe_(m$qfOZx4x4;hE!{V{ z^HTNCMk}uwB^Dv6f{zrQ-?5y0($_oP;_=p;%lCI~Vc_0?4So3UG%5P>uE|zh2D1OJ z>d#^^ka(P3b&2_pj{JnFZEjqf8vTRrFAe_?7*(J+yFYSb)dTm-RwCic<#t%quRWl; zl6{_+_J@#HjfXQ?{dSZsKXk6pZ^B!p2P&&~X#f5E!SrVj-}KuhlZ_AfrAE1~D^F_A zD&V@IU0!qIXfrm~V09u$(7)m9cdp;QTg(qh_Gq`o+-H2Qd8>ZMLD!=JudE-mc9mVc zaPRoWE9D2YF0MGZAZf?#^xPP)t&8Rx|LF4;Y)g7o%X(+QoeO3MJe&8w2AyT@ z%>2D{_K&#gu7_;5GM`$A?>L~*R%E{VWQW+h?447dwCg5qf0vpi>TUX5GwjkM12xx> zpp#l$x^ik6m*k~aeEU)!m3I5xcI*D^n(p0ZQP(q7o>Y`L*cSMEN0f&xe}HSNdvM=;F|5} z;uum9_jYdS8e4bKhW(GCws>3=(wN8K`{BVmzSak=L0fisZ+IlYp(&tZ@&AF}2PMsS ztq<~!E)1}dpZWW7(azn)Y31*$^WU9Q(XZ5h|K{Dz&u?eWooW00Ox>BqbD4K=6=*(i zd9e6EdgJ~4-*4YOtU{ElrWPiQ)1bLo6m9ujU(p7?YilNH& z7=?O2-Z|_R$-nk$UsfnzDcs=CSbvgp*?)iDh`;=desX*Mt-28(tanAfaXtgvz1e1u z&+liOxB2^qm5&$M-mh#t%{1MoGyY%gvUv|aPx}4Kt|0xv@`KIG*lHvny!f(!E%b%R zZ+3+j?-`FX#6gWJ)2?uEcg6v?Nyo|PEC1c zb*m+qVcT!fSImu@`>(C|&vKim;^(>jQzkvDk^NiS~)5VK6G-+#Ouy*^0DRL_UyQ;n@-6b#to0ohhA># zv`ySn%V%MtwP%7f(+$mw#Z8~@oM%|iXcw~KS4b6q?WbVoc|qGZGnzBy%@6xo^!!@) zTJ=wJ=RElIzn!5@qafmelGE0jLwVO0-8$W1y6~GlM@4MZ+tih=Zc7{6cf{XLCE#j+4jL-Pz%KG|!^s=~9=U4LQCI{48tsJik>J{@bWv^?};=!jeok zzGvV6e&2_Wix{!pey7-)s-Kl6LSi{`u;2{h!tY%|u=^?Fiun-G^tK z{oiHXXUhvn+N9V}+x6?#>Bi;LH8wilyv6W4@L`SZw*tPJze3ff2dY>T^T(yQNPPX@ z+{FKP_O}H4JM+1J2!B}2IXyL<^+%GX*^fD$(**zb>)nY@e5H5msf+mU_jB#Ie)N93 ztXZQu%kT2@3!52hetxMfF=apTfYIJ{pXrUazMK&|zWW!yz8Wz5Qp85Rujz~tE7~64 z+jE$!-e;ncJcq+Pt__?e{QeJ3V+%v__I=&d;J5jE!sl5%Qah9SRcpS_)Ox)A$kQWUfbKyzjkNC-A`v57Bd~W^4PDz zGdcNI4#RC<>6rWnaeBO0rX|9{Ih0y)s4S|DLnzxm9WP zbBXP-R%K-ky?-}xix#cRY08wf6R?jnn$h^EY-22cM}u!|Y+Zl6qU`1w_2nBsCst*h zl9n>w5M}rO4MX+k?xU>kXKObm>}&q&VtZ-b^)#_I=571#y5}?2XrGMdsL*}j6&n9L zR_dt#-jz>v7_&3nuYG5EH?i)$@xI;Fw{vGPm-dQu-D16QRsFI%&&RFHI-)N|=`36S z)2d+O)4#%dio@3%M<0+nr1xvu0cGRPe71YLIUXH2y>rXu>FeIb9^hMMb1dN?cM21i z?!QNEmySl(9W4K{hA~^&_Tu-AD_8HFB>3)6F30=NMh(8FYoZjcN1it|&v=zr`R)CK ztL^b8*sj@|2|K?zaQxupOtaW#9d8v0wwjMU&wurmEzV>R<%2QKdqRf z-p~4JwaFy;-5r7#7c<6fniTg^<7R7*vHKcxhiBR^6;HKl@>+bo}#G0QQa}DQztFh(`-z)tEgaxPx0-E$I0)$?J37&X?A`zP|i!!)+Uj7k<;(=CRJP*4QubJ7pHv z&v$p%UbC^ts7&6)v#?Xdy>#Cjscj#_R>v=Hnm*fS4WpjH(r)o}0kU_Bd+u&>`?~x6 zlG0h+Ut+{^8@PGZpG;>+k1d`vFWa(9xoqc^VCEQ(($G8p4Rx`*?p$iGw^!e%d3HYU zgWK9`D?d00t&5MoecH>+Eir;CE8y$3#_RoZ*BIP&Ls!Ny$7t?Yaf`R$O3>6(rU#}r zb+5WhBZ+FJg1qZf!NRIv-o*zUjo zwa;_s-19!acjVow-}grBxo&Q*KzZo<+dt39qS^lPXt*tKQR>t}@ zm#aepmKVf7+vnvJ_GEKG^bTIe9Gi`dPh-zEd`f3pf5Sm^)`#9uHI0z+?#(4h@zv3* zSjG13Rcx3)f7gS3-4T}$JyP2}_qDLu5k2lW%cc9?&A<5gMM#L+ns)*R#8fu_idiQ+ z-RMdEWZ^j<|8L#@b*GN&oYha#SE>g`*ZQ~L7C5l;QPOGga<8SIu9g0)e7))W%wu{# zn^w9_KbpeFAz*DNnp^z7t3aCR#;%j+uK#NLe3~m_)r%IB7e(2(9ye-!Gv~PfL{8{R z+OjQjlNLmUtDJIBx7>5ZbCG)d)`{=KU%TIVNn2PQ$=)`e7?%Kh%pAyk;t%A$wkAyJ5rEB=7H0i!0Am zc1@jkk@1~DamuZtguByNBZGYypKS;!%XsCK68Us{%mGuD)jup3$lh7Tutq&zw^Ui| z-<(Htn)5Tb`AV)8`e@lEPWrVX>r?Qdh?1LSntr#I+k6)*IDM}vc0+5zod<`jt}i~I zw{9CJ$GNX}t{kcgWoKkxHrG3*?RB)r`KW|$mY6LC(G0s2zt8xQrgf<7&6W6vW{ed- zA8r)cKX0vjwCuJ0e`TiKc1`V$_;-G7#Gj*PW}J@ diff --git a/Limelight/Images.xcassets/SquareAndArrowDown.imageset/square_and_arrow_down-80x80@2x.png b/Limelight/Images.xcassets/SquareAndArrowDown.imageset/square_and_arrow_down-80x80@2x.png old mode 100644 new mode 100755 index aa21d1b8c6f17faf900a0a3a05b880ad82be36c1..33c7a0dab50d3c9c721f67a95fef9997707f79d6 GIT binary patch delta 1059 zcmcc4y_REwWIYQ51A~f$l^O#B180FpWHAE+w=f7ZGR&GI!N9@^}FpJre59{ln{B}F-`iKaG6%fm7O3NL_J~D|7IoZ&n(n+{+DK|A^o6d)9=- zceB0~*yfA*Pd!u}Zn(>3Nr&qk&&c)4Vv85W=5uy`pAqKvf6b1I3rt?rYhLu7JLll) zsD{-~dFnzhrAa4qJ$l~CmVffpe($nPQyMPJXs@`nlVkVNI=1>Jd~177-kJC(a?1^! z`)lm}Omd8pn7(sy%|fPYoVh*!Klrz0gbD0^Ca62f$$K(myx{C9t?y3#T%_91GVMmt z-^q!yBtvU9+IEYoNG@}Ae6!RlqoJUFdYD>^+*6ki42d&pgZ@vEiaqc=>e}PV_PFhz zl;gQ{&sYndJ$7|Xh@UF=Y3^$R-%Psi)+lV5yQ|^%&F6|wfSN5GLJiGJj^5#FD z#*+2?_U(q3?ku?fdh*VC&vU;v>$2r9HfvzJz#!$ooWT&U@9@37RjtfmdF487Jw=_m z$IDMKm1WF(AvT>kX5}3rb&K$iTVJaMS{|6P``i{4&s9YY+n&|lxXXKc-5mZ~n>Npm z`A~8FY-~H<#aAyjJLMOK)jf=wX?$IUVS0vqOz5{uS@qu%>O6TCFq*)vO)5+uJc_6ovH>yV4 zIJS||MrZ4Low{f9PUJjHQuv^ES!0W09cx8Ar~VtoxFwy}1ui~1{9I{8ckh%3T~3$h z)ocHA)Rb8^`R$U9sj?~2Gafmtf05b6rV}Zwe6-B!bJJ3G1@UEjCfUn;e6ZN(lzm7Q zZ?K-oY{_fg5mK|+Z6-g|l3XRb`vgaHrPchqN0j54_s)GOm@oFuwzl!$YwfM-~`(CS%svROG(85kHC NJYD@<);T3K0RSDO;|~A; delta 1488 zcmZ3>ah-dDWIY=L14EzSr?m_W42;D=?oJHr&dI!FU|^l->Eakt5%+dZBu9F%%yIkX zHz_S@UN@CgH;G6F%cyccua^83GYw*UXn{k(tf=c@DHe&2a-d;0yKb90^dy)1c9&+@?hf!~9rGP|wR zkNYu-GfX%C^-a7$@IzAG-?O3*P9LygzZQL9ChLOU1J(z^{I2ykJkCAZetPO^Chh|+ zydn*(2}+Ge9=SFWPs=pQHoR>-+jI09ll|5w^=}s+khS%@5g=^O9M5oH>bLZnYuDv> zs29j?klvuX!866ZvoHI{rEi2dmgF-1hU_$xxE} zL%>4v$Kk9Po&&Xw?rTNMpPUw5uuC^okHv2DjVxA;r!NE2gEZ3{HU%a>IVh$Y#c0R= z#!9ow;axpL>Z{4q46ia3=zVZw-(z~f>w&cLli!X0>NcG+OgaWz^k;9)vN&Uq{r+y~ zeAWlL2MQaz?lJ4JTq`vd`MKx3j?B#?zuxR-=nvKAjQ^?Kc>K23HinwLQIB_i&Co5+ znI9*8iib5IRklwCB!w-T*v6*O=%JDKOVGkVbb*sr%+hrX=Vq|&Ty<_C<0-qhZg*s-PBRwr zGKjQ$*l)X3^iT1>4u(@AYm2wu%Uu@V@R!@+_G~?d+&N7ucJB^Bfx@`y09V#P?Y3<cxJ!j^`zr9V$)ceUMN(|1Fh~Ihi3#SG)ayonLHyc=VS0y#kv<7u@;3zM{-{(`&s4 zZVt!HCW}6BJ77EY^W~>smlywXu_vas~eCG~r5Ykl7x zz4hCRtj`lSGE9-}Zrsew7R!I% zh*d18dS>lZ!E3R-s*bt9Yk{0)MSMp<++5S!h8MQFZttB|#d9Tn`O-d{1OANFmX$27 z1?%!=#+v%?zkJf3XcJ1p~_svdM6OE8AT#~MPgUzw}&f-S@UlXJ*tKZq;x=`f1WP?W8 z(-rl7&6Uok|4$oT=32A%;?Kj)y4PO!I5pbO|E_o?FinIZb@8GDa%@}9=c=7O^y|w0 z*-U$8&U2};VF`@h{p;E;r?Vn)N*$NI76&Hqdf3_h-Rhja+26lAYVo~`j4};3>t|^& z2zQF(%cS*4xi`Q1T%wxLqu1O<;V)X(W%sJKzU%T)IdP}_tYciFrTy~KvxzUnH>-YF zxBTL{A5z{^>Rv25D;WHVho9H~?MtJxcjvXK7hO~L}yd)I3i?Ql4 z`*8(KS{~u&fA>;}^OYj@)ym9&Uwr#HtvK^&{YRVIX&tNy88sQ#R(mk@Do(0-r@-nr zF@D#ft(nK8=bb1G-@1_F^0`w*(_>QpmmFDjVe++z+B4aF=Qdp3b1=R}wTroNmJc>U|~UzXZzfx_*k2DZQU8-A4zoH6ql zyKb`C`gNV2yVxJj&Ch2}zo6zI&6IoHq0|Nttr>mdKI;Vst00%g?TL1t6 diff --git a/Limelight/Images.xcassets/SquaresArrowUp.imageset/square_and_arrow_up_on_square-120x120@3x.png b/Limelight/Images.xcassets/SquaresArrowUp.imageset/square_and_arrow_up_on_square-120x120@3x.png old mode 100644 new mode 100755 index de7aa00c916100f84be69988e457b9676dabccae..e4ff09a7084e85b3d03b0eb3a2c451dc5387de75 GIT binary patch delta 1381 zcmbOv_LggcWIYQ51Heo2l=NWQ<*_;UHP+AnuzR^MN=v%E0B?)|*t^Z)03 zzqe&!$FD3go(+s<2iR^fNGCAoH1KY)U;A+X{`d#MB?~ULi^?hYJJ#rP?h>_M^x|`A zgwTh~`-R;akBl{U)JHQN)O{p3D^(_HKFgL%S#KsV?lIf2_1h_iJkFf899F6fmnR+9 z;hORB!K`D(say3`k33{~v~A*f!Yd_$<6QA>h#nN}N+_}5!=Un~$ z)bsRo+r2ZVpFFYdsMzK@{rWjy?jN0Yi_NZ+Jtd_)m%0D3h~&+-(r!+f`cJj3!Z(s% z?{6^P@vJD8`?ADg1HZ&$e>L}B{ciE#?$pC>ovaOv_tV}vapj+4{>S&dX7+B@`=^-a z9b3@9`S{0qduClTJoC%qw_4=^^N-E_oA;~mOIW;md}qxC5iX7&>TjGRg5{nhu)cAe zpYqUfJ9o3(uQl8WvfLlnWtmtpnO~8vH-Lm&#B#I6D(a?uK3{L87%46GuozneOJ}QeDz%cM|#bQnxA(MS+p4J zTY0SgduGS)J+clx{C9j#t*hF){^tR~ytx4(-Jcqhqh9x2t$AR#w$Xj(@{-j-$~N_F zJnMVJ63)y!;J3*!Q?Ech?A9;gA6%>lt#{4+GC5}QzlJZxiwdu6tMmCh^YOucm+FG)S^d+r`Tx0o z`Io08`o@03bH;X2;fc8y_Aaq+;*={e54-v6fBl2-iw8Cav9EcW)THCa`gq&)PYH4c zrW3am@NYZ*VE2j74bdW^b1$7*u({$8^SdKb(f>8wzI;yLGno5;DUbVDt?1p9lo{MI zS5GadzL@g5U-39|+^U-sUEdluFSmK1w8u~CG#!94amF{?rrP3@{X!Te4|KE>;N^KY%2i$jmfTK7jc72ck*=ADjs zgnpoB_Ql61J~hmqA~EOUspjJU#}m>I$VT{wY{_}>@03tx;)50Sj}Dr|za{MMs>}KQptVtYs_ZpwwseDo%IU|6g{ibV5-N@pIWy#Km1nV*Hc;;`e?q^)^-`mI?ochKV6F! zUCwK4Z>=tn4!o#r^FZ~Ktap7@>V=;{@6{tjlQ;ZbdrI@6p~br=4O=DB@2OtYs@l1E z7Z1CI@}1_lhCdWTFLE>LUwkunjh(t&3}*%NJtZxxwW0-^=1eQfx)A0E9;z9A(vNJKlnDw{!Tr!{>HYUv o2LI;5y^! z;uum9_jYdOncCwL4fCT`Wq4?+E^=ATu}C!gir-pQ4Oj0es}`&(%X)3^8mfCS>edR= zZCN@CFNU$KT)TDJjV>|Y)hmR4>-nGgyYpw&^EsB!&)BA)`+IhF&Ch>3iqq~@&NnVj zt9(9JcE`e^T@LME-xKdHi$YY-aj!O=G*!+P$5zy#LC3`vd6=;cNT4 zmfV!DkS}=KX4A)FH}_d ztXYy_B{@Z#^~2SM>&)M?8?#rJhTJjvQMB^X&h-WUjCr>vJYU^Vp1vV@W8@Tuisc*D z?a6PRx{pJK?~mn@kJ7acDtn8cZ9be|&8W_7o^j%L#e*eDoV+19SqH8&__2P=S<$}R z`CRheUAD3jbCOn>+Md8UovBlXoc_t^SZ?;UI(Q9Y!Tbh*CFeBTUWpP z?yFcOl{d%EmPh6Z?K>IXZ}a%Xop*nB^e(!c7+Ws;wJzqy`QE30ogV}|2-g;>5xAlL zX+iZ7`G}9V=Q2dUI>$S;(%{47(vY%MHp_Dku4j{zT=~N_@$b(=C*I35eS61o;|V`Y zU+#-_^SNpgwIp6^lzSamr?vC;=Foo}HcUS%om+o1nRzb{EIYdT+hl&0eOvjQ{ii;k z(h%EuYu6%`nB`v6w@ajOB)ra%sP#UIw*|Gn}?ie|ajfv^W@2M#7K_!{d_ zplKKC%n-efk9j-04Er0QWueb@7RD(AGr#*ijgR%t_B%Ii!x_)>MVhy2KgjzwEA|yv zMcIj6nlX&!o3FnK3O}&f`I_&;Qid|dgZ9gnVn3H}jQ_vVOwy_=Z2hvc?GZm;Ef4Rg zUl%W~AIo?|t7Pql$B+5?e{ZnXb9|S?624w;@`lyMA|KWraBrTs@)zfI``XcF6 z+cnJIb$p@dEtUhf4!nz!-+XeZ_JilG!c4D&YJwSVyH=~cdi~lcBx_$RgLOxd@twQV zOHVFixMn9ex$@C2o~g6)#Sir5$-0)9ZG?ScPW zPoBSfV&2YjDPk!5dt-%JvX^H=?2n&COFr>!d1w4+`D?DMCk!=y&zf&(>U()MT>Wl6 zu{8Jj;qSc`@0VXGE|?|L5Svl|DZzJFYJgP2@|JmzyZMCk&#Q@!t zS={H6kKbzAeQV>k2kXS5=kD9~z@}`C?vB;6+1&54HsL?k*5*Hd)iaJ~RLJ;f;E`vfpv9_nrI0j$cA0?E+UK>m5(fdB)9s;}!XXDd)3SU;nAh~rG&G)V_Gi5m)AD

od3S^?LIwf9j%0);UQ_znSc0j9wI2+}kTV zIeN?LQ1(boGcV80dkgg+8+h7&%ST^h-I2+dx|ossLUr?8 zeyj45OZgsc<;(OKQtFts9-Lv*)!ogt!$fK3*Od*%(p$E?(Ry&HBjwt1rgJ$LE^S)f z;H^9zMRR(3Q=6SVWcYTSx^K`o48zpW2#+QrtdhKby zSa4|iSDo!0Vr$;9Ge7^f=ExoS&kZx!kA`)A50@x9c;bES5{U!p4DMf69y~LDWAwF$ zaq53UlN^lo-@mA?e7d5+mgDKptD#BXYf3D>TrJ!9?u(4x2OXOWg=eoTxvdc;tNr-- z$;`=)F72mO8bW_5JP>u>djG)lzxUqp&zZk6Z!+VyulLw2>BJm+=@QGC-3XI1M6IsPpqD^_AAqaHv;yTc-!w7Sw48mCCPj2=R)1z#}xlP z@{@g>Xw|X1^oZAe<~uiLc+GjY^W8h%)%Uc1y=BZkv$9l!t6vlfmfN|4R_p4kx`md&a@qtL)wK&kue7-Bd z?S*$&+|o+@ep2eNpReI0fBx(T$u9z(BzJF#S!nEiz)Ivr#0IZA#y8t#Ex*6){W-18 zJa<~dceXuut<_FW51ev=h5gloMSarZhBH+YrdyRh=w?0mFR(yb>XEA9g?Ec>_VItv zJFxU#=py6!+5gvGdU~$y+8HC29ccyobBo$7)$gP(@IJGw)8@;eEnk1}_MNnD@{h>= z>&?98P=3zNpkpT65)S{G&l+P_%x*6!@t~&sfkVQ5v8-JWUis8#YTxa%w$=Rk)MIh+ z?duHvEg?G>vC8D^vYq|pOhgj*Hm_ax%zjGeuYd4%Cm(P11y3^#(GBZX-kbAiU(wY6 z(GN@>tk7fA6x~o-aH@o9fqmK3|CN0fzHdqvEJ!)vbeGpcbVuF7$E}8OHv6~!TD)K9 z>+aoaLS8mpz4|%eJ4gC_mc6!}+iSVMEix#65%b-WAuc5A_=ELJ?@tSV`9?76$GL|6 xXG3jvJa;S<*VkjK6X2`ceX-!-1+Ty2vvRIXKc#&yoPmLX!PC{xWt~$(69Au%dUXH* diff --git a/Limelight/Images.xcassets/SquaresArrowUp.imageset/square_and_arrow_up_on_square-80x80@2x.png b/Limelight/Images.xcassets/SquaresArrowUp.imageset/square_and_arrow_up_on_square-80x80@2x.png old mode 100644 new mode 100755 index 85e092db23ef7e9d69b05b38d6066b63bd70128e..c3269596eff33808a4f550950aa72c12e4075d3b GIT binary patch delta 939 zcmcb>vyFX%WIYQ51A~f$l^O#B180FpWHAE+w=f7ZGR&GI!N9q zac><3oTOJQ4M>{pYZGzbZ{N4vO~2E`Z{9qu@=$gE9`n!hXZmj8`jczLbb!Htfrnx0 zEVc#m{)LPe&F&`(zyH8s{Ys#Eg8R{jTUQkE$6Fm+y`YJ+v_X3vLtW@}6~*v-&rRB{ zFti1T{gX*6SkSuFwf@V)nH44S;a3&bbtTWrNiGdrbMLU?RjY~}yTJv6Oba5$~;!p7dpnhaI8`CC{ku1vJq8xY_9x#Drc*W5cn_jQ)Y ztlhU-&Y;(nef92(E6qF^9w;tLIPk9_;t0d9@3qd`JpCpwvE8j`_f`E+eO*oj@BZ>D z6BE>a-e>GSv^wFsu7j^9PZn=!K(;Tt{v#F!JlxGbOUzL2X zcVOne)}Xw^@Bz~sl~zUV*`8-g?r$y@KQC(CeD9X;M&=(A*K!5(o{40>WH&*d>FkRC zJ*C+WQLQ@}oVQA4uv)nNa@fbwb5)!zR_jt+MnWW;#8(&Q^TND$Hn7=vuQG^dG4t_` z-E^}?(4uFa+u4nJ7Z;~)vn$vW$2^;{&Gz~M-ui5Z_39H>oxh?gxZ}XG#x#~^ZgTe~DWM4f&eWZp delta 1610 zcmdnSet~C#WIY=L14EzSr?m_W42;D=?oJHr&dI!FU|{3&ba4!+hi+-N-G@5*WrtVCiXXlb_BKazKBIN3Sh~8lQQD;;9D|6oU z_0c8kMH|%{j?S6*js0GqT4S@W-T#^R=IG9| zP&rWA_?xNjopOUZ^R50%B^nLd%>G|zJY0C7*!CCiwN#FV*^JwzjH}pgT>JUQKOyk> z=En`c*_DM>XqX>Z+bGR5yIzdJooToA{kJSOc{T}t?0NiiZY!KEX1XJ=JIl;5#nN4|z#?Q5UCn1204^{Y=N^#=P{ z7wo%rq|q)jj{U9WRhzR#3|DIXzwhsSp;*+HxR2kV^fv#5>%LEn6Q|^F*+{ZgVYo6RrhF=lVOc&Dk1l|&9n0SNx0F%Kahm`O8 zHf*zh7q7T6}QpSXg`O7t6m* z`Ft+SRzh-G4BKBtGna&?p>tN)wX29 z9ER|{Sj~*+C3q4ZSRPsvn#`pzW5eYW#Bd_eS={>CQ9G zsq*tYToihZ)h=I#HNiMcH*o58W&YeLOdIa%Z+&)u2LsQ}iu7$)Klz__2!1w+eIK_> zO2CEF-!2_6ygG05Z5Qo&eO-lTHV*TrdIW2oWNY{qn|31RlY@K%Q;MqX)y=2Gnj#p^ zm1t=%{#NziPUdHarGHP|*tMib>N~HR#;&yqj78NghB@}kX&s}bc@Y-@+*GXHY zJXAFqUzHsEc==i5CU^e>rVaWw-@=>@p5ts-7~phEyg_kG&oGg+A%t=*(tur+Z`{We|sZw6M94llD#U7D_bkFAE~&%?x!cWSr9F8oYM zU9j%zf-~R$%@tX|V`cyS4ZFnt!r&7Z=87yh7T!2Vlx;?eo~YK!?Y;iXLQ@@z8g5yK z<#j|qR=wU5-1nPtLwI=G)Wrst2TuOTW-1S372fS #import "LayoutOnScreenControls.h" #import "ToolBarContainerView.h" +#import "OSCProfilesManager.h" +#import "OSCProfilesTableViewController.h" NS_ASSUME_NONNULL_BEGIN @@ -16,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN This view controller provides the user interface which allows the user to position on screen controller buttons anywhere they'd like on the screen. It also provides the user with the abilities to undo a change, save the on screen controller layout for later retrieval, and load previously saved controller layouts */ @interface LayoutOnScreenControlsViewController : UIViewController - +- (void)profileRefresh; @property LayoutOnScreenControls *layoutOSC; // object that contains a view which contains the on screen controller buttons that allows the user to drag and positions each button on the screen using touch @property int OSCSegmentSelected; @@ -28,6 +30,8 @@ NS_ASSUME_NONNULL_BEGIN @property (weak, nonatomic) IBOutlet UIView *chevronView; @property (weak, nonatomic) IBOutlet UIImageView *chevronImageView; @property (weak, nonatomic) IBOutlet UIStackView *toolbarStackView; +@property (strong, nonatomic) OSCProfilesTableViewController *oscProfilesTableViewController; +@property (nonatomic, assign) NSString *currentProfileName; @end diff --git a/Limelight/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m b/Limelight/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m index f73003ab..b0d7555e 100644 --- a/Limelight/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m +++ b/Limelight/ViewControllers/CustomOSCViewControl/LayoutOnScreenControlsViewController.m @@ -215,40 +215,22 @@ /* show pop up notification that lets users choose to save the current OSC layout configuration as a profile they can load when they want. User can also choose to cancel out of this pop up */ - (IBAction) saveTapped:(id)sender { - UIAlertController * inputNameAlertController = [UIAlertController alertControllerWithTitle: @"Enter the name you want to save this controller profile as" message: @"" preferredStyle:UIAlertControllerStyleAlert]; - [inputNameAlertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { // pop up notification with text field where user can enter the text they wish to name their OSC layout profile - textField.placeholder = @"name"; - textField.textColor = [UIColor lightGrayColor]; - textField.clearButtonMode = UITextFieldViewModeWhileEditing; - textField.borderStyle = UITextBorderStyleNone; - }]; - [inputNameAlertController addAction:[UIAlertAction actionWithTitle:@"Save" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // add save button to allow user to save the on screen controller configuration - NSArray *textFields = inputNameAlertController.textFields; - UITextField *nameField = textFields[0]; - NSString *enteredProfileName = nameField.text; - - if ([enteredProfileName isEqualToString:@"Default"]) { // don't let user user overwrite the 'Default' profile - UIAlertController *alertController = [UIAlertController alertControllerWithTitle: [NSString stringWithFormat:@""] message: [NSString stringWithFormat:@"Saving over the 'Default' profile is not allowed"] preferredStyle:UIAlertControllerStyleAlert]; - - [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { - [alertController dismissViewControllerAnimated:NO completion:^{ - [self presentViewController:inputNameAlertController animated:YES completion:nil]; - }]; - }]]; - [self presentViewController:alertController animated:YES completion:nil]; - } - else if ([enteredProfileName length] == 0) { // if user entered no text and taps the 'Save' button let them know they can't do that - UIAlertController * savedAlertController = [UIAlertController alertControllerWithTitle: [NSString stringWithFormat:@""] message: [NSString stringWithFormat:@"Profile name cannot be blank!"] preferredStyle:UIAlertControllerStyleAlert]; - - [savedAlertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // show pop up notification letting user know they must enter a name in the text field if they wish to save the controller profile - - [savedAlertController dismissViewControllerAnimated:NO completion:^{ - [self presentViewController:inputNameAlertController animated:YES completion:nil]; - }]; - }]]; - [self presentViewController:savedAlertController animated:YES completion:nil]; - } - else if ([self->profilesManager profileNameAlreadyExist:enteredProfileName] == YES) { // if the entered profile name already exists then let the user know. Offer to allow them to overwrite the existing profile + + if([self->profilesManager updateSelectedProfileSucceedWithButtonLayers:self.layoutOSC.OSCButtonLayers]){ + UIAlertController * savedAlertController = [UIAlertController alertControllerWithTitle: [NSString stringWithFormat:@""] message: [NSString stringWithFormat:@"Current profile updated successfully"] preferredStyle:UIAlertControllerStyleAlert]; + [savedAlertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { + }]]; + [self presentViewController:savedAlertController animated:YES completion:nil]; + } + else{ + UIAlertController * savedAlertController = [UIAlertController alertControllerWithTitle: [NSString stringWithFormat:@""] message: [NSString stringWithFormat:@"Profile Default can not be overwritten"] preferredStyle:UIAlertControllerStyleAlert]; + [savedAlertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { + }]]; + [self presentViewController:savedAlertController animated:YES completion:nil]; + } + + /* + if ([self->profilesManager profileNameAlreadyExist:enteredProfileName] == YES) { // if the entered profile name already exists then let the user know. Offer to allow them to overwrite the existing profile UIAlertController * savedAlertController = [UIAlertController alertControllerWithTitle: [NSString stringWithFormat:@""] message: [NSString stringWithFormat:@"Another profile with the name '%@' already exists! Do you want to overwrite it?", enteredProfileName] preferredStyle:UIAlertControllerStyleAlert]; [savedAlertController addAction:[UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // overwrite existing profile @@ -275,11 +257,12 @@ [inputNameAlertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // adds a button that allows user to decline the option to save the controller layout they currently see on screen [inputNameAlertController dismissViewControllerAnimated:NO completion:nil]; }]]; - [self presentViewController:inputNameAlertController animated:YES completion:nil]; + [self presentViewController:inputNameAlertController animated:YES completion:nil]; */ } -/* Presents the view controller that lists all OSC profiles the user can choose from */ + +/* Basically the same method as loadTapped, without parameter*/ - (void)profileRefresh{ UIStoryboard *storyboard; BOOL isIPhone = ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone); @@ -300,8 +283,10 @@ [self.layoutOSC.layoutChanges removeAllObjects]; // since a new OSC profile is being loaded, this will remove all previous layout changes made from the array [self OSCLayoutChanged]; // fades the 'Undo Button' out + + _oscProfilesTableViewController.currentOSCButtonLayers = self.layoutOSC.OSCButtonLayers; //pass updated OSCLayout to OSCProfView again }; - [self presentViewController:vc animated:YES completion:nil]; + // [self presentViewController:vc animated:YES completion:nil]; } @@ -316,9 +301,9 @@ storyboard = [UIStoryboard storyboardWithName:@"iPad" bundle:nil]; } - OSCProfilesTableViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"OSCProfilesTableViewController"] ; + _oscProfilesTableViewController = [storyboard instantiateViewControllerWithIdentifier:@"OSCProfilesTableViewController"] ; - vc.didDismissOSCProfilesTVC = ^() { // a block that will be called when the modally presented 'OSCProfilesTableViewController' VC is dismissed. By the time the 'OSCProfilesTableViewController' VC is dismissed the user would have potentially selected a different OSC profile with a different layout and they want to see this layout on this 'LayoutOnScreenControlsViewController.' This block of code will load the profile and then hide/show and move each OSC button to their appropriate position + _oscProfilesTableViewController.didDismissOSCProfilesTVC = ^() { // a block that will be called when the modally presented 'OSCProfilesTableViewController' VC is dismissed. By the time the 'OSCProfilesTableViewController' VC is dismissed the user would have potentially selected a different OSC profile with a different layout and they want to see this layout on this 'LayoutOnScreenControlsViewController.' This block of code will load the profile and then hide/show and move each OSC button to their appropriate position [self.layoutOSC updateControls]; // creates and saves a 'Default' OSC profile or loads the one the user selected on the previous screen [self addInnerAnalogSticksToOuterAnalogLayers]; @@ -327,7 +312,8 @@ [self OSCLayoutChanged]; // fades the 'Undo Button' out }; - [self presentViewController:vc animated:YES completion:nil]; + _oscProfilesTableViewController.currentOSCButtonLayers = self.layoutOSC.OSCButtonLayers; + [self presentViewController:_oscProfilesTableViewController animated:YES completion:nil]; } diff --git a/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.h b/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.h index 448d0f87..f45ac68f 100644 --- a/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.h +++ b/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.h @@ -17,7 +17,7 @@ NS_ASSUME_NONNULL_BEGIN @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (nonatomic, copy) void (^didDismissOSCProfilesTVC)(void); - +@property (nonatomic, assign) NSMutableArray *currentOSCButtonLayers; @end diff --git a/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.m b/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.m index 6d1c09a8..42a9a79a 100644 --- a/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.m +++ b/Limelight/ViewControllers/CustomOSCViewControl/OSCProfilesTableViewController.m @@ -21,15 +21,32 @@ const double NAV_BAR_HEIGHT = 50; @implementation OSCProfilesTableViewController { OSCProfilesManager *profilesManager; + LayoutOnScreenControlsViewController *parentLayoutOSCViewController; } @synthesize tableView; - (void) viewDidLoad { [super viewDidLoad]; - + + profilesManager = [OSCProfilesManager sharedManager]; + + self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, NAV_BAR_HEIGHT)]; + + self.tableView.delegate = self; + self.tableView.dataSource = self; + + [self.tableView registerNib:[UINib nibWithNibName:@"ProfileTableViewCell" bundle:nil] + forCellReuseIdentifier:@"Cell"]; // Register the custom cell nib file with the table view + self.tableView.alpha = 0.5; + + self.tableView.backgroundColor = [[UIColor colorWithRed:0.5 green:0.7 blue:1.0 alpha:1.0] colorWithAlphaComponent:0.5]; // set background color & transparency +} +- (void) viewDidAppear:(BOOL)animated { + [super viewDidAppear: animated]; + self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, NAV_BAR_HEIGHT)]; self.tableView.delegate = self; @@ -38,29 +55,96 @@ const double NAV_BAR_HEIGHT = 50; [self.tableView registerNib:[UINib nibWithNibName:@"ProfileTableViewCell" bundle:nil] forCellReuseIdentifier:@"Cell"]; // Register the custom cell nib file with the table view -} - -- (void) viewDidAppear:(BOOL)animated { - [super viewDidAppear: animated]; - if ([[profilesManager getAllProfiles] count] > 0) { // scroll to selected profile if user has any saved profiles NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[profilesManager getIndexOfSelectedProfile] inSection:0]; [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; - } + } } #pragma mark - UIButton Actions /* Loads the OSC profile that user selected, dismisses this VC, then tells the presenting view controller to lay out the on screen buttons according to the selected profile's instructions */ -- (IBAction) loadTapped:(id)sender { - [self dismissViewControllerAnimated:YES completion:nil]; +- (IBAction) duplicateTapped:(id)sender { + UIAlertController * inputNameAlertController = [UIAlertController alertControllerWithTitle: @"Enter the name you want to save this controller profile as" message: @"" preferredStyle:UIAlertControllerStyleAlert]; + [inputNameAlertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { // pop up notification with text field where user can enter the text they wish to name their OSC layout profile + textField.placeholder = @"name"; + textField.textColor = [UIColor lightGrayColor]; + textField.clearButtonMode = UITextFieldViewModeWhileEditing; + textField.borderStyle = UITextBorderStyleNone; + }]; + [inputNameAlertController addAction:[UIAlertAction actionWithTitle:@"Save" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // add save button to allow user to save the on screen controller configuration + NSArray *textFields = inputNameAlertController.textFields; + UITextField *nameField = textFields[0]; + NSString *enteredProfileName = nameField.text; + + if ([enteredProfileName isEqualToString:@"Default"]) { // don't let user user overwrite the 'Default' profile + UIAlertController *alertController = [UIAlertController alertControllerWithTitle: [NSString stringWithFormat:@""] message: [NSString stringWithFormat:@"Saving over the 'Default' profile is not allowed"] preferredStyle:UIAlertControllerStyleAlert]; + + [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { + [alertController dismissViewControllerAnimated:NO completion:^{ + [self presentViewController:inputNameAlertController animated:YES completion:nil]; + }]; + }]]; + [self presentViewController:alertController animated:YES completion:nil]; + } + else if ([enteredProfileName length] == 0) { // if user entered no text and taps the 'Save' button let them know they can't do that + UIAlertController * savedAlertController = [UIAlertController alertControllerWithTitle: [NSString stringWithFormat:@""] message: [NSString stringWithFormat:@"Profile name cannot be blank!"] preferredStyle:UIAlertControllerStyleAlert]; + + [savedAlertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // show pop up notification letting user know they must enter a name in the text field if they wish to save the controller profile + + [savedAlertController dismissViewControllerAnimated:NO completion:^{ + [self presentViewController:inputNameAlertController animated:YES completion:nil]; + }]; + }]]; + [self presentViewController:savedAlertController animated:YES completion:nil]; + } + else if ([self->profilesManager profileNameAlreadyExist:enteredProfileName] == YES) { // if the entered profile name already + NSLog(@"tttttttttt"); + UIAlertController * savedAlertController = [UIAlertController alertControllerWithTitle: [NSString stringWithFormat:@""] message: [NSString stringWithFormat:@"Profile name already exists"] preferredStyle:UIAlertControllerStyleAlert]; + + [savedAlertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { + //[savedAlertController dismissViewControllerAnimated:NO completion:nil]; + //[self profileViewRefresh]; //refresh profile view after saving new profile; + }]]; + [self presentViewController:savedAlertController animated:YES completion:nil]; + } + else { // if user entered a valid name that doesn't already exist then save the profile to persistent storage + [self->profilesManager saveProfileWithName: enteredProfileName andButtonLayers:self.currentOSCButtonLayers]; // the OSC layout here is passed from parent LayoutOSCViewController; + [self->profilesManager setProfileToSelected: enteredProfileName]; + + UIAlertController * savedAlertController = [UIAlertController alertControllerWithTitle: [NSString stringWithFormat:@""] message: [NSString stringWithFormat:@"Profile %@ duplicated from current layout", enteredProfileName] preferredStyle:UIAlertControllerStyleAlert]; // Let user know this profile has been duplicated & saved + + [savedAlertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { + [savedAlertController dismissViewControllerAnimated:NO completion:nil]; + [self profileViewRefresh]; //refresh profile view after saving new profile; + }]]; + [self presentViewController:savedAlertController animated:YES completion:nil]; + } + }]]; + [inputNameAlertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // adds a button that allows user to decline the option to save the controller layout they currently see on screen + [inputNameAlertController dismissViewControllerAnimated:NO completion:nil]; + }]]; + [self presentViewController:inputNameAlertController animated:YES completion:nil]; +} + +/* basically the same with loadTapped */ +- (void) profileViewRefresh{ + //[self dismissViewControllerAnimated:YES completion:nil]; + //[selfparentLayoutOSCViewController] + [self.tableView reloadData]; // table view will be refreshed by calling reloadData if (self.didDismissOSCProfilesTVC) { // tells the presenting view controller to lay out the on screen buttons according to the selected profile's instructions self.didDismissOSCProfilesTVC(); } } +- (IBAction) deleteTapped:(id)sender{ + [profilesManager deleteCurrentSelectedProfile]; + [self profileViewRefresh]; +} + + - (IBAction) cancelTapped:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } @@ -76,6 +160,7 @@ const double NAV_BAR_HEIGHT = 50; ProfileTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; OSCProfile *profile = [[profilesManager getAllProfiles] objectAtIndex: indexPath.row]; cell.name.text = profile.name; + cell.backgroundColor = [[UIColor clearColor] colorWithAlphaComponent:0.99]; if ([profile.name isEqualToString: [profilesManager getSelectedProfile].name]) { // if this cell contains the name of the currently selected OSC profile then add a checkmark to the right side of the cell cell.accessoryType = UITableViewCellAccessoryCheckmark; @@ -152,6 +237,7 @@ const double NAV_BAR_HEIGHT = 50; lastSelectedCell.accessoryType = UITableViewCellAccessoryNone; [tableView deselectRowAtIndexPath:lastSelectedIndexPath animated:YES]; } + [self profileViewRefresh]; // update OSC layout when table view option is changed } diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m index 8fd2ad6c..82492c63 100644 --- a/Limelight/ViewControllers/SettingsViewController.m +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -288,10 +288,10 @@ BOOL isCustomResolution(CGSize res) { [self updateBitrateText]; [self updateResolutionDisplayViewText]; - + //init keyboardToggle settings if(currentSettings.touchMode.intValue == RELATIVE_TOUCH_MODE){ [self.keyboardToggleFingerNumSlider setEnabled:[self.touchModeSelector selectedSegmentIndex] != RELATIVE_TOUCH_MODE]; - [self.keyboardToggleFingerNumSlider setValue:3.0]; + [self.keyboardToggleFingerNumSlider setValue:3.0]; //force 3 finger tap to toggle keyboard in relative touch mode. This is for the 4 finger OSC layout tool gesture. [self.keyboardToggleFingerNumLabel setText:[NSString stringWithFormat:@"To Toggle Local Keyboard: Tap %d Fingers", (uint16_t)self.keyboardToggleFingerNumSlider.value]]; } else{ @@ -301,34 +301,38 @@ BOOL isCustomResolution(CGSize res) { } [self.keyboardToggleFingerNumSlider addTarget:self action:@selector(keyboardToggleFingerNumSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. - + // lift streamview setting [self.liftStreamViewForKeyboardSelector setSelectedSegmentIndex:currentSettings.liftStreamViewForKeyboard ? 1 : 0];// Load old setting + + // showkeyboard toolbar setting [self.showKeyboardToolbarSelector setSelectedSegmentIndex:currentSettings.showKeyboardToolbar ? 1 : 0];// Load old setting + + // swipe & exit setting [self.swipeExitScreenEdgeSelector setSelectedSegmentIndex:[self getSelectorIndexFromScreenEdge:(uint32_t)currentSettings.swipeExitScreenEdge.integerValue]]; // Load old setting [self.swipeToExitDistanceSlider setValue:(CGFloat)currentSettings.swipeToExitDistance.floatValue animated:YES]; // Load old setting. [self.swipeToExitDistanceUILabel setText:[NSString stringWithFormat:@"Swipe & Exit Distance: %.2f * screen-width", self.swipeToExitDistanceSlider.value]]; // Initiate label display [self.swipeToExitDistanceSlider addTarget:self action:@selector(swipeToExitDistanceSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. - + // pointer veloc setting [self.pointerVelocityModeDividerSlider setValue:currentSettings.pointerVelocityModeDivider.floatValue * 100 animated:YES]; // Load old setting. [self.pointerVelocityModeDividerUILabel setText:[NSString stringWithFormat:@"Touch Pointer Velocity: Scaled on %d%% of Right Screen", 100 - (uint8_t)self.pointerVelocityModeDividerSlider.value]]; // Initiate label display [self.pointerVelocityModeDividerSlider addTarget:self action:@selector(pointerVelocityModeDividerSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. [self.pointerVelocityModeDividerSlider setEnabled: currentSettings.touchMode.intValue == NATIVE_TOUCH_MODE]; // pointer velocity scaling works only in native touch mode. - + // init pointer veloc setting [self.touchPointerVelocityFactorSlider setValue:currentSettings.touchPointerVelocityFactor.floatValue * 100 animated:YES]; // Load old setting. [self.touchPointerVelocityFactorUILabel setText:[NSString stringWithFormat:@"Touch Pointer Velocity: %d%%", (uint16_t)self.touchPointerVelocityFactorSlider.value]]; // Initiate label display [self.touchPointerVelocityFactorSlider addTarget:self action:@selector(touchPointerVelocityFactorSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. [self.touchPointerVelocityFactorSlider setEnabled: currentSettings.touchMode.intValue == NATIVE_TOUCH_MODE]; // pointer velocity scaling works only in native touch mode. - + // init relative touch mouse pointer veloc setting [self.mousePointerVelocityFactorSlider setValue:currentSettings.mousePointerVelocityFactor.floatValue * 100 animated:YES]; // Load old setting. [self.mousePointerVelocityFactorUILabel setText:[NSString stringWithFormat:@"Mouse Pointer Velocity: %d%%", (uint16_t)self.mousePointerVelocityFactorSlider.value]]; // Initiate label display [self.mousePointerVelocityFactorSlider addTarget:self action:@selector(mousePointerVelocityFactorSliderMoved) forControlEvents:(UIControlEventValueChanged)]; // Update label display when slider is being moved. [self.mousePointerVelocityFactorSlider setEnabled: currentSettings.touchMode.intValue == RELATIVE_TOUCH_MODE]; // mouse velocity scaling works only in relative touch mode. - //CustomOSC stuff + // init CustomOSC stuff [self.onscreenControlSelector addTarget:self action:@selector(onscreenControlChanged) forControlEvents:UIControlEventValueChanged]; /* sets a reference to the correct 'LayoutOnScreenControlsViewController' depending on whether the user is on an iPhone or iPad */ self.layoutOnScreenControlsVC = [[LayoutOnScreenControlsViewController alloc] init]; @@ -342,8 +346,8 @@ BOOL isCustomResolution(CGSize res) { self.layoutOnScreenControlsVC = [storyboard instantiateViewControllerWithIdentifier:@"LayoutOnScreenControlsViewController"]; self.layoutOnScreenControlsVC.modalPresentationStyle = UIModalPresentationFullScreen; } - if(currentSettings.onscreenControls.intValue == OnScreenControlsCustom && currentSettings.touchMode.intValue == RELATIVE_TOUCH_MODE) { - [self.onscreenControllerLabel setText:@"Tap 4 Fingers to Change OSC Layout in Stream View"]; + if(currentSettings.onscreenControls.intValue == OnScreenControlsCustom && currentSettings.touchMode.intValue == RELATIVE_TOUCH_MODE) { //load OSC slider UI Lable to remind user: + [self.onscreenControllerLabel setText:@"Tap 4 Fingers to Change OSC Layout in Stream View"]; //keyboard is force set to 3 finger to make this working. //if (self.layoutOnScreenControlsVC.isBeingPresented == NO) } else{ diff --git a/Limelight/iPad.storyboard b/Limelight/iPad.storyboard index 5de6a4a8..df26fe4d 100644 --- a/Limelight/iPad.storyboard +++ b/Limelight/iPad.storyboard @@ -682,10 +682,10 @@ ICAgICAgICAgICAgICA - + @@ -732,7 +732,7 @@ ICAgICAgICAgICAgIA - + @@ -741,17 +741,24 @@ ICAgICAgICAgICAgIA - + - - - - - + + + + + + + + + + + + @@ -786,10 +793,7 @@ ICAgICAgICAgICAgIA - - - - +