From a1f0b19d791a440fb5acac3f18021e063f898d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Sun, 11 Dec 2022 17:17:31 +0100 Subject: [PATCH] Add a "draw random fixed graph" activity --- android/gradle.properties | 4 +- assets/menu/graph.png | Bin 0 -> 16600 bytes icons/build_application_icons.sh | 1 + icons/menu_graph.svg | 2 + lib/main.dart | 9 ++++- lib/painters/graph_painter.dart | 42 ++++++++++++++++++++ lib/screens/demo.dart | 2 + lib/screens/graph.dart | 64 +++++++++++++++++++++++++++++++ lib/screens/home.dart | 5 ++- 9 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 assets/menu/graph.png create mode 100644 icons/menu_graph.svg create mode 100644 lib/painters/graph_painter.dart create mode 100644 lib/screens/graph.dart diff --git a/android/gradle.properties b/android/gradle.properties index a6742fa..53f7ea2 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -app.versionName=1.0.17 -app.versionCode=18 +app.versionName=1.0.18 +app.versionCode=19 diff --git a/assets/menu/graph.png b/assets/menu/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c2224c4ffd3fbe14013888af9fb706ce56c7603f GIT binary patch literal 16600 zcmeAS@N?(olHy`uVBq!ia0y~yU^oE6983%h40rea4q#wl;4JWnEM{PkJ_W*zaw{i@ zGcYhnmbgZg1m~xflqVLYGL)B>>t*I;7bhncr0V4trO$q6BgMerkm~8;7*cWT?OgVn ztIw|fUthBRdt3sunM86k<Lp#}>hlwPXE7*x3U4Z(z0C9TvfNANzW2>C-Mrm4pHNfr z<zPG%m*(Gm^9Gy0!M*Bx+JEO;tJr#<U;Ntl-;2ln6HA|FNB=51_rCnxM3ouqbgxe{ z(>b)&xgd8Z+l8%5r5T>cC-nJ$`Pup>a?>~VQ%A&do8Mfk*PXd>y~8`T74x6O-}ry+ zj4|(4Q?oz$QijL=pPtVad-ejyrkqI!(;0eoR>a>5_qo+oyjxc1=GW(|wI8^A_S?E? zHPga|H5PW<o08c#@U7)|CHD68>hB)<J3r?9I(RFd!@)rN1N))gxjc-{$B*`MOC9{# zFSM?NK`7<z1kO`+Ok5M%1kdz(3H^C^tAcldp0oQjmLBO|Ia4Of$U;}O$x`hxA9gbJ zFKCmPDcQK-!{df?Gnda1$XH+zA5>YCBbXxP+{gb>>+p+LY#z+5&izf@({_qv#4w)x zdb6>2L7KjWg5V+!F5jk2lexv8ZZ`I^EDQ{nxxJHzGu+c*R}^E=0zuVDa-7cYXM+Vi z1x$=&8W)HzKQS?KS5$Y{tCMXD8WWp#7-qhfa#K1tAtQd`u6l=EzZjTmJT|RxRPMZE z!O|)(ZfIcQ^+_m2LQ0a$bjE8TA10}VAv0J)r5DZ*owq^ZNQZ5chNHnv&s}T*(c&jh zb}4_bFc8|JANeKYg2PPj(91KXgn2lLZt?m0g~?@Rx2Uh3_K}QN5?xkS44FJTllouW zT2!Oyb)6wA_DW#zR1MFl2NO*)T(}%2x$&rU8kqLhE^|@v>+I}sVA5LTt9E7YVVlm7 zhM0}+B3lDgv?MGiOj^hIr0v>9b~zDQ&Ms#^BaulH0$L)guGYM~)~Fz@FFe(L?jxlq z_dKQhr`3xXwnUe!d{}YEVWYc>VNp#bufjf`vQx6El?xxbi#iC2m4<|-D9Ox>Vrjb2 zc-Cg)q1E@atrNAQ-UP-<$hEMz@OZ9ZC^{+^=+HbN+cl^)aC-6;U&bOAS#`a>^I2C4 z*LHBlWqe9HsjxzdWo4$1*Xo5F8zVO5<vU++nz~x3_hh=TP{j;U1&hU&O1&KuRkALg zknEb{QM%UPRT+b(CHJ#qu0kSR0?KMD-FluqH?8uSARF9c8^-R`?a<Wu_kMK4w*y)Z zQL-G**vyhjzOP#$f2V0>qx)kw)sqJU!dn;Ru}pAl_TraobdiwdJQ+VhU-@F=+ZmlJ z*e0gUi(;8n7|J`nNrO#pHN(t;&#p--hm@jPJc10Hc3xDPa4g_?@|9SIBBqB|PG_)O zV(MSCEV0C;Q-?$H!)LAa5w=pB6O2BWa4=o%P&CchBXYz)ZUgJ&f}R3imWz)owtjXF z+|J<Pc-)V9u3U_-v!+i|_r*mQvnJGehfWi$JZzZA<=j*!eN{zbJ%eYIq*S-<in3)! zENeaf?`L3nu9NC|Ha_Z#qq2Zbr^#zQL+;BT8rXMBr8Ko$#k{V1=wA4V>DB%fq6$%_ z9Xht%6PA`UEL`L8F1FYF)UI0g)TNt41H+k~s4#QcOIdaOI;bQN!qxQpV#cRQ3$g_6 z__(re4eL+iFE#L;(dfvxq_-=gd<VCh(=PT+v9m4&=Gq7~zPX)PmCzGY`Bt2JLR%j% zx4m9Wfvrp6<qh-Qxt%;rJ2cdl-iDqEV2@*&)EU<1pvfA@W?3NaHm&{w*95M~9Z4?N z&vm^MRA5}frntH7qCTI3`@;xU4mb8rhZ)PJ6~-?USrC}&D|&I2rt!nKp-cFd@G(1T z3%E9M&VDN}#e;RNK&iqSe*M?w1_FE6r06wCGcIK3wUKap)qbbYxqmM2glF4wq)arN z7tOk*@kL;&;)<h=v)^6#{CO4k<(14QD<q>Da`yCeDb5UJKXhxwE?0$;I_6CYTUPZu zSm>v+@;R;3pBiw*ang!l#!Z(O7d9udw96lwcv2*l_h)5?H1lQI2{Xg5nuPHh2@3yU zy6Jq>+wliSyVjzwXT>e|H<s-4_}-Upc%$;5BZu4ZuZiyj+N}5$B8(18ocuAJ>D+{# zG?O*fZM+pbjPEj@^-5kW8zJcNeH9Pm){h=<F5X(<_T1d1idnSyy_U0tt<fQ_F2Ca^ zU->b4EL-UOlr6_4WrEKOMah*siaaZGD=qi}|JsynWjlICST&Q&A%bz%HMiDv`!1Bf z_gF5wl>Hf7+52-I$_toI_^5Zr<loPnaE^iFu<Nzd4y8^GTbAFI>d__k`htZgTz*x) z5t82`#Uk4HLeN8-HBnSS_$w37q3*<a+@<gN_!4+qc9fU63ft~#Jl>PPCyU{bV`Es# zVu{3`rxVJ3)*Iw5nq9esk7fG8O6RXlSw}7i^4&QwTViwapL61e1mY~OIJ5WpBpo-n zvXMctCga77ha4=`70>OAV#AWFI6i;A@=n4e_1P^Zb^Sj=@-besFRZTd2ygSdl3l8> zrFWI8k)ZB>g?Dq`)CkH3H}cqI2pBDnp71Bt`9-FEo0Wh<K~}DXZCaMbp`1M_!Y|gz zEpvZ8Wu<1%E!o9449{Mg{YC#{;G_QHySFX{g@wh0Mh3<PM}|ko2FG5#a^=E}jQ<<< zXXP?lb1ZuC^l9qG2pb!l+M1d_fBydY^M{$~kMm(CC#Qq%8;&ZylB(GA`RS|V1$XsA zt%dj9^|?_|^<d*co|(6u`AbC{`hv5!1-{()k}Hcvd6n|wvQrwGJ~y4FJN_tPFYDyD z5NVitdiv)B?iZgnZMw8*)he#ZD}DdDiX6SLVZ(_P9v?35_Funm<Hfpt_m~Wg`IB3A zmrs1T$D_ofC!p<2pZ@I^r>$5NmfmA#UgFO`=^{&$qH}H79_zG(UCnzE_AT4>>Cw^R zotDo(7a6Z!ecE~pvjT^cOMge*#=no)j~(TI^Zxm3*OGlar9NLD3C!DU(5BFED?&c2 zzF|w&!m~U}4U8T8XUcV%B&xjl5_vI8;N5fAlw)z}Zi4HS;xx4^>h+YhUmuye=#N?3 z%rN%lFJ{;|PhwN$mlu)~beVngKq<dVf6r-Iquhr)H?N2+Tep4I!f$LIVgeaCev&CY za(9)sIuw32TI$zZe*DX0fgiT3wNCrbwJLda<>01Er<dhzZg^vs6mn_BMNh|rb+1C$ z&Tc<l^)#)SXXf130zPYBPv2_nz?URbpfTkE!%dz}#i+Sa2R+o5i<Pq3OtDZ=Y>GN} z%4X`kea6opWk$YRHobb**=LT;kB|FG%(O5$ms7S<iAC1<qTy37d1GFM=VjIo-=^xZ zohbda^~_TS4)tSO^A0l!<-9DFN?Ecd?MLOOPtTt{d-nMFHyOJvTX*d`Q!-WOp<v?V z<x7|K`G5OnCM+Ag=Mm3SBi$!6Uh>>Lla{+!d-}}i<Ttl@6$-XZxv`jG35%SD+Ck~B zTLhOn9xF=O)Uhg4RCcX5|Cw(S4_o)i-Mn@oAbS^=czpbPP2*#JGv_^e{kqXoUq$5N zmcE%2?6UR<isqfU)pdK>np%b;u5?ia-Qt~1ymJmIG?ct>)Y;qn{6xvsEpr!66MKD8 z*_u!0#)XQ~Ma~IRtZJW0<jWfil}bEK(+zcGxOsRIm#|8k$c8&YSKcyDIP2DFYc@M_ zb8?IL=9gWH#&TUMjDIJsYCo|v^YY8!_OhjGSFO}E|JyX}fWrTu=DxD#ik`-AU2Yu; z78RSE@b*oV<Kqc8udQUr>{zi?K3w3^l`XuVQa$37xt&ZLdreMU>D~11PGn~0#cOBd zpFf{({MTvvz1pgK`zrimob+QXgmt-%b!tNz0^a8IJFk)pDtoQca3J!^p?<YF3!f}q zysWU{%O%OZ9==~rh}d4alyrOh_vg;+*S#mLRX#VTy?y=q{2A;0XY~7bv@h5Haq045 z_qptoQdcfrdM_(CCudb&&WbhpD^{%4-FP#~YK4ep;-`+;Vm==~e_t@IQiCD!mSmsv zt<~$M^QdhyV|>!ZXlC>3h6(H1qjJ0owTUj-`(|Zo_B=b0^3f~sVB6Qz-d>+>uRoH` z$=AorD=8pkq@bZ-Ww4=tdbmK5a{OQK$|+{6u3QL+3!NGtH!(VJVtCM`(7?bOeNRs< zNcexW{Jgi6-0I^3D&-0;6I`Ax;_7tko8Dt^MXh0r#A1UbS?SU|0=686QnG1j8bTSH zqAW@>PS3k*e<SDGw*Tk(cs)DbSZXOLS=!`mi2Py_m~YVPb4B?3qYHBrr_P$4-R*rY zc2|j#{r?@z%eJ*EU0$N8EPluE>S^~SCfX)5Hhfq-DW&;}iBL<A%BE|~OVsp_r}Ij& zYEDs9{kEZHqKc5LNmeSy%hHCaZEbD>6`M9+zFj7DWS*^?%lCOQl2c#3mCRanFZXiF zrJdWCRehXZC24bHLPz|;#e6bNEYoLKe>l|2?CLr*cTJX?TdVDd7ruKJJ69I5cRQb2 zE#cE99Qm5Ds3>`JV6a5asR=h0r|NCF=dskiyid?8{piuw)%7u9v7xtKIm-(O+}(fw z&kMWDd-gh|MrJTK{W5nt^4_}b{Mu_*r_ZzB|M|?!Ew5fp3j5DAFHX+8&bIu_j>aoo zidrRGCM?cU&}r42pDW8Gpi`SOp()J6=(dS*|4gGZuabNDR{ZxWJKNFSsFyPL&(G)o zP0Y==>4kpnl9Cs%E_V6xp{)KB!&A3?>$uBrglpgC;xg)!zdvDi^`@&<naAc_+^#z( zXWI(Xj6ES7H}x#iclOMfnb0x!L=^Lc#W@`p7pv-@nGzUdD>75Sl-FG$?fAXUixUq= zU%nK^^!V|=o2JLV%$z2$U&CNQzWeXoQ>+q4QcpkGlIWWH@1k<{`MJ06ckSoXxtzZA z&c+n3D6J*G%UnJxbn+y2Oaz&~s#@gXn!;w|mRUwdTNi$HJFM(7X-E3^es=yfxkowQ z%9<vgc(9c5-^IBxI}he<U1<KECpjdx_T__xSD&AIR~|0c_~z%I`S0I}OFMdo?s)6; z((%&FX-6e$!?rU9Z7~+9*7)+kRPo9b#g)Awm)|IDJ*$;-f7_!UAJ@K{cWA<cmWL<( zTiR605*a6$ZC_=$q_;COmuu&iFHTXnx(+pc&ilJyrLo)HjVV^Dp`9EW0p}J?TC#VQ zc*`9&j^!+g9gEsEq&i-d9`NPwGH~K@J@m{sevZw~%V%HBzdzx~(!alB`PYP%uTXZD z$m9t;c0^%@(fRkcH$I;I>sMB@eUgLInf!UtEp0NgOM70+aoP6#YpZ5B*|+(0kHfkz zF8jJ(C|>!Xt^cxDAoKO@?X|^kZlrBL7j|Awb8(yf<Hy1m@7@w*sw`A^d`oZh-i9sJ z*G~znf0MX)omuFY-Pboshvqn&X7mV6lxjC=JCpW{WnVSJ$`>D$1x`+Di8h;|yW~uV zxmC>T-Q|A^UR<zxoPI*5N{zSHLhoB!U)`SBS8pkt4D;`A2ov4CGMw`jU&qrJn{9=U zmw)|g`eyrFBiqu0vc@h-2NE=UuAHv=@*=XzoT2FJhJX^D%gt@_I*S*6>X6B1k?vpm z{>Hw)+>h0donL?b#>ILbzOH<IuUWISR%I7uWpQV}=E~0Ie*Id1d&KLtx?j)gZq4!# zaOLm5c{}MNBjfq==BLh||HsHuU2uWngOKuK#pI+f+Fn~9&O3H&74K{NeH9-?7CU`B z^O^r^CuexEm{<#sk&BwqrAxaRCy3RpNs|y<rd71a;f11X@Url<Jp~V+%$ol%b&oyQ zrLe41-EwmOa$A;d+_+}Rmx|0twjVLUw||LAFJSlhv0=l)hYOt#9d56VsOc=uONw3K z%=4XNQSSYF^55Ua`unC|PV<>pf4L;8R`Qq5t2FHnxu>e#c>+dU6KWq^aAliwNTB4- ziR>8*+MM_z^K~?L{&{;UyeFLdaZ<k2v@a_ZW<;O&4X$*2*!QO?_o-<5ZQJ{dGpfEx z++BWs$%+#n9qwMfH1l1<49S;UZWk5x<;VO_&CQ)UZR^=*na0b`&#*lj>e14&dG}4O zD$Y7l`A8Ek0jJJT{XY_6u57zD_?g}fxc}#D*K}>|^%5e>Je}n{Bnqlu`>oaSW}RO4 z>{+gkp5?7wT=RCTxPFrn7OyVu?-1<RBqn)%(yG5Y;SQTTdm|&=yY-%X1bJ7u9J%mh zp`s#VivN`bj{-XnHcxO3=aghR5%+uJqmBhUGjqcx9v28(o0e{}Tu$iPno51^*BcJz zz352vKmKj+I??Arlh*ufy?uV(|5e+zE%^L4A|Rn&z%+SL`mD2Yvs4!G9zJ~7w(4-p zmN`qqQ<q&#zSzXOtmR4x+w~S6#+HUhHXp-`&HohKv0JOwBKdEz`?e)ZYjZbjG|f8l z{<qutBKf(~-f-K`JO7Js$=Y?LU*qBwJ2}gbecK%;q8rk7=0w6Cv(r9?&lfF`&pa{b zD7TYXignnGXUt2=_Pz0m@C*}(?9De{)TQFZ&bvljT)cMkBh}=`HHSO|s(+m=|2`*H z)2`;tkxhD?R=XB6{=4YuEZ5T|({8lH{Irj}no5<Rn+U&9@|W$8?;6@UtoxAQx@B`W z+v=HObqOnvoXMUPxx86zo5^YI{gq3Xs9Znc$nJh8_U`2i0Y!hFRJTsQ<a4)(aaBge zr^$_swJQ$W9x+ffoUyP~Y1_4l28GS6iVi%pj&8{h{A(kx;Pqf*kg34Dod(N~75;u9 zaAIMz^tU%ZubtTV?*98Kh1xq-wg(brEx)y0jmm#@jQfJ~1N&nQ|I97c?MpaoBy4$F zw%+fVQFreZhf{7UB9creH0M7&z}%T?RR8j1R{5QMD%V1;*L?i>*{!C!zavoi_};8L z8<~$zF8uWOP4{Zw@RLkAQKwF%|EXzqDf1VR^)P*O-g45-rpDCbE37#M1x0Cwd=3#k z2V-Y!a#cR#HT`PVsmG}%zrXRmwznwHlmGtU*DtqoGd`_bp1$DV<iPOwk_Q*!wY1L9 zUbpJ#X>ASDr~H9|hrhOSuACdV>hLAQFt0a_hlQTp+d6mSk0XpHO806W;#yQ!QX|<i zWoq)N6C6|K&;R?kKK|)9?z4-YPw~ueWl@)~;hh>9x%<2A^(!G)pSkV2d0zk2{q^My z_3|4YC4Ssq@uMoD=0KU}CbR8V8qPZ;T)i5*YW4n@;An<xw-+a+NSZ!cx#PynU$%kD zH@i5@#G=HMZNz(Iy{6Vqo5VTcQuT4hO<iUd-3zBo=#pOTV035S)vTzGUr#SxT6rgV zmd%%mKX$OP`8!1ZJZbwoJ|{Et>(#SP87CHWd`NtttW(m_n&V<{wJP&w=cZ4WU5~Oe zhUOm3_^`lw^5l0dO#;j3yK*{-oaFJ&)Qa}Y&|t9q{aL5ML~YFmwo45cx_y>BI+n8a zm_XC48HF|1zr8)Zv)xFk=E#zd{{>i_ZNEL5r2L!j&&{mtvv*1Y5^_rBOJ3Z&{O7N4 zIn@d)*PPPP@X_9}W%0UoQ_EFei5n}Io(UG?Kj`zmXHnO2C*!bJd}7m{A9854*~1%~ z&alPm;xSf^dwi~HKKy~A=DL44=GXqJDJ?a;KJUz|e;eoLFFELS{vLBZ%dMMtCoo@m zy`aT4aiR0=*vlt2#gwGhr+xdby7YL|$G3YI1*!YjFeZ5%pFi1=<LXh9yUlJ=TRu3m za_rgiWSMbE!@eJe7u&j1)f~dQeqD4}Snl-3&o}kOo0-ni=KGG@Hgz(;m$G>wr+j?Z zF17UI>y}4Fy}D!LEX>Zo%UWYYz5D9Nr&hfQPPfzCRdnF3#g+13Ert67xt*#mi?29* z$k!tAqT~V(4U>X`O?OK-^Eu34FXh9?v6P+9%w(-|kW=`bbJN3W{swt^^8LQ?^M}is zc^mH}eS6mb-X#33NA;#{=X$;E|Ng1s^{>*|l%AD7Yt5rcUwVSyhli%_{u=v{`PuTm zx)~?JOnMYzc~Z4aL?S=DVS8@M6)oUUe!plI--YzmZ5a^?42GYi;=~TI3SXUWnG$gB zsPXFX{l{zzlHLFBEMM<==Wb5W=XJK{r%j!2^k!{K<Hv4ccD=-&+R{5pr-Q=2eOEtU z^C)bUuV0jr&d;)_|92X>Bl%rQ3{7u%v>b7K(kIrUBNg}kPEi-zg^d6H;k;J^HU#nP zv1XX~)$O{NsnOpLf3sOxm+xTx=lM9^xTv6CuKsgU-^GXF`s)`ME{=O4Xt*l-wQcBC zaX#6f(V<^mAKy1B{ImJ*Z~p|(G%wo;j9lCbE=kc_!s}~KpZww+(opBo6d|}VXQ_72 zi^|>;Nh=a|6)i0|dcFRM+<Hyn`&|5wS4S<-YRELNNKMc1cyz<C{@X{s_k5<#0v7$L zf2`HZ_a6LfYg6<5e6_K~j`kI+yE{D=Uzt+6Y3jZ^8y~!XaOcPCX#We0QU7X%m>5MW zKIl%6K7NQ_R>8?&>C)Qi^ZptCPGBryaJZ9v>rTwx%HMx`d)v~Cl@3ilzI@-Ku-N6o z)7Eg?r_8B2|KMng;=#Y`W`F1R*Ee3&ZMn%!Nrg{qreec`9M`)=@0qL|80Y^n=VWwJ z{~&QXyNcoF_UN^bmY<%#a_!SOpFXav@9dH}Z@Yk<Z+}q0j>9JwvcI2Z^~?47-RNDn zCxvhL>hbF}o9e{_jh~M%)ob;)(ZA$j(&>CU>`lOvh@J1v7y@|tE_}GiczVD0wuLVo z3_6!sD@UdM_$O5BZ>X<de3idGS$^?>hJBlt)gRewwS0+*a_;&3UYRfRY=a!$2)cSl zpR(-rP5t`SwYOJvQ%-i~%FPiqHnz-r_cZ<eTh;v4%;?FAguNP`ZF%J;$+x;|fA<L( z1_WsO@;jx(EZn7g>)*Ml)%8;gd$=yBGbnIz?TXegh&($bNJVebk+sow_N7_YzZrU^ zKJKnFEZ+IN<o3Da+FC!qyRumL&HbXEv*50RndsE#`my(-!|HZz`V`as&Y|PM>)XaA zDFOW-1Z}H(KADDnUeY`FjZMXq^=`{H|NUEiuj=z{xp`?KBAq5rA|wO07%bQrxbWb% zJMQcnst+E&Z_A7@U=cX{>akKMQ$X?NFDH-to11Og6(Y9z`=6cn3;+8+7tgb=__3bN zCj7&elc)dOv02&c`&3+S-Px1T@9T;~IJjkHgl&!0s-{i+B)To;MC9zcKe@_n2|qTp zD!bo1#>%n!QHHB)ci_dvwbLJez7#KOUp9m5!uG=xJDfP378%Ycahm>EcGG76b+Mn> zeqV6;K9euUZ2Oc=g|FB1mT0$jKK{q{Y5K?D8&^Uqf4xb!tdzd<zFmR)L|)-W^W(?w zzIt~xYxy}H`|5w%@AA?%KVQ3jkF1DD+q|Mqt-_Me;;G#(|MgPOFWoM`nE8t!0|#?c zCu^zy+yjfBZrw6hyI=P9fyw9pON(0e?e%~7^zLu|eMf9h{Y}o7nfPbP$Cjz3iJ}XR z-%aD#{mjJV<G+1|#k^%rbN`!{y{+B0<cmf5`57~=L>kvGZ|*q4<tmo8L~$wqmgj%1 z7+CAJ6j`teI=y&c@X*mC<zR~G`iO&>@eTiXe12YYI&`;#H8bnkw;^Zdd}};tbLmP* z;fojd8z;Txm@F!2$8#hk|GmLt&Mg~rPWQ3*@)+MO_<LVT`M0qXH&?IAO?Q5&uhkdd ze!tJiuxc5@mxtzuU%rZPXOo=b{-OHXb@SRE2a|IqO5D!>cOr5B!z%@=H*J4Yv10En zg>!mu-t9eaZZd6_RSsiN&X*I<d(|&%A8jvtU)`wP_Uo&xb@sJ<%ZbN2E<DT)zyG<h zbr(bLh1TZjJ4+Is_MbU*Dq{P$v)ksEDj4fOS(EsldCHqBp83){ecdaM&b0j<pOLrj z<%=Z#6G?|B$@O>dJ^A1td;gwU@f&)7&)cqBp>48-eOdQcCl1qe$-8-lOjG<AGb9)? zj&e9pJQh1+fx?!_`VB3wpZ~jFm!F?zn|AluZO3DY@;6Tk-|OJ;e>QK)tXX?xchAep zds$F*CDr3mZL^S=^i5%xBfin^w?;`<lpdWKtaktXx(kKeQWd|MyD#+zGf1&2UGRwI zP7{!_J-DRi=h?35-QAIU4<9&Cw|QCZ5xcmhsp@6#o;}&|U;(4?vVHkS3Ud9c_pIBu zV)E;A&O+~HrxYxoXnQ`juK3dzcN^<x8w(z8YG`0M_0vo(Tf$(X+ndH#_kQ_{%qKX+ ztO^RYMV}2@{o`LXf8^S;J;{uRet&qPe&e|I<0sWKZ{FYTE_-Rq_XFM2yT6sYzIKwB z{K={0ede9NDkpapp1%8)ch17ISFY@K<C%Y)Q?BYz2OBT5X>5aCgyE##?z3ry{AwmK zp<!V)yZ%VdWB3*PK5p{O-#K@R_^Y$d96p@?@6P)jw(IZwIosa<Z*S@H`<DZ6ZS*{A z79ISWgK7W0C!P5%Z6D<ICr<tQ_v7R_JI{Xju!EI5uFzR|^MZ|=CRP<p)N@$;LFAd8 zUe(r|50>iB&%BbiJZxK>UdOk`-1_C3y9Lp=Urz|j{`>1}xs>?1MK1(JE%mgDaxy+B ze2`uh%BC=H)#~C?r~KpeZiR={-O_FQ^SA2!oNtYv*<{beZ%zFB?C72N(uar4ot>4x zELfPOtn8t<eiwt)B7OnoR>`AB7pYIZbb0&Iw||;yC*|#{ll{GK)%31!@2o#8-}ZaQ znKkc?{Qe$Suws6c=iBjH^ut3L+ql{FcEzcA|I{9Dmy){he_Env|5oo@E7hmpE-uc0 zq?xqZafyVckNkr5?tuaeo0ATHOVr5wdiCw?edkWxIP>~I{TVwShd`#-lUuevlV1OO z;$3&<LrI69sk*JQbGWj6*&Ydr3+F3hR<1f_SM+8+n|?d1TFt8^^@Z<K?p_FBY7(eU z&@fT?)z|v}c!r}v$;O*Aciu?Ql$MWK!+fD$hT-C)-qyZ}g4_Auetx{l{L?2t13t&~ zD>xq?+jGWl%I<If_U(A0ak>8J`5C7Ic`PfX`<CoKXS@4hqUYn__)J&+`)j#BDIaq8 znRh_`_T8Pow=YedbL#iqa$Rl?t}D%L3%g1#Yz#`i<ebwmWlQQs-{?IR&02+TYxn*6 zbo7(awcbj$WBM{yKkB|2-rDd~@0)9tTg{z$fBzreyG>0&A#GMI(~_^{Z*8XUeDvgH zfA1U1%s<&5eBZx_{ned)$@pH{d*k9~!p!WwhL?+`WjtKCSU6v#WXq2u3>vL^lY5g} z)GW?ys{QoQc<a_R&$sjY*BR-3b1R$v@%Yy38{OCKV2hiUYyY=~`*)bW0>9t<O>5qk z^VrpXyKMY?-;;OOl#`w;`S}0A)HSQF<?fOF^J&eeOA}@WFTc0={js%I)*NwbpK^m= z*UpDk<AhwJ#IAPXOpZjC8C$>KuimnAX6Y@r{u(>ADz)VHUu}=R&KBFgks&s&Fs)ij z-Q{cV%*jTNZhl+w{lss+eKjvX<*gH&W&Alf;nWT5w>Q3u{NA<n!i5*E-EpP~>(_iq z;<sOE$;c$Q;uM3!nMKA@?K)<)S46mu*8l%)w~gnCU*VK#bMNe&U7WqLa`V0veio^f zZ_my8COF~z+aSZ7taZ2cysgW7teSY>t*5hG&f-P}^^%vD%K!eUxnbsY^hCfL#c!F? z4kA4ztGY8}vR35R{r~HJOTtEm_m%yI`%kV(n{UduFMV@l(;IGkqp}ZQ-&*F29W}mw zO)N(1*6THiRh4YbE-#;pr?x02yy2IBnxe5+o=d-P_4I%3d(WRW-!C9M`GD5jfb6zo zuI1s3A(4SwYb?`$)gHU@y}6lfLzlz!?{BPsq?et2Hck54_Kin<uPHXZva0>I`E%s` z1A-zJALiK}<ME1+5wmKUd@LpN^S9sGSr*$j%ryP0T()<?(xqi*e?{L2thu%2_oPW` z<;e|Evk#r}^0xc`r}CTN9OK8q_5ba9WDj(*FQ0$)$c7*HEdHy1^Jg^VaWM)j)XzJ( zVPVvUHLG{C)UCKD`-X8-vipBats<S{&QI4A`dDoiQ!eLwx~<TyZ;pN8qxHMoxw69r zV<RJX{t@<5&Uv<lznLjHa;HN6<A)_-Cy$&qe(|gF{`SBwzMgoKk`F=G>#MT=UVF>G z>Gsz}88Z#Ot$)M4wDD#1?uX%Tjzzv-(V2XF&lR^{zrXwM{MUATw~I^pn%?zm*Z%*& z-1mK^S*7Ieoe=>$J|B4aKeb#Ve_vzqL2ZvF1<_495ntX+nYh1v-F(~sUsoE>F9_wE z@K%9wV|x0|qv{J*JUjQqX6}oKW1HS|>oAIoiPb)z^#84p^!<&kN0zDG-u>R@gz&}x zJsk4KL@u_MzkmG1kwIWL|9R1i2OSHIm+iWha=XkfYlG%N*^ei8eK`D4`28l^E4|nM zp3ti)zJKKQ?f(bcr<H~(Zgh^8e6;^w+^KmVSUVePSIa55Y+G)7&Tiu8=W9~VubY29 zrt;C3_Bjh1BIB*rD@SksckNl4Gyhx`v#fV#^d+aqNvw1{Gv^!QZ@ci;>1A*2kG%Re z<LtEKa{o7EM@h=w^{GvlOrO<b&BN03<=EQ&Y4e*kh41t5dne6hX1>n+^?mu_jzs^P z*6OpTOUw_SWA^iY&o+$@0rr1ujMp#!SiWtVkx=veiciY?{K4WT!PZrC9ykBDxq0D$ zRF>qlFE<+gZ8s=mP%8Pl>-9~$vL_$zZ<>Ffx#Z)muiQ7pd7B)V_Jpoq(b?Yr&({3@ z3*qQ?b^C*IGyWI8t=ZNmXZwoZur_VW#wou(D8K*ltE%*<g*!X{l-jRXy_c%4i8|5n zZ#$oN)s)LVPg`4l>|j0VET36zELyQzvGaRtyXyNJUzZ&GDVJyb<9RRlO=FdqU)rlT zZU3|`J*w)zeRC7@?vw><lHH@O|M}uq_D%3uyqu_IUCpcbis%1Y7iqIc{#`J^@xa-Q z_n#!aJMZ4VH?f5?|9ybKY92nlqI|YftQl86r2qOl_xO#4%hd8OZ~J{?|FON_|HWrS zM2PonDf<%e_uSn3OXX8zFDE~l#PiN&uR@3Undqb6j2y(*->*^sUL;vAo~K&ywvF{o zx9`ryEC+;`l280Im8<yBdqCm8p2Vv6FHToo>VJ1*V{_>94Kw!U@2cbd9ps=~{zPK> zujz4ntb-*pe0J^K@O8J&?Xa~oPm2}ANGCq2^XRw#xNiIQrI+<zzx=_?t)DVCYVWM# z$X9b_&fmCPYSt{RYk527#`1N%v(5G4TK@9JouJK?w}YC^j~Q>OsAP>buU36L>EEwk z+6r$r-cNb8Wc!VBEAtEfqVxW}Wf$wda#LKa?9kG)s;c4pe#|M33wE<RUfcEbS?>4n z>rV`_72`myR9V-(C6(Xpn7@BF*umo!!Q*0{+<w~i_cyr*cfzMs2XgI~e(~_@k;(5% z4lX@Ax1hLnn%L#t?`@9hu}bdT%(Q(9&osfq^FU)<?;`CBUp0S@yuWR(T>Slc#>@7- ze<^t2M!WS~jV?L!v+;-b>2j9)TsyD-;-P!o`&qNKOAft_-S_+3)~2S-xmPZ#E`6C< zZSlBCf&bjRkDT9kmN-n5vH29<{Qbq1>2K2()E#nS-&}rs-ZzWi3%|JOv0F^~SLG*n zy2HiwsBYY+nCW-!Ej7+F*jj!4l{5SG4cZla{7=u@y?$-3|Lk66U-XpVd%jjxe|#U8 zXDyqt{vf}~k^2YlE#J8D&2wMwn_N;q^dB6$@&52$GiAfVH-Dtxy`3cOQ+iDI-6muI zb#Z5Re%(CrG*fSdhCoZ2@Bb4ICiCb$S##Fn=e*t5HJLY>D*ZgU&#-t$wbaX3%X=!O z{SJF=cJG|nzsJY!TNGaUvu@|nSoJ$8oA+(|`1kw#l>hE;E>~w|o$7w`I3jj3w~fg6 zExd9i<&O^R=DidUJiGqWmG<df-=yx?YZ#P$Ss{Ld+2`ER8@xg-Ka0bws#}e|F*tsI z?%RFC{`Ib(-}!yLUUtpSDZ7?iXaE0=e`;#$o2(08Kks`UXSlEW{^vWlFV1v5Kl8F( zg1@B@?|<W+mD1dLOJABlY@KHt^yqP3>78sJ1F?HQ9(O1n<h;CmL%Zz{F&>@rdtck_ zYLj+7GTT45bn(aB+hKCv_s^V8`cqvZvD15k^Gv=ORxfk)`clqlthb1bog5xLn?I=S z=;41EEb;T_JuqqJf9(Ia)a;>o?%wqqSMKQz&Ds6;%#ZMIN9WJby!z?M<^0O3&e(#* zAN{JYIM&^3%?~fi3%<Yn`;;pp{}xB|#JtT8m{WEq>4~A!fnD+Dzop-umEM+9-|#nM ze%#*2)9!rDxo-1n!DYE^Nn5+*Yd`$Hb&G48#a#2>+4|=dzA@_RS?<by|Gsz5(I<-h zNBMt*KEIr-^0I+-23vycjo(+yW8(I|%q!!p^LaHV^K$;XRqbm_?meEjE&sRK-xq1~ z{{1a|bU^iv^Zx%APPa}klhnLs(N>!G#;0o4s!iM9S6%AZ{Ftw~`Dx9!E@5@c@LTt* zZYOhcI`4W@=s)+{ft`n%=H!R%IhC#3dS>=t(eHZ6eYXSd9p86hueZdil_ziSd@lKp zb!9^5o0(RLZ{jPrdR4yebJx<^d_#4M`n;;M=kM?Cmb19NvVV_={htRrXG!&~d%}0z zLY(>Vt6M_i)t@&kao-{OYTL1Suex`Cw>vI+?%Za(+)vgHGd_O`|M$!Hd(kHa0f+B4 zmrMKiyt&i<?wwb3?FR<;C^oh)vrYdxuM3@)s+oJ<_`noNo87ibZas28_k5gvZ1--F zI4|ot|7IObT>NjNd5=e37xPSw`4&I#?K~rYWB1t^mA_wH(Tx3h;qJMbH|3?FXOGL< z=5H>X*UP#`q9EnYWrjK5uFd6_o`3ek7Y+}<swMef-h6XqPq{RCxqacC@KYByvojvq zyuAL<T&W35UTu}0wq?tP_wLFzzkaNCJjfXP^TvDqaP?aeH@g^4oRgd~V?z!5OSzM7 zDTcFm)ZJaa-2c7lg}xs*P6R)4VDY;B+4|et;ti@gB_Adn`Q3Y`=Z=H3@4k}C@M9;x z@BIF_)&J*@E8#o*WyD=y)_mK3+}MKm*^C)2N6T$lpX*PoV9<ZdxVnMo#lo3Y57~8H z^>%vlFPP8f8Po6~r*)S>`i6s>q@~(J{?{*k@kxCC{v);*4!7AEDdaUy41P3CB4~QY zhlhn5&A)a@-M30q@zg!QHt%%I!)u49%bI<jccihraO-9TleM=i@@s9E7u!^yJ2d5@ z@XPasZJ$JbcBJ154v%DL{5$<lMVPokq|nO+5f^tfy-JecKIwMVP05s_cKfHbdu-0F zEwt6yw>e$MTqDwN{@*uecIrnRY}{U+v3>>TUM2OGc6I5>6<P+*6`sZF-I^c2W2-3t z%@?AUbuq6_%T%h*II~FC`1k&o$1SHjR#jEm{yL&vR~P5;qj24VD0h=!E_;)sy>4n8 zI*uvKD%?WGmlOn9uO8hsuiL3V`}vwRmsjtrpIyD<_m^3dtbX;go%fYaKjN^9hwBZ0 z&cyloQ~Lc|riUAJ_=t7;dwa(gdz(&(JTN~zG=9aJGg~~*uKg|e;H<iD#ogxbPcjPP z*6KceZKjj^%yy4X>X$7yi}OWIudXpvc@@O8H|3zxw7e81X~%#R#+3e(EzIsA8>~#- zUdYW#5%bjKeXHX&>BrIM^}B<n9JYP2Qd9riOWUgtB$+ySmKX<bk7;Utr0)BJy}In8 zX6=ESR+Ijfg?+1vn<Xq?_hspY4GCU990L!0690Lia*AluuQMNYAE*~GFgbEeH7&cZ z^72K}rUT8n?o$O?7vAZfdB5(r|GxZBJabInIzPT=t^NCVPw;=ky2J0!EmF_B^y9j% zE%T0jvMTFOz4|<Ro6Xt3!fdL2d%kX~E@kRhnI-sNby1z%-8^Nj2@#41*bec_E4VkQ z`|Oz7#XWD80<X#>iG^P>Ztwq}ck^iXA1%L%h)Yj6*Go^|72d@!Z}G>=+dJ2MA-lvn z!^Qs&?9Df@@O-f6RMFpKy8a>I;sy7=&8w~#mla-nq1o8wbhb;Db8^qjRXb!Sp8P5N zlfiS6$E&2+^R3=#6K8JrXghLg(xmftf4R4-rEH3~t~q|;Apeew{wvPjuYd9M)vGz{ z+T10kY{>Yqpn7M&@7BwYJ>uFg|DQVb==@E+{vP{kAO7XARr2GXwNqu*nq|L@d<vW6 z&uBRCY5I!Q1;niRCGqm&;<{-jRZ|Xqnf3SgHAze1WH(#!yXniU&2Dqm-2Ay_>YLr( z<#!&v6}3wGarq9nY+{vO?7hj`ev7{Qm$v!o!S;BLZjR!ON{2SK9}<{&eFMYd?RURU zGOm|o;+TGE$MZ#@<zI5erz(a|2rkRWn>MZfPf@Dsf6ljyUKmy$x_{W|?&^P`VX1Pq z-<BPWcHNr%;H9{+dgcq~n3Fu0gQKT!&pd5>_UxZC)@66j%-ozGz|_CQzki+P;uBf2 z@z185&trHp<x)wq>%=ovAK92)7asq)l!aB%^UUe9aXTN)e^Z#bRPdpF>LYt*=Erw* z#l=OI&9&OSXWO;~!Z$d1J!PyaGF^TYB!^~-+v;9h<r`fW9bDY`Teq%`vESyOyL`OA zy6w4QpM~yARx6pDd2u33gKy=-;~EZrn!Q(<GcV1UzIMe9jSB}18o%a7@3*fxap7#m zo;^*={i+V%*FW}mUbC)weet)}(5ay}W!uj^a4i4+#_(3g3?bPs47D0pb8r8&U%K>p zPtEnO=65WUu4IUt1pIK^dGJMIhO$%M;vmj{7u^^qsWv{`a3{d#+*=_h{w=Q6D_7q9 z_VjtZzNVRo;-0<EYW_d=GyLCiZSJ#8pMu5p*6l2*+<x`i4ZS-I)uMN+qwdeJbdz)H zxKiy>T^Vj>y6kP$&!UTk%J-)l82tR^>Mgs-J?IMmsR<b!a;t8u&y{l6W6GfDc;Z!` z{dA6_&Zi?YeiY{FXzTucw0Xa&spPEI4_|m@m^{4tV1Y~W+59MXrz|~9&;21=w!b*# z_-<;~myk!&Hy0mYF;7r);>4A1RSE^m4|($c*btRn_U@l|;YUs7`_JVCzC1X5{wMnn zg_+(<TIA=*U3}Jdd;5jM{nZSX{<>^j_R%{xIJ`XAG@*qf%R*tU?d*+JSL=EFTxOh& zOLn&x7q#T<*k;x?;n=ZFU8jnliau}f$jZ=JxqAPlD<OQ@MhosUZki|8$jErHk+GJU zImx-{@y+i}4?5)B-(+TK-QM@vUv#SFv3-FNTb@j0WPbFv=D^I;e7ur%Q)FG*mMs&N zUf8>;I-l2Jhmg^_3We0gZy9!%U*DDO%6x(`_}017-{005*BG@dY<@2}Wdp~aQ1=X} z=gLnRZQtB>*gb#S8=kAzp61{FxBQmXVrPYwkC&aFSG{=Fo++#PYh9b&Tpl=lop8Id z_mAuyW{<b$H~-n`lFq^J6vY)BALKD<OTd#qdwv~%ntooUX!$woqBAS*S68(%zD#?y zu3J{>pj@d7yX{Zb-QVP6uHA`A|8P6`*D>9l&jb1S9ZyDTnXePA;<|h~M(O(7+x1ts zF)d+HWES*LD&bd~6WXvqG}W4Gf{K~Br*`<C-3t^h&z%(eVaCP%uWu&vB&>KVxpwYF z!IT+to_RL2{yqG8hBxoa2j@f6?LJ7`w|@ydQNSv(LZsz-i$`a!nv;mLXkfkYcE(ND zTOtHGUWU9_YS1erYU=q{=v1nJGw;{4_iO%^1qQB*PS;ZWcWhy2`D|UryDZ8avXKIB zzJ!Fu-`M>9>#0*VkMkeBeqDaP*8kfJNyV;!XGQB)GjXuFUhz%b631@Kba3l@GsY!i z%U15?P)X0!U#Q5wDK_IrW8xx%knr0Z9<AQ)<;8XPwOj?eI{)77@n>>wro40N2`D+R zD<ya3S&Oe%cNW|4Hm!R7^l9yN+y1Y8?{u9qxf|Jdot9_@Zz$MmopC2&uE3Hncla1q z-ZlKIWjyahLb5C4iPXD_4F+u@J+HD}hu3X>;}tk>_j7#{le#A#+7COmHN?mLeW8+f zg`ZXSph{}|or*U<#Cv<M=Ix!`-u`@%D*v%>@B1${yUCsuP2*_zAfmSDt6SApsh2fd z`5n5J9+zk;T)0HbmsxYFT-Tkz_@zcFotu2utk3_I_jGq_>)MsF-``l)1RQEQF>i57 z<QC>Di7J+zh6}%RJa9j$yYuI6zxh8GE;{sfA%ncUy+eO(RP%!4j%~{t3lf*?>tbd( zt-MOEXs`O??OCc08<wh1HCpS$;i=^5;xXw<ki;e>X9-i&$nf=1^QO+cxNEbtjLd9{ z0>_g1noSQ9*T1naWUAknlf~`Bm-OcSq6NuKFE>VIZ{B1+$8z_wef!pk=F5qQ6g`jS zXS}QIaN&S<1XuA+UDIzJGhQeLNr%S2j`;qK(IfD(o~_HQVi$|YbGf?8mKmummdM<F zvt?~`n5@-~tyiDlzHF?p?0n0N8Jf0-Ccm8)RmPaYe~qtaj>pb_5pRDuba0-MYpPw$ zt#I(88<&H^6A{tn&!4?Jb^8AOOP5Yn&un*h(cAfa;e!VbGb9}Q<#x@Q)=?z*=7Z<q z_e|Xr_uS%|;5pYc`J2l`CVruOiK?4EZVDWlj(3Z6YX493y}xaX$#&JdKYp|vbMfza zV`*cP!?EC0U~bugCpHS3ew}QQQ9JnL)_KO+3u?;R=1-e;>(V9TpRB(b%zb@LbANta zl>AG7*JrzUdwG>t4+J^<;#O?B_DL!%?TEyp^2D9{<7P8#TAkTB>rhB)bD7qb56n-E zIM@GrVBpy_?Zg6$Cn_s<{NVCPS3TPLRxzgK!Ge9ZRVuCRykGcV$UeA#`*Pvj6+Qwi ztcvaqLMhqawZ3<su3EKc(xl5rRhO?`^{MyFqJsMQABEF><{KV=q?n<2+_l-qLHQsP z2bbTfS;vz4cS+}*5_ox-*FKk(!!KnETdUu4r$e(vcky_-=oQy;7_|fzZ_d3v?W#N9 zdy|<d!MpYD-E(YY+*@1YWMfmKE0+J^Vd8$<nRo8QsC$O3-n#MVt$^_ArOUo;+FjRm zU-c{hp2~xBnIEyQSemsp{uqzzj45Fo1WK!9S3OtvnJHLxi&5dq#FszHg5FJFn8<UG zE9xOz*yVLUmbWbW{M>JC^zT&X+H%R+`KN`<6+TY8Eyl|7Bdaz{T-8XhE91)x#wFT4 z5A@jYS8g?S$f|GN@M6iGivkO$&5nJ@<=*a-=*2QA_KSu6_3PK)-`Mx=#zot^Z@J{m zS!S-k|3&ip(jHIIvuc3>&U`0(eG*cXodlznh@E`0bgG!(>in|B8*bV$>|B=^s%0DH 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 LS3j3^P6<r_Y*hJX literal 0 HcmV?d00001 diff --git a/icons/build_application_icons.sh b/icons/build_application_icons.sh index e8512e7..776681b 100755 --- a/icons/build_application_icons.sh +++ b/icons/build_application_icons.sh @@ -26,6 +26,7 @@ ICON_SIZE=192 # Menu images AVAILABLE_MENU_IMAGES=" demo +graph " ####################################################### diff --git a/icons/menu_graph.svg b/icons/menu_graph.svg new file mode 100644 index 0000000..cb653f2 --- /dev/null +++ b/icons/menu_graph.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><defs><radialGradient id="radialGradient876" cx="51" cy="51" r="51" gradientUnits="userSpaceOnUse"><stop stop-color="#534fbc" offset=".53489"/><stop stop-color="#d5e834" offset="1"/></radialGradient></defs><rect x="1" y="1" width="100" height="100" ry="0" fill="url(#radialGradient876)" stroke="#000" stroke-width="2"/><path transform="translate(12.795 -12.378)" d="m41.231 66.406c1.2372-1.351 2.4315 1.0012 2.2454 2.0564-0.50427 2.8593-4.1113 3.4739-6.3581 2.4345-4.0191-1.8593-4.7114-7.1159-2.6236-10.66 3.0639-5.201 10.16-5.9833 14.962-2.8126 6.3992 4.226 7.2698 13.219 3.0017 19.263-5.371 7.6061-16.285 8.5638-23.565 3.1908-8.8179-6.5075-9.8622-19.354-3.3798-27.867 7.6392-10.033 22.425-11.163 32.169-3.5689 11.249 8.768 12.466 25.498 3.758 36.471-9.8949 12.468-28.572 13.77-40.772 3.947-13.687-11.02-15.076-31.647-4.1361-45.074 12.145-14.906 34.723-16.381 49.376-4.3252" fill="none" stroke="#000" stroke-linecap="round" stroke-width="6"/></svg> diff --git a/lib/main.dart b/lib/main.dart index 1075151..b45097a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:provider/provider.dart'; import 'package:random/provider/data.dart'; import 'package:random/screens/demo.dart'; +import 'package:random/screens/graph.dart'; import 'package:random/screens/home.dart'; void main() { @@ -19,7 +20,7 @@ class MyApp extends StatelessWidget { create: (BuildContext context) => Data(), child: Consumer<Data>(builder: (context, data, child) { return MaterialApp( - title: 'Jeux de mots et lettres', + title: 'Random application - testing stuff...', theme: ThemeData( primarySwatch: Colors.blue, ), @@ -32,6 +33,12 @@ class MyApp extends StatelessWidget { builder: (context) => DemoPage(), ); } + case '/graph': + { + return MaterialPageRoute( + builder: (context) => GraphPage(), + ); + } default: { diff --git a/lib/painters/graph_painter.dart b/lib/painters/graph_painter.dart new file mode 100644 index 0000000..38c1299 --- /dev/null +++ b/lib/painters/graph_painter.dart @@ -0,0 +1,42 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; + +import 'package:random/provider/data.dart'; + +class GraphPainter extends CustomPainter { + const GraphPainter(this.myProvider); + + final Data myProvider; + + double random(double max) { + return Random().nextDouble() * max; + } + + @override + void paint(Canvas canvas, Size size) { + // Fill background + final paintBackground = Paint(); + paintBackground.color = Colors.black; + paintBackground.style = PaintingStyle.fill; + + final Rect rectBackground = Rect.fromPoints(Offset(0, 0), Offset(size.width, size.height)); + canvas.drawRect(rectBackground, paintBackground); + + // Draw some lines + final paintLine = Paint(); + paintLine.color = Colors.red; + paintLine.style = PaintingStyle.fill; + + int linesCount = 500; + for (int i = 0; i < linesCount; i++) { + Offset lineStart = Offset(random(size.width), random(size.height)); + Offset lineStop = Offset(random(size.width), random(size.height)); + canvas.drawLine(lineStart, lineStop, paintLine); + } + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) { + return false; + } +} diff --git a/lib/screens/demo.dart b/lib/screens/demo.dart index 82e0985..a9c5656 100644 --- a/lib/screens/demo.dart +++ b/lib/screens/demo.dart @@ -4,6 +4,8 @@ import 'package:provider/provider.dart'; import 'package:random/provider/data.dart'; class DemoPage extends StatelessWidget { + static String code = 'demo'; + @override Widget build(BuildContext context) { Data myProvider = Provider.of<Data>(context); diff --git a/lib/screens/graph.dart b/lib/screens/graph.dart new file mode 100644 index 0000000..9a0ca15 --- /dev/null +++ b/lib/screens/graph.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:random/painters/graph_painter.dart'; + +import 'package:random/provider/data.dart'; + +class GraphPage extends StatelessWidget { + static String code = 'graph'; + + @override + Widget build(BuildContext context) { + Data myProvider = Provider.of<Data>(context); + double boardWidth = MediaQuery.of(context).size.width; + + Scaffold pageContent = Scaffold( + appBar: AppBar( + elevation: 0, + actions: <Widget>[], + ), + backgroundColor: Colors.blue, + body: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: GestureDetector( + onTapUp: (details) { + double xTap = details.localPosition.dx; + double yTap = details.localPosition.dy; + print('[' + xTap.toString() + ',' + yTap.toString() + ']'); + }, + child: Container( + margin: EdgeInsets.all(4), + padding: EdgeInsets.all(4), + child: CustomPaint( + size: Size(boardWidth, boardWidth), + willChange: false, + painter: GraphPainter(myProvider), + isComplex: true, + ), + ), + ), + ), + ], + ), + ), + ); + + return SizedBox.expand( + child: Container( + child: FittedBox( + fit: BoxFit.contain, + alignment: Alignment.center, + child: SizedBox( + height: (MediaQuery.of(context).size.height), + width: (MediaQuery.of(context).size.width), + child: pageContent, + ), + ), + ), + ); + } +} diff --git a/lib/screens/home.dart b/lib/screens/home.dart index d8705c7..2dd7dd6 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:random/provider/data.dart'; +import 'package:random/screens/demo.dart'; +import 'package:random/screens/graph.dart'; class Home extends StatelessWidget { static const String id = 'home'; @@ -56,7 +58,8 @@ class Home extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: <Widget>[ - _buildMenuItemContainer('demo', Colors.pink), + _buildMenuItemContainer(DemoPage.code, Colors.pink), + _buildMenuItemContainer(GraphPage.code, Colors.lightBlue), ], ), ), -- GitLab