From bc279b1e79bbcf175984b4188a6974af06acc7db Mon Sep 17 00:00:00 2001 From: Jeroen Leenarts Date: Tue, 2 Oct 2018 21:33:24 +0200 Subject: [PATCH] Add some form of image for when no configurations are available. Signed-off-by: Jason A. Donenfeld --- .../Assets.xcassets/Arrow.imageset/Arrow.pdf | Bin 0 -> 8558 bytes .../Arrow.imageset/Contents.json | 15 +++++++++++++ .../TunnelsTableViewController.swift | 20 ++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 WireGuard/Assets.xcassets/Arrow.imageset/Arrow.pdf create mode 100644 WireGuard/Assets.xcassets/Arrow.imageset/Contents.json diff --git a/WireGuard/Assets.xcassets/Arrow.imageset/Arrow.pdf b/WireGuard/Assets.xcassets/Arrow.imageset/Arrow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..781e3095b509097d311a25b04028b11c52b9d6be GIT binary patch literal 8558 zcmch7c|4Tg8@4qJp{yY$St84fnK2~$GD!A)A7cjD8B59<$(}uXworD;z9te`vX>>v zK0<^nd57w|{@&m3{p&S8^PF>?`?=3K&$*tD`?_!3nhHvSU?B*AyJP*zzY-wW|+WLXo+OL#y%-a2Oeoopn z=3>S^i6LoN2mtM5{p;c5TPJ6Ba!@B%2pn`Wc+wR4%W>-7c0mJ$HIX)_-)?9pED-YZ zXtmMq&K_o$a&NQvPypXaC^L{~g{cH+65S8x@l+sHqCdx{ zZ>`%(hzR9GDbiEk3$hxc_)4qU*`}qSI6oC>PqAJC+nP>2>N1*{SgaYFuvzyVt0&Mr z3?gaA8WILTvkmFLthSk+r|aq1C1R!}q&6gMoyA~C5PJ$l!-q|hDJg}@omD$ugaWJ^ zJ_xjE^0<#4`^R#^<+;uf02D_=ulw;Z%@ZZ)RK2<&a!m4OJCRT1K3Ie?nYD4#8hj>%;rGL{_Se2Xb@9CnRAjNA-9oZif!y#3ESG5(ddHh_m+tnc0ZjX z$=5yydYe4B{!H1(OrseGT(NKyBf$=raoWYI=0rV$YR5A&^RvYo>p+69qy*K|>09jg z9n9l8K2h;fM&NJ`?u1$PLRXjI2U$VRZ(8n)@22#8InbAQ!XzDdS%m?DR-AuQ@Z^R< zZ!Z;fa=-P_F75GLtGM0U?w11TS*=W)AxnB%O9>RgVYUq+*8>e73Rwe!{YPf~nMHZY zF8F2G)7yGj5cr0OYu2iey>^x)kiSgK9cV`$ zv_Z>|Bm49rV;)V4+$b%pG5KwISxqr|;#cxv4{76Mz7OyeGV|Yink}y>xqTVSQcrGn zZ~rmb01$fSh|o9q+#{kPn@3Z7HgllntX>_ zBVjDrE7?LQi`U|kzv_=ChqXjnZ8B{-fw|@S*-Eq3?UErXim5q?Ru8OFt-`GCeS*Ex z;%~(WXrE~ZS?)o!FXTtYM>a&pY(W?5`seyTh?d!zA2;$Pe&=`MznjRJh)E<& zjCrc2=R86`lJV5>sm3tq7SAo@t%+L)BSO!j`V0EKGW#J9xn)H|F9JO^Mh$x!dmChFaBtml=6VBe8*t4p)BeVdVUWW0BHD~41GW-^TW`1;QF zZBGP@1B&epQI#R^#qMOt{fWDo0oNSrfX-S53Q7PaWv;n*=XE;(^jdvKNJ z22Cs?qAQ^wevzf0()>YknL(^USxwxo)%vaV0;y|KVNy|2bj_a4&wPdVkViyEp8Hc< zV;hV6V+R@}VkE^BOMpBQB@%ryDM}HF^Q0amFWU&)8iF{4-&t^(4l@$T9m;!#T&I9h znKA6UGYbhoi+OOjYxTVSyuC;StrQjHI~tT@UcY;dh=^jm!RV#bjd-Ovg1D)8M=@FP zMzW!RQPpRqNaIN06G=u6R)#xVo^D0E@1|~q&fz`*=Dr9)Op~f`@72Fn4}BO*k{nzaJgAV|VHSo` zDOF)mnIqDWeg4s-(&B62=c0s%3AucbqQRoKcEQzq)kAXJ$nf&3W)MlI~|kD`C5eN&F)O5?s~L|JvKa@q!g&U&NOdv0O-bLwZOo{QaE z-3NX!49v^JrrGny{lhlc7klcGkkL}p4|VEZW^MJe-~+ zVXenn<;|A1RqG3#a&>ZAvrU41Ce#kE92gwdrZ80{w>~6unh$=n>iHD@NrQVbZgs}U z*Wmk9?@sVqQ~pl=f!9Y*a<9p$<@znd6e}b1iGk9OW+n5zUvs|JG#KET^^qp7mNa%T z)-ly0g_TXJWw#I`1uJYa&or#W&di?B)4vlMC_9I=BKVbj`d8c>l3%beV;D#9%b#k7%&bu&K{i{4SSI%YIjHN z&dhSaP{zf+i-OW=$9K0QcT!TT-q_sekL_bfPZQ7b^7|^+8L}A>#uR$Z04r5r{rO!+ zX?f{%PhfJH`DUG4(TApkL%rl@Hl^Zb622L}O>6g$qDI*pGLtNDes;^x*BzUdU8;_f z=1QWQNqrah%?^a8cj|rTqmMIKi6hSJe-UcFb8J2-x$HZAG)PuNV=mq6BX(qagu>0` z@B%dWGoMPA9F6RaVTzizagWC=`>P(<#N4ly7d}q>UZ(Mqw7;nTs#3Mm3ZewjANf6U z%BN!c)kaTb^3YsJ3*V0yyNQF(vi!Ubnry7PJ2vbGS5u@_rwg0K_eXae7p<2*4|&Ge%36#6L^$;fZFbgUB+qbX(VPvNqgO;IQ;6(~*|;594q zS4Tty-!rhY#@e248ZHJnc`X0=BLY9!!vFKB3f?x+)0EDpopdcwk!j-Uvhgu?Pj7iF}ajV%@c2Sb6vI#{%$KHlym zM}j;hrid6&*zl(b5C(?-G*JeMop|-MIprY`3dQ3$k={Rh_ydOlPFIM}te{1Jc)x$w z+NZ$p_v*KL{gsUQ*#+ZSax%mJO3jQIIy#sbT=47vX5-Mc8Pzg3Ug3Lm&c7oX-`LVC zxcRQu=!Ks^Ne0Yu2F{w=x%x#1?mObQWfp=rVX25|cE9 zCDp%XiK=u631vyF8tmiH)unSWSz=Q-3tsKrOtEjx;k`b|3{fXhPhU!gnIUx?_qDeP1=!p zb$pC;#XGis{-yrz{?VA^&q>E1nY@T$rDu6OvZDv&LG?@r=&$aPw{s8s*DroyK6((w z@5E#_w-Cj#f^93_ z@<2pT)BX8Qy9eio<@KqS)d%doD_5QLE-F3kjxRj7rQti5XJ4sw2D`x+8+9ywgOc`@ z#7k>>sP*}2o?`j#36|$;rH$?5HP2w4ixcm;ZkM$gkIc&ZKH^{A)yPOUwLuJ=i_`2N zeyFQ*yj{xDkr z&*RlBu}XM><`Y=>VBj#?hH+%;|Mo`U07Ukru(V`Te2|Va@Y|}reI^X2FsdBLlKX^6 zVjiVCTf}m8t#kvy&G&H@zy~C?M0lKcui>`Y)q7&85@2Fg8>5{%DOXg1zS5a$nW^=p z`iL@T_z;-jd7U;tDJkDei@zO1Sx~(-#Fr>_Z-DV-z6Nryv3=va26Eho>E(-l%=mOA ztI{>g5;M&BcTzCUhxYyyO^1s?&$|ZZoz?}RJ{PZu**KdFV_C}k{WElx+tR4LE$uH; za^eRMD|-Xq%|G^Scc*8Zq(8qi5RG9y-^r)opT~DegmH! zJ-_T|<>J7;Ru_F#aq~K&sBX7NI#ll4h4n%edEBRwmm-{2$bw(535_D;7D&keAC>7qtfxQnx6V&T~8_I}=k zVQ3$XjI(T16JcH%^6`qit>Bmoqid1lJr`RwJtvSoN{1J&aq4Lbrc$xw}|1O&%9jdO&$*A!#8jzEk?UL`6V*q&s z9Xm-#)Fc6i5y=}F1~H23XRp(k68Qm4iT#MHg-2~IFcvks_WWZUsLbYkY0MRHK2*9NRL#OmC>O%y{(iUaCsJb^fR;EqJRufOD%@#+e9hGjW zO59@qj*fFj2S`Rs__Y;U&LKvfPP`rQc-x3vn1JXJU+bV>$7|RZGO_6}KYyL4T4%N} zv?i{_;EC{T5KRhb*#ykxLh58K7?OE)+f)nTKtaza5dj0BzBrLEsCl!ub59!u5BiV` zJ!ZN>0FfazB+Vq+E{9N2`g~L*bkEyk;}ijs0<`H#?+0YG5`HAvfXPg+l9DqKA}gYO z`I3hDhAQoFO8z{>i9xaHDc#heF`=D$F7U&$5tX^8xB!jv2vLNm<&|5bK(PdGTB>MU zAiv;3z9V0ZaFrm?adrI#nbnKK$Xn**QGML`MRJ-p5YJ+xGZ8QO%9bc5KIO)$XG^lh zgbKE0+g1WSZh6#u);yCKFN$I~sOh?PRx+fyQ_!MjK`>rx3`2RaHm%;I6Yjwet{?^v zhDzi{#BFb}}@LJyE@G&X^?D9M+V1 zB}`qck&|`O&*m%$&bIIyGU*eLstQiYhw@Xkv2nCK7o~d-NOqeD$5n<;n2wT(&YNn# zW|+XFcBjnKdG=B+81g$_EQ zInd5h+J#Mw%#=Wg$ROZZYnqHif95Xmkb;&`>qfeDYytMob1qif%VBz3AXcsvzxlj9n=M$Tx($yiL4i|*G^~UwJt6}V8;KY3I z;^jCv?Iq7biH8-FwbU*Pinl*jCTE?03mh+QV$nLEudk9+)bl>8B3OyeWX|f9N}(fp zyB1@l%%V~cIEvz^Ld@w9PlfI{WsaDYcZHAtaE$V)P@q~0Ar&>Wym$C&KJ%`$++F4b zekU0QxP!hc@k%9OAQInx9L}ow>TKbsGrF$CPiqPFCIe1Q@G$Lz2j$d_opm3@`C#ta zpAMZVnEb9Q!DFOTIIA`yCB)B@M{-T2tp&AUZ5{4beBMoF?CPRUJXBLoCabSM^JW<< zJ~WcZR}g{dsWAL*TTyEo-PP0MLX`_X?4{7J6@GJ6WO}jg_!9Ryb6TaE*{piz<2Xz6S;T|Ht}iiCeyD}jrGc+^ zJ%bFId191VW0aen5LE&$o_k&Z8`UVn;6Rq@9aguz_uO~%Nn|ez@LF(N&W?OneTBP8 z#*-sjW8^M3(7651VU8&~@0p`MdI@JqS2ZpbW0S4}Klfhfy-t_a+Sl_u0$$E9t`vw# zdy`m|@aO5y2v(FJxZJLOv*ZuB#?KU_9DU>PM;ynS_Y-eR2F>mc6R)tas=8FkM`c~A zmGnJ&;N+C`LtW`bzbsShji9oQ79It^{+Fbs9-CF}A-)kg-*0En!`nnPdD|E4$B|oS zY}%F7USFVda^ac$s8-vS;&Kl%d&cH{BfiBpdv@}p!`ln{5EjUnl~~)puJSZTwZ!M2 zq%pV+)vzzrSrbbztcv5i21K*)T`wfR2=kJrJ^Sd=WFK+RKw)LpV`fWLt1`-#_*HG1 zCQZb=CLl;_!MBRM?XAluCh-&8@$x>V`Y@s=+I!X!zJDDRUEglDh3 zlWgJK=ih^9#23CF+UOGUd9X8Jo*HVwk9}B*B6(Sw;4eJTeo1#qC*?z(B)H0LW%A8L ze9sM)-k=Ye1AClong76a7_dR76XGoB4BY5aWKRf1mea2 z{%MI9W52Z*zR+pyfx_3mPuHQ1SA+PHHx{1=Q8=j_;>F%+ef*}g^;NqhAJ)Zmkoql5=s2KiX{2hb9P7+6d$MAc=rw;ysLH~n4 znCQR#LE-<#L}B<8#y|XtisMrT|G?l7d`0%}7z7H#%h-QlF!6t3P!YTq{)ZhDc9QP- z`@L{6$iL==i{YjGKkdXt{xS#F4T+c3Zm0jmpkwEQKO?+4*LHTsr@?+^zl2qsFwXd# z*y+KkDB!bV*I^=P334eQ PVjw6Oz|F0wp#=CpqgZtL literal 0 HcmV?d00001 diff --git a/WireGuard/Assets.xcassets/Arrow.imageset/Contents.json b/WireGuard/Assets.xcassets/Arrow.imageset/Contents.json new file mode 100644 index 0000000..77459c6 --- /dev/null +++ b/WireGuard/Assets.xcassets/Arrow.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Arrow.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/WireGuard/ViewControllers/TunnelsTableViewController.swift b/WireGuard/ViewControllers/TunnelsTableViewController.swift index 37354b0..26932d9 100644 --- a/WireGuard/ViewControllers/TunnelsTableViewController.swift +++ b/WireGuard/ViewControllers/TunnelsTableViewController.swift @@ -188,6 +188,7 @@ extension TunnelsTableViewController: Identifyable {} class TunnelFetchedResultsControllerDelegate: NSObject, FetchedResultsControllerDelegate { private weak var tableView: UITableView? + private var arrowImage: UIImageView? // MARK: - Lifecycle init(tableView: UITableView) { @@ -196,6 +197,7 @@ class TunnelFetchedResultsControllerDelegate: NSObject, FetchedResultsController func fetchedResultsControllerDidPerformFetch(_ controller: FetchedResultsController) { tableView?.reloadData() + updateEmptyIndicator(controller) } func fetchedResultsControllerWillChangeContent(_ controller: FetchedResultsController) { @@ -204,6 +206,7 @@ class TunnelFetchedResultsControllerDelegate: NSObject, FetchedResultsController func fetchedResultsControllerDidChangeContent(_ controller: FetchedResultsController) { tableView?.endUpdates() + updateEmptyIndicator(controller) } func fetchedResultsController(_ controller: FetchedResultsController, didChangeObject change: FetchedResultsObjectChange) { @@ -233,6 +236,23 @@ class TunnelFetchedResultsControllerDelegate: NSObject, FetchedResultsController tableView.deleteSections(IndexSet(integer: index), with: .automatic) } } + + private func updateEmptyIndicator(_ controller: FetchedResultsController) { + guard let tableView = tableView else { return } + if controller.count > 0 { + tableView.backgroundView = nil + arrowImage = nil + } else { + if arrowImage == nil { + let imageView = UIImageView(image: UIImage(named: "Arrow")) + imageView.autoresizingMask = [.flexibleHeight, .flexibleWidth] + imageView.frame = tableView.bounds + imageView.contentMode = .bottomRight + tableView.backgroundView = imageView + arrowImage = imageView + } + } + } } protocol TunnelTableViewCellDelegate: class {