From d11c45633af58540b0fb869c97b3d193a6715310 Mon Sep 17 00:00:00 2001 From: Gerrit Linnemann Date: Tue, 27 Dec 2016 14:07:15 +0100 Subject: [PATCH] StatusBar --- .../UserInterfaceState.xcuserstate | Bin 28826 -> 28913 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 12 +-- OTRS-Watch/Base.lproj/Main.storyboard | 46 ++++++++- OTRS-Watch/Constants.swift | 5 + .../Extension/ViewControllerExtension.swift | 2 +- OTRS-Watch/OTRS.swift | 36 +++++-- OTRS-Watch/ViewController.swift | 6 +- OTRS-Watch/WindowController.swift | 96 ++++++++++++++++++ 8 files changed, 186 insertions(+), 17 deletions(-) diff --git a/OTRS-Watch.xcodeproj/project.xcworkspace/xcuserdata/linnemann.xcuserdatad/UserInterfaceState.xcuserstate b/OTRS-Watch.xcodeproj/project.xcworkspace/xcuserdata/linnemann.xcuserdatad/UserInterfaceState.xcuserstate index d25ae22fb20a25ba92578ca6b79c6cdab74c734f..bf871495aa4cd824aaac27408e64a748041a28e4 100644 GIT binary patch delta 16321 zcmbWd2UwF=)Hwd$`_2GD*pP%B0)apRVS}K^CLx3{1XM(giXu?NJ@VdKYioz&wRI10 zkGl7^?!C8l)Y{gq)mmF?{oMd6eqZ~1|L3nyLf(7sIrp4%&pG#;^WGV^z|&h`q8n)v z6;AS0f=!b;87%@ah4_Z}mY7ORBc>BGh!wbF8;MQCR$@D`gE&uI zATAP@h|9zk;wo{C_<^`i+#r4=ejy$bPl?}&H-G>DKwt;j0ej#K+<*-Df?%KoDi8r8 zK`clF$)F?11X(}_^q>#u3#u%jALtLN!2nPLYC#?N2-JgtU@#aCqQNM@gE8P!@GY1M zrh(~T2ABz!f@NSiSOLBRE5RzT9&7*`!B(&j><7od8E_Vy1DC)x@B_FGegr>*U%;>6 z0eA==fxo~j@Hco3{(%(apa?oZXBYtG&=Lq0FbD?2a2N%nVSAViQ(!LCK|Rca#jpf+ zhTUK<*bmmh!Egv11rhulj)z~sNpLEh3+KT`xD+mf%i%h>9&U#_;7)h}UWAw6Wq1W% zh1cK@@H)H!Z^B>UU3d@PhtJ@1_&a<<5+ooY$yi7a(vy^sQc^~Gk=~>a=}W4}FfyD} zlNvIDj3l*WJlTOvBh$$YGKVZ6O=KZiL>7}>$gX5JvKMJ4tH^$2fAS-;fgDN>Bgc^A z$m!$^auKp*KpmtG zS*XL*dFldnk-9`(rfyI_Q4gqx)FbKz^#}Em`iFW$leCDop&e*<+Jp9_{b+wWfR@w2 zbON17C(-TcWIBcJKzF2#bOCLm3+W=dm@c6!=$>>hx-VTt*V1)#13i-F=}+j-=?Szz zPp9Y7^XUcjN_rLDbv3<)UQ2JGx6`}nJ@f(kAbp%ZL7$^9(U?#YQ8E!sB%@`bm}n+}Nfz8GwPi80 zgjvCS$E;!2G8>sq%r<5_vzyt&>}L)zN0_6`N#+!DjyccVVt!<9Ge0p;n5WEd%roW< zOR#{2tUc?%idje2iFIaOSXb7M^=AWEIjdnK*hp5(MzPUs3>(XKV$;}kHiIo-O>7}s z#8$FB*q&@J3u|V3vwhgUYy&%p9n5~rj$uDxC$f{+$*jQ6W#_StY!kbZUB#|ux3fFg zo$L|zD0_@O&R%A(uvgh@><{d9_6B>OeZW3sAF+S2uh_pijuUYxBn>$wfwMs5?gncKo`<+gF#xgFe2ZWni$JHj31j&bL>>)Z|QCU=Yb zk-N?P#6993b5FRZ+$-*H?lt$1h!crK?L>|uKasyEKqMChN<>PLN)#pv7e$IvM4d!w zqAXFiNH5A06$m@%6o7=+^e9IQ0z40Sn)l!nc}0adS@7jN*DYXTfM^&0J%0?3pA>Gh z&uq&Kg$1VYfkUc#H>~@W%K$0k3B_V!4DksumiUwyM|?(n&Ij{KK7%aF_?nnNOe7}pYCehY$@k)i@-z4ayh8ZLMj|xXgbELABFPG|OaQj-T$;JZpgt91 zf9r#NYQ4F#e_d@=O~b$nv9EPVu-J%nX9*EuL)a2CiTPFzW)ZWAImBFI9??iN@ftpY zkL0y{6d%pUEGFdm|04WZLM$Z$u_zvVEdIpt@h!pz2tM|1f`k283$dQ)HjfX?KhsQl zGqGhJpKyk#CI%3rh;2>ytB!lS?oQ$`p;$)jB6bsdi0_HL#6Ds_aez2T9OB#a$$Sdm zf$zwt@}2lJKAq24MjRm$iDSfZ;skLLe;>!(oaHllcRrgh=ezLT@OL@SdGOt>+LsIY z4z5m}YOAX&>js*8W!BdYs>8wuScmORJ?k+bzjk0%Lse~!pm)dwK~{jP$y{yj*|vKITrfgK8T1tQPTZ6F*gm9rH~3 zK@F8Xs?E*#CUe7l;tugMQTK14vOLqov`Kro2iEjfG{uRDVW9}$m< zC#8AVVjAkJYWncGW#OF+d3oub3e(eCR{o86Rv~tHx3Z~u-hARW;yF>*InUJc{8s5N zh`$J@`NSW@OX5#n&*$-m`NS*YZ{jtd&lm9}ynjia39HRgTVEj-=b7>=>nr=zSJw44 zH4LjZ7w4HWYHJ$K6SjZ^6rceESik`humQH^&3Lu-d6fgqSV5RZZM~_kvZuK#eyD7y ztgh{21+|c`t>+8*0x`oIc~h}z*uVz!0K8mJOdIb^p?PS7r5XP$Z~zouObi?Wi!n?3 zRyCMYHH4Vt3!7yJF2MCI#U|iF)SU(Hc)kbl1QH;{3NEbdVQQ$Y8;H5-K|G zkVZH)f=+y8BS`0a2zwl5cG)0@P|TZWb(?p=q0d`{JWxg`mIDLG2S!i;OrQ`Hfnrbs zI)hT)%=hN|@O}9zz8~M8ujU8vHGJ)IA`o;T3oPGP{4jnv zKY|~LrIL(Vgqfa*BaR#hU$YL{4{>L5a={TJqt7uiiKb{m;>g5d7zQE@H~(B zkNGhR!F;d)$0j*g%zwg<#W)`PXTq;e7wlJqK}}!{Sj&IPkK^lwW6nMSRt`52-5SAW z{&PO?JlF=d=hzh3T?jNr}E?ZZ!5$R!o&bKVWEp(!U1B-0&ox< z0*Ap7{!4x$FYr_NgtOo{IDtu=1gF61vg}^i+^c$5nd^(1BMtu*|202hvTHhd9$XNr zU46(Va8c;z8j#w8bs1a%r};_zWPU>D!oK*_=;a$HwtY);Es=vZ1yKr zI<}y^o#_Il*s!20$cOIG1A0OUzYv?$B7QNygkQP{%AgnYCIX=^K1rAH8~IIG{2hFv z(ACyc7;F251u9|ayQNh8^7l)rVFaOQgc^QDBaGy~;}y-hL|92>L(jf%SC4`5grW(? z!Z>~cLvW%g`Hp;p0|cyo5ioQj>N(&7>h?%^6T+OQJOxq z!CW&C2c;r?Z7*}RDbL*Sc1Z&)Xj#&TXKt`A*^DUMwF|MpQds^@m@fS0_rg@b%6G!_ z;J5IKx8%&Qj};KduWE#S`K|8({ow#BAdO$w2y6Il?*SjdfmT30zrC?}=@z|MbFAFn z@3YA_RgKdZ^T3YSP2aAy0dBT3 zz7cNXkMk!4e< zUu%MQ;LrRI{B=PlO*cM(kFBtW@DYE5zu5$zz^D8z1njXfb+kHfO=W|*P+wV9^OpS= z(3+dTKj2IFC;uaVoBwG(e1-XV&EK)EYbUIh_ADYv94|?V|M{JYNtSfL2`tHxBGQJm zCGE&|q&@!&|0{o&zsKL_AMg(slVZ}5bRwNe7t)n<;~(*l`9Bcg_`eVkAz&kzW#5I6 zex!nMT0r`f0i>J^T*% z&A&zfz6;=(&r}?2|KeZq6Dq`RB~>-OYKL@c$&aed_1LuIas42sTLUqSYYxP#nqzZI zT2JPZd073Vj@0x2@Nb$(1DTHifdCL1yc?Xz60#HhA=+)eHw zzbE&S`-ngU0uYcRfPaJ_5Q@XyaQ}&xvJnx{T9t2PM8v2Tm7TJh?P>B1d6qnffC7Oa z1cDJzV)pvh3<(=r9HtpwQ+A*Q$d zUnQ@#gx&z6^9N?yFPH;YOla@@0{KM)w2t-+3r_BlJY)45|$Y`DTcc}g4Ge%)%vvCYb&IJ|ijjxR}kLWS7%z0F2MX|VaWHCn12 zg=1JF4x`r^DKP@c?+!Q0nR2y49`QFDDQp=j?;)O)m(|cMZ38CdO(arye>+$W-PmgA zRDhKcyty6U89Eh2ssB$y7gG^bB&CJ*q$?G}KSCfCfeZu;{PyOsncu>S1-mB|PbL3b z?4(kt4n!b@@j4-p#^W%U&ie;+-03vuDY(C>d_-Jiq}95#v7@l1#YDy9So%Q#rLw4O zs|i>Gs2+jLW)o-)p;R8WMan=~@+l)#fIt=k*$Ctyko(RMV1093+}<1)TQ(e~;i}{` zzYbR+Z`0U+F$=1)#VmCH!z@~@f$H624SCj32nYehrU_nMY`b*9@vOG8SMW!J%n8b~ ztcycWZ#v+l=72o(IcVVt7|QG=-=ShYieCpDZJAv_Av`F6F^DMXEYxV}ia-SdMQvP(8b^KhR*hW{DE>f=Us=`oH8p{nNKHbZ z1Oa>|lp;{}|5uBa_XPqquSJdJ{~y#yd>|6F6btnUk&n+#d~9{Iie14IE!taY)!uNd zht}2-wU$~}Ar8V>QAurm|A9g<=O~<0iJA4*(mlx9hZD#!7iJ^1$=U(Jk50PEVYP!A ztQA2Mwb?qWdAP&-;nn~}ZKZG+T|jN4wo^MO971~_&=Y}P2$&a8yQw{(JGB>q-U#&P z8xR;MG=_Ch9-&TJQI1l_sN>WL1o|M*7lA4S`YphjWFl^$$#E9p&c_Qj;bSaUC>#M> z@=59k1gcvTO6n%jt%Zim1y1V+ANk`~j>ZP%k+Xne@w4I9Dxm*QPY?^T5> zxPT7hPPOHdme4qyz0Z_sZyFy}qYxM^yizCT(}8%`33uFJeS22ZN*b3#i|G(LlvdGU zbU3Z1@%j5P0%H*P1c9*#e2Tz01U|$4OIk}u(b04a9ZSdY9teCce5yH}l}cyhQx?A z!o*0~x@{3Oi0n+4LYj+XBu0^OrEB1{&ZM#eh7ixhO9 z*6}Gqg0{V5Kf2ng`2Gld+el+em@0gxmHU2#RYBJyFpW>Zy*RQvJ&3HJ2h&5avuvk( z&?AInS|9hBJi#F_8G-3%=}|O}6}Y+dkhTagN~xLAoM+L9{un1=&8>m_%7(s8^cbS9 z?Lf<{vGk`xd6bkKM}H;^i;B05r@ws96IRmfR-2_KTG_%v&-pjD`p_c~XyIv!m8X_` zi=IKxvJ#t#z`RC!HUhW{&{j)Lt=ed;5bJtZRhtvkYQZ)(LFgClEMG`3B^2}NMf75N z2?FyGSb)I7`NUFsIlY39M_>^Gi-pGMvC-?mpat}LdIPGAFG%?`} z&h$Os&;gC|d;13y;dG-QGn91~;#p3#E(i%P)^M;9;%c z%N63P=IYEh%|=+?-lxr!(XCUiR*1`lJ;_;uCfTJ8cuXt!hYGQ=nZnFu$M?~R`K%Ru zL)e+zv(5Ndt>d>^Q=xWkV3S*6w}mySiNfiWtTxNxg1A|pI~C%>R&E$!WCyMd`mEL| zzhLzC!r2ZPZD5V9u)EEqdw0xg16$MzyD#kSSl?#J<*nlnE5yak5`LcQ)&^~LEBG-c zIY#_m^BbDSg_Wtv0_xOOgsrUz_$5pWJ>N99Hp}g51^-?l9wmf#j28H`oHontYX$!y zICSmYX8dsL_@B*^q4c(rooI!nm~Uvonw zQWL8kRXQRr9%uJBp>GZL%yZ_?eOCu^34 zbz^am`rj&HWvmyT?}MN-f-ctit}TK!{Bv~ly7CbbahQ#WmXX!D}F7k;JRro`j5Kltx7Uk-G8b?&*ove`3MFei1X0S2nJdS?|Ac1r!JObT}DJ` z<8VJEGB!SPRB=m>7H2jK*b=rgTgu|hCkVk{1hJ?g3)n7fS4_16!B7NMR&K+v zfTM(ExxV35Y|Vc%Q_I%1Fr!Aesg2PBg_pTrmLcrO|3n$Zj&4DTL{Qs|(#n3QI7-rD zd(n~cZ!L};%Z~p~QeUuNVp3lt7>!_zl~ioAiV0zg&c`x^osJRzm)Ec}*qInwaC>T!Q^He2^13a zUY0fN#{b0G#BOfE>40Fzwz?SnsK@mGt&3gkzJC>IKYIX^IfP&*1k(Df8lT>N44M-Az0kP{pSXmg|p?v|B2(sIkn(m-zjazv9iD8%^SE% z)8PXLYV{n>lf&Vrk&_@;-pI)i?E1lB&-t~4Y}lnj+@(3k6<#Py-o8BJ=!RegrreTPa~duZFWROx_#PC);h6J(^ad@sImo4O9k`Bfn}e`B zf|Us33K%yB@vA56?x=jVQPC}(K`ztUkUNWegXfw%f{Ny*;9G9=9BxKi)55m{M$Tl_ z3Erz-jT}yZdVi>sQo30w!u9;_ab37xI9cYpa^1KJt~*!B_27CU*ayMB2v#B355fKj zRwFoIF=ys_bA7nJTou=k>n{v8PPH8b1~qbn5v;{;Ts;cpw!^K@BM|(k`Po}A7XTcMeY)UlMxgUoHC!g!d>OA30;fU$nJ1=|82rO?mqWG2q~7!e&b&J+k`*3 zm)xI1zv7VCHzM+1CXl;DvrHPzGp4i&C3nCYhD|bocF7jxWW+8%$us{f6Z7*5G zT>;%iGLaYV4PrC@26uDdQUsUdCSe0EuTGZw2}esuTSN-XK#(Zd`Ub=LLZrEod1qqa z90Zp&n}jGtWWDx*mp3(@7djxJGh?uTaNU^>S%1o)ox1$DC_A$5bY@Ho$YIcuK_@}NF5T0qSG1p@)^)gxS z!DY8nFe_R~TEk%b$?c66Me9nv`nMlY*|T=w&_E+RL4 zJuw(toJtfS(u$%*v7&TQXHluBhp4}3u*f3%QZz|4L$p}5LbOt}TC_p5Nwh_@O|(yR zTy#xzTXbLa+{VVn(Z<^*%tmb!VWYK)wu!Zgw@I|gvC-M&+2q?4*c4i9ifuaEl-Ufo znQgPi=CsWdTUXmS+jQGP+hW_!wq>?mY`fWZx9ws3k?la+LAFC|huMy>9c62=MYfA= z58Ga|Bka8FI@M5 z@9p;49k9D<_k-OHyIXd*?e5rFezCi2ci--z-DA6_?L68gx9it#OuO&eU2FHu-q~Jd z-_^di{XqLc_M`15+fTRu&VIA~e)|*lSM7hWzhQsN{+|7F`xg$t!Nx)65a6J4h#*P9n8OW+2Ns9t z4u3fO>F`QSiS5LWVsEih94(F&$BPriY2t2Tvv{cZbMZv+bn!g#Qt=A$O7Uv(e(?$M zdGQtTZSfmN#?jv~)-m2O$Faz?e zsmQ6ssnn_5sjE|kQ>9Z+C$m!@r;nW`Ijwfu=XA~KzSA3LXXha2PR^a3Yn_KW4|5*j z{E71<=V{J!oEJMUabD)U&UwA_M(175yPdyxKI(kT`GoUT=U<)gIX`fIH|OUT z7vMs=&@QZt$i>#Bor{Bu+9lhir^{%U=`M?0*0`*5+2FFtWsA!;mjf<`T#mRLb2;I1 z%H@p9->xpMNv?ISlU(PyE_Ge$y4rQE>w4D%uBTnExc=aJ!}XTy3pbIQhg+yyrdzgK zuAAP?;AV6i>-M$VRJZAFGu>vp&2?*ZTj^%m;R|IPgm4}Xt%k3^3w52J_4qsXJg zqtv5^M=y`w9(_Ifc~pCh_E_Yx!Q+_6Wshqf*FA1|-1fNR@tempkLMmQJllCnJiR=9 zJpC=6a!-Y))-%d8+B4QO&C}><@+|T!@htT$_w4G~&$HUI#L#4x|qofuo zl71=aA14 zpUXa1eSYw{;q#-l+-1B+h^QSNE>+2iko9|oWJKT4o?`+>izDsAT5y zi|;ny9lpDK_xN7(BmErx;{8(nbbdvC{rm>_)%tzpH_&g8-)O&aexLh&;rEr_M8C;? zbNw3q=KC%5+v&I4@3`Mdzteta{VX^A?)d%Uch~Qc-&4QmelPqT{N?_|{+0eU{vY`_ z_z&?P?myChoc{{{E&lucPx_znKkt7rATl5^z!*>*P#s_iSQ4-yU`N2=fTIB?0!{~9 z3Ah<>C*V=Q(}3pzFXZjy61kr|KprR$l84J9K8OHXn4@5AU+y@Tfke;2$ecx~{8;GMyHEW!JN z4+LKiz90N3_(|}y;1|I!m9&ym+9=y8#Y!iok5ZuwR)#25O06E2k)@DrYEXDVHkOD%UGFDmN>)D)%Z6 zC=V--Do-d+DK9JUD4>Ar>ygHl$sMIK(ML8X^w~3JD1b3(J#c0 z8XuYyS`j)dbV}&d(CMMGLg$8V4&4)aDD+(DA1YEst2mXd%3c+qQdm?`s(PyGRQ0L`)nL^a)mYUy)#s{jRnt{7RkKw~R2x*ARohfM zR2Nj2RaaHlRX0_4RS#5;RZmrag~`K|VWzMyVIPN$3;Ql?YuMhf17U~5j)k2JyA*ac z?0VSEu-jpG!XAY);TFemX?SpWM0iwqYp@LS>c!XJnK7XEwqA8JZ1QroKAsh!lWY7ezU9iUdJK^J^b-j9!dZ>E1dZc=ydbWCwdak-ry;8kKy*%qrp8-O@gMqCPib^lxYTPMrte?q#2``sF|y2 z(k#?0(Ja@j)U460*X-5o*BsIu)tu0r)|}H^)Lhm)iD(xgiHL~k6)`wsQpB8y} zm)1wC(uQjzv{BkB?O^Rt?Fj8??KQ&S~_+~m4%|?r&ouXZ% zJ)$Mi>gdSmsOaeExah>_tmxe6yl7)|VRUhH&uDXW-{}6)TcZy~pNKvkeJ=W9^!4bQ z(YK?2j{Y@96r+mK$CzVkVur*Fj~Nxi$Bc;?8}oI{gqTS&Gh$}P%!_G?*%q@e=5Wlh zn3FM<(=k8CJdSx0^JmQ8F>hi)tb43HHYheEHY`>X8yTAt+c7pRHZ%6y*!i(*V>iTZ zj@=f!Gj>nxzSx7Y7h*5RUW>gE`(x~#*k5Ds$3Benipz}~9Jes;d^{B&7M~ek7+(}$ z9N#(K9N#y-e|$~+NAUyW$Hh;K|0aG~{LJ{-@yp^@S>o5mZ;0O-zaxHk{P*#v;%_Ig z3E~8=1pkDMgzgEI2|W|46KWIc6B-i6CQL|}obXM;w1k-n z_Y$7r>y&gNmuQf7e4Ruj zkx5LFD9K`%Bu(;8@=KB@1to8qrPNkY=MNz;>NCCyE0N?Mq-BxzaFrlc)N+mm*+SGJF7AJ;yy zeRBKh?H9FQ(tdgSmC2Iipk!sTDp{TUW%BgonaOjK8!gGdr@#~{g-x+Z>7Oz*Wq8V{ z6h7r-%C(g1DYsI7>R|3r-=U$ykPgE;obGVF!_5x2JN(?SPsfIigF6oEII`pGRGU=0 zREJcj)Q?jqq)tkmk~%f@N$Ts=H=ST7y3?nfgihadn$~G%nk-G37Md2G7LhhSZED)| zv{`9$(|yua>EY>?i1euR@#$03r>DjH8*l%+kyr znY}W5XZFqPmpL$VaOSYg5t*Yi`OMEVzs;PN`CaD5%*~lwGq-2%%siNRB=dOY$;>mE z=Q4lD{3Y{g=090%mMF_Mt6i2umPeK}%R9?ADsZ$Ftk>C0wnMfoJ1{#aTbUi29hM!F9iN?)ot)hZqD77yEAuB z?!MgPxu4%O%hMTk zg}M@5nXad zp?jeFUH4M=O81W*=xy}v^kTh}-c|3e_tl5!WAz>Mo%9*{Y`sojr0=XR*LT%-*Z0u( z*ALQvtp7s)mEJNzKS?j>XX)qaoAe9xi}g$OYxUdp`}Jq^SM}HRxAZ^hf6+hDKhwX^ zztq3dzs~c>OUcvc4aysx_gUUId2{mS|F^CLy277~}!Py`)C=6Odk|D*AYDl*jvJ6H;p`pZ3YUpCuDq`8)IXb0AAM$VJTW;t7oPRg}e*VM!mquXZjJ8I5qodK;=xg*d`WxlO2xF8n)|g;yZ%i@j zjCn?*vCz2GxY4-Zc*uCvc*1zvc+Pmyc*S_v_`vws_?z)}<4fZ!<39yNfuulD5MPj4 zP*zY~FuY()!KVeE7kp8$v|w$)hJwunTMI4~yfo1k6JugcB9oiR(Ir!F1Vl z&2+=`qv@IHh3Tc~FVpKnqL3_P3b{g?LYG3H!ni_1VXwkrg_8=G6>coNTKHq(?ZV#* zEpLjLB2kfDkwcMNk!O*t$h*k5$W&BQG_Gi3(afSbMU6!ZiWV0wD_T*srD%82-l79V zhl@@Xoh`ahbh+qiF;yH{+^x7zaZT~C;!lgeDxO#@6n|ShyLevl{NhE$ON!SNuPfeC ze4zMv@u}jo#TSZyD85;IyZGngUyGj>KQDe$VrMCFE^#aIERmH2lqgD+C90C}lIW7; zl8n;jr7KG}mF_P+R(iJdX6eJyC#BCyUzGk?`giG@GP^Q|GRHEPGWRmiGHIDtS!!9I zvPosz%J!8VD?49ysq9wSuVoL*{w{k{&XwDiw<~uj_b3l5*OY6^W6I;plgd-dQ_IuK zv&wVJ4f^u3@-F2SgLu> X+Rd-|J{19B%U@AR%ip)(-2(m}lEmSI delta 15412 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 diff --git a/OTRS-Watch.xcodeproj/xcuserdata/linnemann.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/OTRS-Watch.xcodeproj/xcuserdata/linnemann.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 928fa50..25fc655 100644 --- a/OTRS-Watch.xcodeproj/xcuserdata/linnemann.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/OTRS-Watch.xcodeproj/xcuserdata/linnemann.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -10,11 +10,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "OTRS-Watch/OTRS.swift" - timestampString = "503499740.022029" + timestampString = "504524069.32379" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "45" - endingLineNumber = "45" + startingLineNumber = "47" + endingLineNumber = "47" landmarkName = "reload(que:)" landmarkType = "7"> @@ -58,11 +58,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "OTRS-Watch/OTRS.swift" - timestampString = "503499740.022029" + timestampString = "504524069.32379" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "32" - endingLineNumber = "32" + startingLineNumber = "34" + endingLineNumber = "34" landmarkName = "OTRS" landmarkType = "3"> diff --git a/OTRS-Watch/Base.lproj/Main.storyboard b/OTRS-Watch/Base.lproj/Main.storyboard index 72e0d35..0c77db2 100644 --- a/OTRS-Watch/Base.lproj/Main.storyboard +++ b/OTRS-Watch/Base.lproj/Main.storyboard @@ -659,7 +659,7 @@ - + @@ -685,16 +685,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTRS-Watch/Constants.swift b/OTRS-Watch/Constants.swift index 674055b..a91c1ef 100644 --- a/OTRS-Watch/Constants.swift +++ b/OTRS-Watch/Constants.swift @@ -36,6 +36,11 @@ struct Constants { } static let IN = "nf::ticket::in" + + struct ACTION { + static let CONNECTED = "nf::ticket::action::connected" + static let ERROR = "nf::ticket::action::error" + } } } diff --git a/OTRS-Watch/Extension/ViewControllerExtension.swift b/OTRS-Watch/Extension/ViewControllerExtension.swift index 150d58a..dba258a 100644 --- a/OTRS-Watch/Extension/ViewControllerExtension.swift +++ b/OTRS-Watch/Extension/ViewControllerExtension.swift @@ -65,7 +65,7 @@ extension ViewController: NSTableViewDataSource, NSTableViewDelegate { let myTableViewFromNotification = notification.object as! NSTableView let ticket = OTRS.sharedInstance.ticketDictionary[row] as! Ticket - print("Ticket ausgewählt: \(ticket.title)") + print("🖥 Ticket ausgewählt: \(ticket.title)") self.ticketDetailsBox.title = "Ticket#\(ticket.ticketNumber)" self.txtTicketTitle.stringValue = ticket.title diff --git a/OTRS-Watch/OTRS.swift b/OTRS-Watch/OTRS.swift index ae30f15..b4d3b1b 100644 --- a/OTRS-Watch/OTRS.swift +++ b/OTRS-Watch/OTRS.swift @@ -6,7 +6,9 @@ // Copyright © 2016 Adawim UG (haftungsbeschränkt). All rights reserved. // // +// http://saeotrs01.sae.intra/otrs/nph-genericinterface.pl/Webservice/GenericTicketConnectorREST/ // http://otrs.github.io/doc/manual/admin/stable/en/html/genericinterface.html +// https://developer.apple.com/swift/blog/?id=37 // import Foundation @@ -40,7 +42,7 @@ class OTRS { //MARK: REST func reload(que:Int) { - + let nc = NotificationCenter.default let config = URLSessionConfiguration.default // Session configuration let session = URLSession(configuration: config) // Load configuration into session let urlNew = URL(string: buildURLForGettingNew(queID: que)) @@ -48,27 +50,35 @@ class OTRS { self.ticketDictionary.removeAll() + nc.post(name:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.ACTION.CONNECTED), + object: nil, + userInfo: ["message":""]) + reloadByURL(session: session, url: urlNew!) reloadByURL(session: session, url: urlOpen!) } private func reloadByURL(session:URLSession, url:URL) { + let nc = NotificationCenter.default + let task = session.dataTask(with: url, completionHandler: { (data, response, error) in if error != nil { print(error!.localizedDescription) + nc.post(name:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.ACTION.ERROR), + object: nil, + userInfo: ["message":error!.localizedDescription]) } else { do { if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any] { // work with json ... - //print(json) var cnt = 0; for object in json { let ticketIDs = object.value as! Array - print(ticketIDs) + print("📑 Going to load: \(ticketIDs)") for ticketID in ticketIDs { cnt += 1; @@ -81,7 +91,10 @@ class OTRS { } } } catch { - print("Error in JSONSerialization") + print("📑 Error in JSONSerialization") + nc.post(name:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.ACTION.ERROR), + object: nil, + userInfo: ["message":"Fehler beim Auslesesen der übertragenen Daten."]) } } }) @@ -91,18 +104,21 @@ class OTRS { func fetch(ticket:Int, session:URLSession, isLast:Bool) { let url = URL(string: buildURLForGettingTicketInfo(ticketID: ticket)) + let nc = NotificationCenter.default let task = session.dataTask(with: url!, completionHandler: { // see: https://developer.apple.com/swift/blog/?id=37 (data, response, error) in if error != nil { print(error!.localizedDescription) + nc.post(name:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.ACTION.ERROR), + object: nil, + userInfo: ["message":error!.localizedDescription]) } else { do { let dictionary = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String : AnyObject] let ticketData : Dictionary = dictionary["Ticket"]?.firstObject as! [String : AnyObject] let ticket = try Ticket(source: ticketData) - //print(ticket) self.ticketDictionary.append(ticket) @@ -119,9 +135,15 @@ class OTRS { } } catch SerializationError.missing(let marker) { - print("Error in JSONSerialization for ticket #\(ticket) at \"\(marker)\"") + print("📑 Error in JSONSerialization for ticket #\(ticket) at \"\(marker)\"") + nc.post(name:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.ACTION.ERROR), + object: nil, + userInfo: ["message":"Fehler beim Auslesesen der übertragenen Daten zu Ticket #\(ticket)"]) } catch { - print("Error in JSONSerialization for ticket #\(ticket): \(error)") + print("📑 Error in JSONSerialization for ticket #\(ticket): \(error)") + nc.post(name:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.ACTION.ERROR), + object: nil, + userInfo: ["message":"Fehler beim Auslesesen der übertragenen Daten zu Ticket #\(ticket)"]) } } }) diff --git a/OTRS-Watch/ViewController.swift b/OTRS-Watch/ViewController.swift index 6bda580..c655382 100644 --- a/OTRS-Watch/ViewController.swift +++ b/OTRS-Watch/ViewController.swift @@ -100,7 +100,7 @@ class ViewController: NSViewController { guard let userInfo = notification.userInfo, let _:String = userInfo["message"] as? String, - let _:Ticket = userInfo["ticket"] as? Ticket else { + let t:Ticket = userInfo["ticket"] as? Ticket else { return } @@ -111,10 +111,12 @@ class ViewController: NSViewController { DispatchQueue.main.async { self.ticketTableView.reloadData() } + + print("🖥 Ticket to show: \(t.id)") } func catchTicketsUpdated(notification:Notification) -> Void { - print("\(OTRS.sharedInstance.ticketDictionary.count) tickets to be shown") + print("🖥 \(OTRS.sharedInstance.ticketDictionary.count) tickets to be shown") } } diff --git a/OTRS-Watch/WindowController.swift b/OTRS-Watch/WindowController.swift index 253902a..fe381b1 100644 --- a/OTRS-Watch/WindowController.swift +++ b/OTRS-Watch/WindowController.swift @@ -10,6 +10,10 @@ import Cocoa class WindowController: NSWindowController { + @IBOutlet weak var ticketCount: NSButton! + @IBOutlet weak var activity: NSTextField! + + var viewController: ViewController { get { return self.window!.contentViewController! as! ViewController @@ -20,6 +24,22 @@ class WindowController: NSWindowController { super.windowDidLoad() // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. + + self.activity.stringValue = "" + + let nc = NotificationCenter.default + nc.addObserver(forName:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.ACTION.CONNECTED), + object:nil, queue:nil, + using:catchConnected) + nc.addObserver(forName:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.IN), + object:nil, queue:nil, + using:catchLoading) + nc.addObserver(forName:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.LIST.UPDATED), + object:nil, queue:nil, + using:catchUpdateFinished) + nc.addObserver(forName:Notification.Name(rawValue:Constants.NOTIFICATION.TICKET.ACTION.ERROR), + object:nil, queue:nil, + using:catchError) } @IBAction func toolbarActionReload(_ sender: NSToolbarItem) { @@ -33,5 +53,81 @@ class WindowController: NSWindowController { @IBAction func toolbarActionSettings(_ sender: NSToolbarItem) { self.viewController.tabView.selectTabViewItem(at: Constants.TABS.TAB.SETTINGS) } + + // MARK: Notification + + func catchConnected(notification:Notification) -> Void { + guard let userInfo = notification.userInfo else { + return + } + + DispatchQueue.main.async(execute: { + guard let message:String = userInfo["message"] as? String else { + return + } + + self.activity.stringValue = "Verbindungsaufbau ..." + }) + + debugStatusBarContent() + } + + func catchLoading(notification:Notification) -> Void { + guard let userInfo = notification.userInfo else { + return + } + + DispatchQueue.main.async(execute: { + if let ticketID:String = userInfo["message"] as? String { + self.activity.stringValue = "Ticket #\(ticketID) geladen." + } + }) + + debugStatusBarContent() + } + + func catchUpdateFinished(notification:Notification) -> Void { + DispatchQueue.main.async(execute: { + self.activity.stringValue = "" + }) + + guard let userInfo = notification.userInfo else { + return + } + + DispatchQueue.main.async(execute: { + if let ticketCount:Int = userInfo["count"] as? Int { + self.ticketCount.title = "\(ticketCount)" + } + }) + + debugStatusBarContent() + } + + func catchError(notification:Notification) -> Void { + DispatchQueue.main.async(execute: { + self.activity.stringValue = "Fehler bei der Verarbeitung!" + }) + + guard let userInfo = notification.userInfo else { + return + } + + DispatchQueue.main.async(execute: { + if let message:String = userInfo["message"] as? String { + self.activity.stringValue = "\(message)" + } + }) + + debugStatusBarContent() + } + + // MARK: Functions + + private func debugStatusBarContent() { + if self.activity.stringValue != "" { + print("🖨 \(self.activity.stringValue)") + } + } }