From bfea4b024a59ead211a6e0eb4b71825a892af5bc Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sun, 18 Aug 2019 07:47:02 -0500 Subject: [PATCH] core: Implement bar chart --- .../test/components/BarChart/2-series.png | Bin 0 -> 17252 bytes .../test/components/BarChart/axis-monthly.png | Bin 0 -> 18713 bytes .../test/components/BarChart/axis-weekly.png | Bin 0 -> 17931 bytes .../test/components/BarChart/axis-yearly.png | Bin 0 -> 16283 bytes core/assets/test/components/BarChart/base.png | Bin 0 -> 17079 bytes .../common/org/isoron/platform/time/Dates.kt | 8 +- .../org/isoron/uhabits/components/BarChart.kt | 164 ++++++++++++++++++ .../uhabits/components/CalendarChart.kt | 2 - .../common/org/isoron/uhabits/BaseViewTest.kt | 2 +- .../isoron/uhabits/components/BarChartTest.kt | 79 +++++++++ .../Frontend/DetailScreenController.swift | 23 +++ 11 files changed, 271 insertions(+), 7 deletions(-) create mode 100644 core/assets/test/components/BarChart/2-series.png create mode 100644 core/assets/test/components/BarChart/axis-monthly.png create mode 100644 core/assets/test/components/BarChart/axis-weekly.png create mode 100644 core/assets/test/components/BarChart/axis-yearly.png create mode 100644 core/assets/test/components/BarChart/base.png create mode 100644 core/src/main/common/org/isoron/uhabits/components/BarChart.kt create mode 100644 core/src/test/common/org/isoron/uhabits/components/BarChartTest.kt diff --git a/core/assets/test/components/BarChart/2-series.png b/core/assets/test/components/BarChart/2-series.png new file mode 100644 index 0000000000000000000000000000000000000000..0dcdb126a48ecca382201cb887fff5fc0f501a0e GIT binary patch literal 17252 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 ZYdb}cHom_^jJ$vZQM{xohmpDE^IzOi|4#q_ literal 0 HcmV?d00001 diff --git a/core/assets/test/components/BarChart/axis-weekly.png b/core/assets/test/components/BarChart/axis-weekly.png new file mode 100644 index 0000000000000000000000000000000000000000..132cfce6344f666bbc1881d3c17c4398199320b3 GIT binary patch literal 17931 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

!yi7io$0xC@9xVly4EjBh@49p}Ze4n*aUY(9nam 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%0Dl>fz^;Qgx2@-GklG{&da64n;;_?(Jr&3G( zJdUYEqXpMEl2%vVP3cGzH&&!AcyE4D;p_lArsxe@c0WxF$NCVkpod9w{`#dGmx=<< zmH5?TaPQj@BO?u@sc-02Rt3E=;6yG{wfhY9L%S%H9kJrA0rn{(xv=(=vm*EZmb#vC zJ=l~Sex23Cs;>FmSr%sYtSBK74ziIL^P|A>L%ryo7B-Q4e%A%BB|Q~%ZTceI`({xq z(r&>YTO2da&TR6{ioC6u%(45P%AF@268%iaz=6P~JRw(sM4+oM|Bq^JNG?OnIc=%% zAxKq`eG-f`PJUG}#^BP%4vubb7eoyqU#yrvRv0I47N7M>W7|qgD!fC2M>Zgr)l z4=(1j5fRu$j#e;6`r|mp+d@T-A*k+?`ik@to7}dZ3`w8`ImnAWsmTg9&HJ=j2+`qt;BHtdnjPEu z6|c)?fBpK6OKE}Usv%uc75a@yh&dxeJ^!Y}7`Lo_Nd&usMTU5ya6+;y++PvauuBG5 zR4lU4RJ95g7XNN6QeVuoRbCi6y3SW)%>_#!)bB90e}ueZSlUH%r+{RwZ-q@}twhV^sV&VF%sEV%%QULq?m{a<#YdBkk*_4dC}x12?o?fS zs9>YHAYn%87<;G?Gv78&PKxcuMngC|qL9Tvz^tL8{3@ILWX$425m(xourA`=tp>@c ziZp5X>FlP#mNyHFe6i&h>)d!;<*`_=Gq+0E8T5VBrtjTZKPTDkKiy|vx-Um(cfO@H zf{9r1>tI&TXu;QUD~>{QcWi{B4RxMh(Y6O815crkMHnNhA6vb(yoIZ4zYmW63l1d) zo_nEZe3^QVe?!;4rj~?w5 zAjn7^XZN8dXJ!O~g%L`m?$!ql^>M$_DPsQ&&JchbEcH0ck3yQ1Y#@Bhk7GSX{eWV*?w!9|-%NZxy9XMiTz{j==M>ties z=O;m|HpC#i@V5j>-ZD|S0zAvp83}Mzv$8tRQ*MXwvy%PGbgPzWI4S{uv%-g- z(&rY*_980vQ)W}KB5@$A6W+Njk<+rsmqehsc8E?+2SjF#IcY>;G_ZV_8hTq;qWq#M z-zCUz?f%rO%8dScMjvaT0#g9T)2?VWn_Pu8vGGRgt~@h(GF)1`{<4_t!A<-1M`1n0 zCN;hZHNmY@J{CgxiixjX%5PP_*C^GRQ!UuINwP?;(RYSUOi$lkh|_62Vk@i-14vWf_}We zirGcB(*I zYAL98M5ucxwU-gSie!(<0gS#Z9tBEyNedpo-0l8g_WB>pF literal 0 HcmV?d00001 diff --git a/core/assets/test/components/BarChart/base.png b/core/assets/test/components/BarChart/base.png new file mode 100644 index 0000000000000000000000000000000000000000..8d917b76902a0cf4af73971944550447f7c4e268 GIT binary patch literal 17079 zcma*P1z42n_dX7Y3TqLfpa?^wpa@9Uh$syrNFz#!lqlVxvUGQ|Dk&u(AiWCGAbLec7mk4XI)6rqj434!{yDoaC~ zlgFsU_&yZ7Wf^nnds^pqXgD8N>z(h#>^hl?jeXc!yGsPtK#=0gb&C-Cg9!Skrzi9$ z0U`7W91i`t{|O8R{Y^pw{U#%WeiIWzzxO|ZUS++lp`oGusMC2dJg@Aciy`N_sGrlxmy1FrQO zrM-R2Amp?*8Jkl2_{(eVeszxJ(W>=R_$6gt+}+&`AHys;JUnhRRAPx-4fU_DuTRa* zy>4n{rEI@A_%O?6VW5EA&VFGa%mPuEW`_7=s;X_ZG+g#@>>Yk{e|hET*ND4Cg!$D! zBSbDPDxReijTOW@aL))WbeT!;C--1vFd^)><1q~v6}8e&K|p3eW2j=9TEF&M$7pID4lyJ-_y z&$K7S=PfTSDdp=|ITz~_K{AJnk#T5auv<0CGmnRBJS4=_ElK(uhpXL0a*G^S$2Uy+ zBw2;IPoKiC!0zuX)r<$Eg3cSyrZg4KrUZJ{B?P9)$E4dCn2u`uk}kh=%gHp}sI4uuF#*sD{|+e;zLRg> zypffbmM&Md(bbVRIDhB%^Wo27x@FcZW$qZ~wYgr7pr8j7Xge>0M8TH^t!3IikME}V zi&JBa+v535lg?b`R}f5{YmMVY7VDHg-wc4x`FzT%z1dlV+ELuwF3SU!K=H_J|Sj$T}0%+>4GBsW3`cH4q6R#t`+DMH7go+FbVaPk;_qMiR-1e#%eG}FFb7~34 zDDLEZXlnfP)WvHUj#1j_)rk;^^qC1|XhVPC-?VhSz{u-*H%H6`mD*rfEklPm+aVv# zx!MBPJ0(+c^G+p$sfC3CYH=tAOH+G^cgOc_uv1+^Waj05QTIJfrelz9v?wg}(AIs= ztrWO|7>cBR9xi>F%5R+k4i`Js_@mY*VyY!3B#w!~jcMBC8$}=G=7eVYMWBYBUwL|y z;-%NYX&8NZeH__w3A4e6)+$(*rsJOEuv#LypD!ihtJh&z;B)dEU8?*F5s==^`M7qa zwpzbQ_T=(l_ki#M=S?$UUXWauTkDkCzHE(oq&&K8x8^$%YfeR`>`VylRjv_8i8g_> z-flJe{a|4Vf~TT@(wPpiRyFO3_kfX+aRXUG!Qc3}O;J1RGY=&=)K~rH4Z?Kb^J~vbKLmQ!=;xWUbB5+8oTT3I^ zJ2S@XaMbdc#JFSYsiw)v-fWFabkLxlo_lfB)=`SoAy+!GqXuN%1i2MBMq`cE<>KSx zuU$TW5BSCYSptIddhldXr*L-vcau>eEHK36hM(MMc%_@0TNFmJun@S)57~x6K4S&% zz$31^Yj+(S9KfI98vY8cSN*OeqtWP$J>I?GD8!>+tgX-v=4*FT%}xM)1a7^?Tmd`f zQ6RE&5r=4(jlp4REETXz9*7uM-YugwdYq%|&^7-xm6nU#1*$6NS@I*V)EFA`M^{&~ z$xfuVG~qTSFoG&vR%nttwCLt$haHOG2E2@Y-0o4DaEb*ElnBHIkk+P zNeS1_ljvL_cxr#vmz99vuWeoNE%u!RT>5H6le9W^w+1UNCAroL2YPX2Vu<#%SEU=Ko$Cbt!N7&F zPA%%4#^!UE^U>cRy&;GUbDX$;i*TnOH$mSmzzg{q0(SELcAUB(c+G5F61xs&P-E6|!d5`t(eN z$D}=x{AaioK6QbU+QzbYZD}MWhFSFGc-`lIetv#`;m8Xje8+gDEwCDDgnmTOASISV z(X2QIDh2{eOG{Z77ned1?ft1~MeHr4lCFr@GwYOCWNGtT4o3DRh&U|yma;12ya*id=23PN`WQ2*6{hcFxYu;7I|t2#nU> z7WIeE-6aHGR7tTPsB}hu{-Y}A)-t>KzO)%IZu%3Iivw9SU=eUQ>zBo$Qq?D#m5wjV z<4vjweJT43ycJ2rC=A8 zb%!U)i_g3-)!^fkTJK?ohqXdB(+bXueYrYpm^k3Wn!;J+t+!|ipK{onod8IWEL4`F zHl2qw?peg&R2=H5{dRVCipZkzHW^kCIL${@USI^Co(ivuOghpH$kuOv=tLmm9zl^( zdB?^;P`zaQ0_=7;jBxiN0nvkuPoW1Cviby{0)8-%QLi4w2R_l+4!em1U zFsBFzvs3|`i}L?+PGT?A1q+rYOsLBPto zL+|s8w}sc#m6es3_$08~hR)(x+7J-wSpW>}5OdgBn`)jBbzFf@-hRz|n`ncJfH*bB zNPekaoObmB<0!l?g+n7RN9IcyleG1Gy_uGZK%Udy_Uh*p8|>cBM)`oD5kQ4e9a>e+ zc2hR-2?=*cI9b${Pc;RWi9&dH=J+?p6TQAR4As5O-@o7QEiYgk3c4)N^~42)XRd{= zHVS4q4xqpA+QTS_pnd`1X%j%f-BS6NGL(`&I8A*Zi@dH=k}Bb_Ve)N8>Z?CO`gFyq z+ifUonnwouv6>^CA(U)Nffd}wjiz*~B^E!v{%MHHx%#eB4lg@MS5&74HbtX5gPz=< z5UWZ)yP8^AS}K4^bTq&gh@VXHwj3%+qxc8_w%Vn^!NIOSPZgHk=|$O_nwiOU$l_>Q0X zHp}pk`!rX(ovm%po)+Q}?|TiMfE`)HP`iAjm2a71vpr|={|B~c@bhD#kU3jHSEhiEWeF6`~<;#o4eu2m=n z9XMfU4eV`%E`ENSa zndu_tEGd{tDM);=$3cX)gV6%NrZ8hr_lS$(;_8;BmgTL2HH4%5N`3MzviFf|(6qnXvan^BaI z;oh^j8EdI23ul(`#Lt>ZR!A=Y!&@^)t0=ut#W?rDO+mrf_6h1Lk49j(<`+WWEnH{9 zYcve@Hyg7QEF!cr=y*1{)jghm%#CqPSB2{CE?U#f@iPo_rK9d`-mQsH#2P?|*n_Xq#m3IFe<$j@A9)yf*Ckp%@ z=GLv`W>Q)y^FTUiSmChTp4&Y*Xhu(VDCyRFOJh#))mht`P$JUO~?isCx zMR{z`A8RUJ54k(c$?UCJ<+RSaH4GtP%32p^=W7kiBNZ`FCRVD{y4pAgyu{EWLOlr+&3->(kc-mwJJ(h`229JTPm0dv(Ir@XP0?wpE$k2!z(= zIuwk03%vVD!?H?*qkq}zaVFMR9?e4Z#jT`HXjIi~f^nTVZNa<~$lQf(KSWmv8gzt? zj*fm(I^7cAioH^>@VsY!c{%3Sg7{xr;}*X*N~;^#al(IkPA}KiH2aJqsr)IYU#^(P zAmYnAfW?GwU|ETNeawnlo@LMR-1~@(C-H(-2Dt;7IL+NHwo@E1Zf?4tzW*vYcmKOg zqO}kY7foWxpOY!nO?v<+!|r+T@|+wV)JB$_*AjmhS%rzRj(Nu><1X!wP4l?w|DY0& zVjoODuqC|eg65dIaaTEXFZeu09{1pUn&VW!t5>g5ThnHV9-vV9KGs>qY^KAmSGCr* z*up*bG<+f;Q^+`f3b%}Vc~ffzN2`eam?vh6+iB0)_TX}U%`6^;(B0s=tJ173Cvh@$ zmgqG?)`HP#7rrGuGRbq{zTjGIuB4TwX`t|59)y3V&UliM5xs7DiEHn+C7n{HVqy?- z@SutODPJ#7vQX!V>8a64iM_Tj%5-eFmHw0A<}>v2q0BNc7!)@p;UqEu&f=A>MAMHY zEr6BbAeuJ9WIKoLC_DLjazBd;(eCr!g>q{Jfp;`!IeO5#c{Bi%3|Mv;J~)gbXla1LRl= zr^P~Do#XH06F2JY^0{LW)QhUU!Z#3=bm6 z$Vi#%LWoKCCByj2YnuUvmjxWo9132OhO`S3+TmCG;Uo-BLAH8l-=h)`OA(Q-0*ATp z)Ma3#zW*KM@HNRjFyn#yKl8-LJaBeMT)rl zC&T=n81rAm$g4yaMst-{R7CIqR}pG#<*}-|w0#v=v-eMHuBN7@mTA`YPliWVVZJGs zO=QfHhEuCQwdt%mfA^|6_sKe1GGBVb9zq)^zN9=q3rPqL#7?k}iXaI=;yOGoU5cZ#2`>ZF7p5VkYlM%pFPWZ<;oR&UYM7cHwoxi%08#9B|U3E z9ZfbzaWrkt_eTJr>J}*s4q6s|pn@^jKf_-Dj?xITyV;Z|WOFYP5P)nTd&$vWJ|Nzt zd*TGF9(4^5i@vw}*P2+~0z!k42*7V8koa^Ng0v(b#0v-9)vX^#Q+XHu^lEHY7c7M%{5e2GRaZtQ^^ zDg7aEP(bqu$-%k8aa}d{rD-MHMYnSA^4}JV?rfU?;zsU3`R9KYq2!2K&?tbGOA96T z0%l4|@s|fuKl4~M4vSVJ9?!i?2T0XiEmp~=>DvEZsI`IN-=Ut4hUDu!YmL#ZL3(ZL zjnT_j#8V8f{ad^&)4-y#hyef*b;9mB_0C_qe7SpGDM>iWMSN)0bvv2t1l>m~y${vteWix;sYgj;XNBu_$x;i^m5O3a>mO6Z$KY8Lr*Zk!J zNH-(!d|2?Q#(Gu{aPvpKRb=1*!3)5SLdq zcf`a}kd1=qFX`vYpn;fN9$2l^MgT6u*BQ^5NsSbn_p<_~BC74gdyt`q?Bx7+I$vNG z8pMw)!%La1^!4?PYeI84bxLyP%y+*H@$aJ=HomFDEOt|T799vyA-6pj`KmewncyG7Lib)?M#*FO)Nf%hQ^4R^zL>wUG&}VR0%ft0%Yz4w7u7STvt~$_w<=FLFjd>e^nN~XcO&h*Y1`m-=Nn*>?r5j zu`vKE*muPb{IP)K$u;VHcNg+!4}>!7{V3VG%s)hdg3+*Z441yrg&Vqp(7x z$Ud6lC*t0`MH>L(>VBkq>V^|`-`ghPrdEanQnkxmJy$yl5T?coLT{&SIUdrQb4O!QiQy#+^|a6ZvizT;(b zqK{xZYWM7yN5$TH8hxd>Q)2eEqC%v~9odyOfvp72kaSq9u0hw#L0EpHuXe5Sr@VN~ z(f#W)9TD%PL)5WV(1XYE?wAjsa`P4nF)@hjml0~r`)|Awk@rcrPdej5P zU&mx$AZ%g{_t?Ha6ftels4g!rzqA7)LdHxCrxxQ26VjOWk?T30y3dfm*>W>8tibwV zq^6ue>iGA!cbb5qMfjYfpMF$>Ps8gsohsci!eSB*OS)io!EH?M*FR(w0@;rG135-m z!O2FDhJzXux6|$h(pQ*L(ITYkcH!=-!}*k0a}_m0)4@TdqwX>ac}9ja%LQPDji7ru zUUrLv#gqShc@rfjRlPfxO@8@w{hT&&s_sGRaWrOX_z|aG0$dqVG&s`(R2`dF0TtQD z37c5_J9zxQ(N5+mLQuz)1qsLoapA%umwWRS36O%+edI}yuiDD*V1V7Or19Im%x{rN z+p?dY`(h+mMNUcudW`NTEgt0NIx%JE#a?l`paW8@8~n)PhD8FI_oP0P;7nXv1!lPV?1+~4b^VwdySH`=FgtV09CK=@rx>2 z@B%nU2o@20>=)+k3Gf`QaNsKQz_~A##ZH7NvU;ri^TpQ&AsPzk>X|-LA)0FI3n1Nq z^kCoCNMx)bmTj-lxTWh#`-Gx&^%(#gpn5DGGqqX7S3BfUC&94rY>UmZOD z6Ji}F0x8@+3_l>Ezz0WNKQYJxk0drfMYE5-J@H?H4e!IrqC5{V_Z7~vVP^rM9>?p5 zQj9^Ni{(&c_?Prt;D;o1Wd}X5d``B@S^qG@z{vZ-f|wWp%v}@lN?ho0ALhncTtCgaB)={mg$sMdx6It1kd^ zOKxy8*>kwksmOW+EGPnnLQMiLQx??SoEJcuk@tZ#h`dBZKozFQBmS0{+OGh)Y&}{5 zkP$kcVzMKCIs)*r3hXd^kr{C2t-cdtVq#Dq0u)gye(tFG{rcMbuPng@!Uqc8c*(bv zoPhv>$i_wh1x@@R1L_gZkYg^J;f)h=SQ`E`2NDNKILNK?&3@4;`zqde$q@iA>y6pY z<{I#*P@X3!r@!L~ycQxKb0clWVR4WzR~Y1aKuyUo93cZnA2XXKYAfCl#qKL*A}6Tn zgMvrb`t|GA%Vw;`s*{rS3yqqN%sK3%KC^Uz->LF@7nA3~tZ^4Y0Zz`CF{Bw0g-S=s zDS-Dp@{Z_PcaP$aO@<1ACl3z2mWZd5d2?WfNoVmIR=oGfnt=E1nJh3huOMLES4R_V zxItP@Q*)i#uZ<5cXL*=K!CynGexOWL2x54=G2@V;+ci6o_A97NyHJ z-p*3dArKqT_}~v2sF*9x&)NFExY({WnNBqe8bgevado000)*R#-ms@EyH6@`Tjd(!$Iy_n#egYuc^)qMAG=2a6J$4=NceF*>JNUgnuqX68 z17}*g$f+3$B|jL05Uy3I%+k=Gt0R!Egeti?G*DDkB_{OZANXMDI0P^u{Szg)VfO$hAFp+}4uCA^&s`Wm@RR8M6Azp^W zNOPPyndjbK2k52Qa%G+2ZsMJ&^P`MCoB0R8X8n#EJ_I7qGz&XUL3wpK@zYCqzBq|!1{nSu|7t8;NfPQ1Nl30EgHe94=Py`zVo1HqHRM& z)?xt}$Zv0v5XzRhY(3w-du1Zm&~NTXU40TlwW*|}q3v^divx;r z5XTr`h6ANm`n$$%0Kg2dCnY5zcR=E;9?SDM>oL5*yXH0i&)qLD}4dil+tstJJ822nTQ$8DUkz<-x1-vISI&<_#V(jNY1 zV2b*vHMGkS(zvcMmUV9mnp$C4OvOgxZqZjoC+>!5u<5lY%_+2}EXq9}bB;W{A#o8H z$AM)JD=a}m&CL?`Oo9>?iY#rhvop|l(S$y z@te&=dDaCXzl>m0bEogby$NuG7zGgFjpU3qpIZhj{|igm^XL)I4J5 z$%)p2`4nC8LhIee;;*t0ANgaQqT*`9%`h_-E0*NIfv6o&i*5os(Up{7GF0b^k;k)s zBr;jYnZ5Pgf(7WEtR($!(aMADdc{cy^bPpFoPIB_5ZlI7|1N~CpAJoPOF)2fA4owS zwL>v*b1%|H+$@fA4U0Jm7(^11E-HITx_{+Wi07>;2F59xQEbr^K~uLIhPDm>5V=H( z%pvg)V6Eh3JG;^AfgqiH+K@kPa-j}@d3DA9hMC~eDxu|>Hqd0W+dmVO4>-jo!f!XmXV#;+fV&UJ zvy3SfZcAfsx=?e-NV4>J#y_j78^l=)Tcz(};vNIaE9<7Hi~0}|6(TW=+BvEL)Iqz} zE9@8JQ634{O{a0C76_Lk{R+<7PmHH=At2SdkN$}HG z@lRnXy4=xy?`@S+c*tBl1AnzM1ZPrm7=9}o*kTG9xXheQ@4*JNFqyK^xq9DK?gbvC zSx}5ofg1>RzNx?thW&m-8%Kmv2UGDBfCkUz0>DLV9Ic;1Q}M7K24Or1vtxyEFZ{3( zb!v5?&`STI$<4)VWB__6qYOdw4YFXQ!eOS*)Y3Akzzqr{lNLV_2Oho7DZmXVrZZ@5 z^jcyUww5I#$Fa#(i@@cNrKD_}{k>?K6E{ezhYN>a048x5B7oGg?huyY%=LflKFm?# zz5Ll>`H?jaiy5}zZeU7Kz=Bkne5TL|hTdB4$fdOAah>7>vTu(675#wxdfs{hKzjq! z38yVIlea)MH0vgy%{WJXh>qIU>4aEhjj#g_#&GV8K7%<(z-3icRgK?#We0>x(KuQj ztO*}WfiUqzYpN`Hf-61dQL5es=j%lIyQ(OJ8sylhp!>>HlXzT#Fys<{7siv< z=M$`u`umvTTg4$t0Ha6p-0rG5ig;uM*ui{VHDKR(EQJRYwr?0ATt!AUtAC)R_^&}$ znCfvGckmqm9=2~N_8|*c!vU}Zs2QJv%Hm!h1!yCGfy#|6Eksn7j$9psT{OJ5XX@E^slJxH-$!B zC#y)WcD>*PkqZz0@Un!+;EnvF#Zg=}HD&kazt6g>=4mXt21S*p2a2ToI|7S=b_60Z za4C4rhAQAzn)QCPhEAX!2u!L|4v0DZi}I}k3j%;6$8xPJO!GLWU4(u0G{ z^4M2CUm!^6s0R;a4&_>hnn?m^0p`%%7)aCyrrTBXDFlnxMQCRHDIQM5_}k|HH4%RG zkb#*(Df++EngMpW`HbO%;^R~WpUEjbaR;=n=$O_lqr3kV3G)kyH*7m={70ZA@Ff9K zPzQI-9!GJAJV4{^{(r9iYu`X?@WH>>{nxI_A!j@Zzz_R(S~5lG572`Ien8tI_<`C_ z2?+LYX6%3R>t+T4bQ=KtfPP8v1KJP&{c8F*(4@8onk}IYQpU%BRDv907!_bs9PMn8 z(rMY-+4-}VpGQzob8D415yTEwkSCa;Ax@>ojo*EX{1nvr2KcjZ(30QN6Ag+rnROl6 z8u_0(ZW-n!51I&DYNJqo>wxx<&jSfVpC3AOn9`T7 zt3h;q7nh|%FeqKI1YEc-H^fDeEP4T?#>x3>}79(B)TE_@feGCVU06a;ne5G9C z7JNm7Ki%yD*Q3Nl36E+uOX$W0RLwLThhg=(9#v`Dbuuv*r1CV&WerNu86xlG=3BQR2*Fs z0AOSfZIin1A~QDPWj>yx6$}N1CN>Z|m7!i%Itdq)#nnM(Y)v6*03GQXxaXEO>zyX|1xkXAt2)#x!fBl$GcXxM$zqxNCX!(5VHdG02 zK}5AVrb)z;bwBgL*KT9{=0M@L{*!W_y|H5ee=jNy>7pJtX!5~Qn`^OqXefbJ)bXZ+ z?+Vm^Wp%0LX5iCw1BOwuIx)70(n1ojVm9jp!HaiF;P7-#SQw|$)K#~ht1T<<9KXhk z5&CkW0Q6CwZ`n(*s+OIXE>sIygz~HAZj5N*t})FY+z6CkM!-w)QO8O0rrU`j{lmtr z#Ee#%1`zFL0nu)og>`6<#@ivp=_isOmZ0LAgg1M{Z=){od!tNKnBC&(`|F14m#fiv zws$_JcZnm!J}+=f!k=ow$FuHLTAzvNczz4vSR>=R#_Cj0IsaMQHaB}&U5pIr(*I-aOgLJF+xx-f$ zDzfQ_jVe)orK~S2Pg@~L8`;i>QlrBC?o^h9aP2rcM+fCT0*UL=nX7Wq)KVsa!mDX9 ziWEVssenmIdsc&VjWe;Nul?98cYU!4@F~Ogp8;uq$%Wi%b+?pmh|R@WZP8Vf*>|0L z`g3dD=Q#y6pZw3^Rih!RjZQ{eA6ew1dyLVo8)DgXz}D^NvfK)*sm?LaSGkQ3EPLS4 z8|Z7*rLPOme2F(h8#(DC481&CKY9`u#MjOWTzOKcbw7yioZy~f(=4fM!Ml5?dy~o@ zyQ<)-N#7GgyD*-b(fl+wgC%KxQ?B~(ddG>_;pp7T2h%&Ul*P)?k2NBCEP`bsc_I}5 zqQj&czC&va+Z6h+1DO#Utu68<2?GmXMTvWh-Ae+!+M`1=Jz1*AogY@0iptbCVX%o} zIO}L5V8S>R*(a83u)F3X4a%plhS(G|cdumZZ8G8)hPz@# zItqvpR?t#vOiyfNO|%B?>P#yIw-Kif#tg0Wmuy~xao^*)T(2Je_F1=Oil(zb^+4ed zDPuh!kHSStt2aE{0i_J9&Jx~wcO}X4x4}g74#t^%FPW5cRcay1C!GTlI% zEzoe)ELGsA(JQlJ_690%s2NnI-|_(|@74G?)?pkrhWnh!Lbb=)qGdxc28<1XQ6I+{ zY(*X0?g_eX_G+Y!-ir2AxC3YWoADXrXZP(NKDS8yxjsS{eK=rYuqkro@_9Y@c&jiAmMtDVq}joum%DK_+dLgi zyZ3X69@Hl#u$iSeUkuIq)S))lBag1D5>glScV$SZxJdd;YwU(nk2vDmpHA6ieQ!J! zGV<%5&v6UnE4Va~h0>f4)g<`kOMG zb<3Cz%{Qqynh&<0{8&RrmPO|&e?2W_Xn~P3tmRY70=Ny;jmwBd^X%phJRAQZqkCE2 zZ6-`{oU2+4uA^aj%S^3@7C&@Sa#I+p01c6ohe-QZqL zbC4I03+2TLMbbu@9p4{e#)E7u>Wu*cdfdyLDDSMOh3kW}E-L(iwBrw-Pkh4@uu4Km(}1(3(Gn7T5BZll~aJS25a=2FASoQju=UK51NbtuNAuY&-PNq za@Q2f0Qt%B;RXF!3Csp1VO(8|(+@eXR$#LYGyMQp447u}nrx$nPkL)ZdK;OkKR9|56 z_Uo}hgA@vA>eCO3Era5Sm43%~`mM>&xVjVsiLb@FCMJ6il4X;(`8Sc!A+$|bJ5 zjRL)xO1y5K^BaFo-V>?X2BGJ&;cF`Bz76>4mBu2LdVZf}(TQKgV~Z#Wh*tHZ6E z9_TXn&xE_rx5O~t6zXV*S`~i9%iHbv8oKQ4>DkK89mC|U^KEjBT8Dm(T)q~<&oCHo z`|L|si1%MxK=9VM?LR8Y-9G_^E#WfGK3o1|TKtpX7r{Ol|KAs<4{-cGJcq;osQ(9$ z%*cPBOI@IOFP@*?^+@L)a{5ou&Gcbs{oN8&y#nlah>Kog$oz*WaAR796ih|Lqw^Vb zniT>P#0b=On3@5>908SPa-mx1HnY-vaIl=*)7l-FH4F0-)(-rP@7*}8Fg|o zz}Fj4qnoNz=H2}UnTxfxU@!ur2M;7+g{9}Y^_kv-9v86^TV&U;bDUA4h{N-`RY%qE zDpOJ#M3sw!B2hS|lDgzLep?g~q>Z2%g`=TRh=$?(&yJQn@&<5+GnrP*`P15Rl88ee zGi=qHHO~dL5I1`aTKZKE0H#gHB|NZu(_A#DP%i)zg)N<6nO43fmc8&%=d>9 zxPvFdG7buhOzn!doS;s_wkvV|o^^DviR)h~UQX0cf@|pSD8Tc?MkN%oI8Zp~BKFu$ z3<}izGN(!^Lne;}*F1ULj!|$t0qu;}g}@C4WBRcC>Rq!3mtm0l5~splahNSr19~gr zwSjUw^EM)$(Hk?xf5`9|%%EaTC?qBZ3Je)3_opCFAbpCqt)T@zenv-klB zKvPB>xGtN1C!zj5)ELOmPXX0e`5fp&Ll|Iy<8-f&=QEc&cmc+0Z*t)FF~47$%~6Od zrQ8KBXu+}-w59C7Akzumo(%~aSOEEw3txZB^s9xj8jrfw*o)y!O;Q}Hy^OHcFhAwDQlZM!bGr73QA2mT;3!Bw2$4{O<)Wt5|LSp$6_YD*n1mo3c`5P9AFUYyjV) zGH}qMLKF;IR5-7JEE^7gdW_r2r7{Rxc%( + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.components + +import org.isoron.platform.gui.* +import org.isoron.platform.time.* +import kotlin.math.* + +class BarChart(var theme: Theme, + var dateFormatter: LocalDateFormatter) : Component { + + // Data + var series = mutableListOf>() + var colors = mutableListOf() + var axis = listOf() + + // Style + var paddingTop = 20.0 + var paddingLeft = 5.0 + var paddingRight = 5.0 + var footerHeight = 40.0 + var barGroupMargin = 4.0 + var barMargin = 4.0 + var barWidth = 20.0 + var nGridlines = 6 + var backgroundColor = theme.cardBackgroundColor + + override fun draw(canvas: Canvas) { + val width = canvas.getWidth() + val height = canvas.getHeight() + + val n = series.size + val barGroupWidth = 2 * barGroupMargin + n * (barWidth + 2 * barMargin) + val safeWidth = width - paddingLeft - paddingRight + val nColumns = floor((safeWidth) / barGroupWidth).toInt() + val marginLeft = (safeWidth - nColumns * barGroupWidth) / 2 + val maxBarHeight = height - footerHeight - paddingTop + var maxValue = series.map { it.max()!! }.max()!! + maxValue = max(maxValue, 1.0) + + canvas.setColor(backgroundColor) + canvas.fillRect(0.0, 0.0, width, height) + + fun barGroupOffset(c: Int) = marginLeft + paddingLeft + + (nColumns - c - 1) * barGroupWidth + + fun barOffset(c: Int, s: Int) = barGroupOffset(c) + + barGroupMargin + + s * (barWidth + 2 * barMargin) + + barMargin + + fun drawColumn(s: Int, c: Int) { + val value = if (c < series[s].size) series[s][c] else 0.0 + val perc = value / maxValue + val barColorPerc = if (n > 1) 1.0 else round(perc / 0.20) * 0.20 + val barColor = theme.lowContrastTextColor.blendWith(colors[s], + barColorPerc) + val barHeight = round(maxBarHeight * perc) + val x = barOffset(c, s) + val y = height - footerHeight - barHeight + canvas.setColor(barColor) + val r = round(barWidth * 0.33) + canvas.fillRect(x, y + r, barWidth, barHeight - r) + canvas.fillRect(x + r, y, barWidth - 2 * r, r) + canvas.fillCircle(x + r, y + r, r) + canvas.fillCircle(x + barWidth - r, y + r, r) + canvas.setFontSize(theme.smallTextSize) + canvas.setTextAlign(TextAlign.CENTER) + canvas.setColor(backgroundColor) + canvas.fillRect(x - barMargin, + y - theme.smallTextSize * 1.25, + barWidth + 2 * barMargin, + theme.smallTextSize * 1.0) + canvas.setColor(theme.mediumContrastTextColor) + canvas.drawText(value.toShortString(), + x + barWidth / 2, + y - theme.smallTextSize * 0.80) + } + + fun drawSeries(s: Int) { + for (c in 0 until nColumns) drawColumn(s, c) + } + + fun drawMajorGrid() { + canvas.setStrokeWidth(1.0) + if (n > 1) { + canvas.setColor(backgroundColor.blendWith( + theme.lowContrastTextColor, + 0.5)) + for (c in 0 until nColumns - 1) { + val x = barGroupOffset(c) + canvas.drawLine(x, paddingTop, x, paddingTop + maxBarHeight) + } + } + for (k in 1 until nGridlines) { + val pct = 1.0 - (k.toDouble() / (nGridlines - 1)) + val y = paddingTop + maxBarHeight * pct + canvas.setColor(theme.lowContrastTextColor) + canvas.drawLine(0.0, y, width, y) + } + } + + fun drawFooter() { + val y = paddingTop + maxBarHeight + canvas.setColor(backgroundColor) + canvas.fillRect(0.0, y, width, height - y) + canvas.setColor(theme.lowContrastTextColor) + canvas.drawLine(0.0, y, width, y) + canvas.setColor(theme.mediumContrastTextColor) + canvas.setTextAlign(TextAlign.CENTER) + var prevMonth = -1 + var prevYear = -1 + val isLargeInterval = (axis[0].distanceTo(axis[1]) > 300) + + for (c in 0 until nColumns) { + val x = barGroupOffset(nColumns - c - 1) + val date = axis[nColumns - c - 1] + if(isLargeInterval) { + canvas.drawText(date.year.toString(), + x + barGroupWidth / 2, + y + theme.smallTextSize * 1.0) + } else { + if (date.month != prevMonth) { + canvas.drawText(dateFormatter.shortMonthName(date), + x + barGroupWidth / 2, + y + theme.smallTextSize * 1.0) + } else { + canvas.drawText(date.day.toString(), + x + barGroupWidth / 2, + y + theme.smallTextSize * 1.0) + } + if (date.year != prevYear) { + canvas.drawText(date.year.toString(), + x + barGroupWidth / 2, + y + theme.smallTextSize * 2.3) + } + } + prevMonth = date.month + prevYear = date.year + } + } + + drawMajorGrid() + for (k in 0 until n) drawSeries(k) + drawFooter() + } +} diff --git a/core/src/main/common/org/isoron/uhabits/components/CalendarChart.kt b/core/src/main/common/org/isoron/uhabits/components/CalendarChart.kt index 02ba821c1..20594df19 100644 --- a/core/src/main/common/org/isoron/uhabits/components/CalendarChart.kt +++ b/core/src/main/common/org/isoron/uhabits/components/CalendarChart.kt @@ -33,9 +33,7 @@ class CalendarChart(var today: LocalDate, var squareSpacing = 1.0 var series = listOf() var scrollPosition = 0 - private var squareSize = 0.0 - private var fontSize = 0.0 override fun draw(canvas: Canvas) { val width = canvas.getWidth() diff --git a/core/src/test/common/org/isoron/uhabits/BaseViewTest.kt b/core/src/test/common/org/isoron/uhabits/BaseViewTest.kt index 8ba9d83a7..c548614d7 100644 --- a/core/src/test/common/org/isoron/uhabits/BaseViewTest.kt +++ b/core/src/test/common/org/isoron/uhabits/BaseViewTest.kt @@ -58,7 +58,7 @@ open class BaseViewTest { } } else { actualImage.export(failedActualPath) - fail("Expected image file is missing.") + fail("Expected image file is missing. Actual image: $failedActualPath") } } } \ No newline at end of file diff --git a/core/src/test/common/org/isoron/uhabits/components/BarChartTest.kt b/core/src/test/common/org/isoron/uhabits/components/BarChartTest.kt new file mode 100644 index 000000000..9017f41cf --- /dev/null +++ b/core/src/test/common/org/isoron/uhabits/components/BarChartTest.kt @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2016-2019 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.components + +import org.isoron.* +import org.isoron.platform.time.* +import org.isoron.uhabits.* +import kotlin.test.* + +class BarChartTest : BaseViewTest() { + val base = "components/BarChart" + val today = LocalDate(2015, 1, 25) + val dailyAxis = (0..100).map { today.minus(it) } + val weeklyAxis = (0..100).map { today.minus(it * 7) } + val monthlyAxis = (0..100).map { today.minus(it * 30) } + val yearlyAxis = (0..100).map { today.minus(it * 365) } + val fmt = DependencyResolver.getDateFormatter(Locale.US) + val component = BarChart(theme, fmt) + + val series1 = listOf(200.0, 80.0, 150.0, 437.0, 50.0, 80.0, 420.0, + 350.0, 100.0, 375.0, 300.0, 50.0, 60.0, 350.0, + 125.0) + + val series2 = listOf(300.0, 500.0, 280.0, 50.0, 425.0, 300.0, 150.0, + 10.0, 50.0, 200.0, 230.0, 20.0, 60.0, 34.0, 100.0) + + init { + component.axis = dailyAxis + component.series.add(series1) + component.colors.add(theme.color(1)) + } + + @Test + fun testDraw() = asyncTest { + assertRenders(400, 200, "$base/base.png", component) + } + + @Test + fun testDrawWeeklyAxis() = asyncTest { + component.axis = weeklyAxis + assertRenders(400, 200, "$base/axis-weekly.png", component) + } + + @Test + fun testDrawMonthlyAxis() = asyncTest { + component.axis = monthlyAxis + assertRenders(400, 200, "$base/axis-monthly.png", component) + } + + @Test + fun testDrawYearlyAxis() = asyncTest { + component.axis = yearlyAxis + assertRenders(400, 200, "$base/axis-yearly.png", component) + } + + @Test + fun testDrawTwoSeries() = asyncTest { + component.series.add(series2) + component.colors.add(theme.color(3)) + assertRenders(400, 200, "$base/2-series.png", component) + } +} \ No newline at end of file diff --git a/ios/Application/Frontend/DetailScreenController.swift b/ios/Application/Frontend/DetailScreenController.swift index a5ebdb413..c9473c337 100644 --- a/ios/Application/Frontend/DetailScreenController.swift +++ b/ios/Application/Frontend/DetailScreenController.swift @@ -42,9 +42,32 @@ class DetailScreenController : UITableViewController { self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(self.onEditHabitClicked)) + cells.append(buildBarChartCell()) cells.append(buildHistoryChartCell()) } + func buildBarChartCell() -> UITableViewCell { + let today = LocalDate(year: 2019, month: 3, day: 15) + let axis = (0...365).map { today.minus(days: $0) } + let component = BarChart(theme: theme, + dateFormatter: IosLocalDateFormatter()) + component.axis = axis + let cell = UITableViewCell() + let view = ComponentView(frame: cell.frame, component: component) + for k in 0...0 { + var series = [KotlinDouble]() + for _ in 1...365 { + series.append(KotlinDouble(value: Double.random(in: 0...5000))) + } + component.series.add(series) + let color = (self.habit.color.index + Int32(k * 3)) % 16 + component.colors.add(theme.color(paletteIndex: color)) + } + view.autoresizingMask = [.flexibleWidth, .flexibleHeight] + cell.contentView.addSubview(view) + return cell + } + func buildHistoryChartCell() -> UITableViewCell { let component = CalendarChart(today: LocalDate(year: 2019, month: 3, day: 15), color: color,