From 5a183867bdbe6de6ccbfd358c950983d61f9eb88 Mon Sep 17 00:00:00 2001 From: Mohamed Nouffer Date: Thu, 22 Sep 2022 20:36:56 +0530 Subject: [PATCH] update for routing --- assets/images/list2.png | Bin 0 -> 3115 bytes assets/images/list2_off.png | Bin 0 -> 3297 bytes assets/images/map.png | Bin 0 -> 2633 bytes assets/images/map2.png | Bin 0 -> 2151 bytes assets/images/map3.png | Bin 0 -> 2180 bytes assets/images/map_off.png | Bin 0 -> 2204 bytes assets/images/p4_10_train.png | Bin 0 -> 2042 bytes assets/images/p4_13_position__down.png | Bin 0 -> 2204 bytes assets/images/p4_13_position_map2.png | Bin 0 -> 2151 bytes assets/images/p4_6_map_destination_icon.png | Bin 0 -> 1415 bytes assets/images/p4_8_car.png | Bin 0 -> 2097 bytes assets/images/p4_9_man.png | Bin 0 -> 2035 bytes assets/images/route2_off.png | Bin 0 -> 2255 bytes assets/images/route2_on.png | Bin 0 -> 2110 bytes assets/images/route3_off.png | Bin 0 -> 2299 bytes assets/images/route3_on.png | Bin 0 -> 2178 bytes assets/images/viaicon.png | Bin 0 -> 1415 bytes ios/Podfile.lock | 10 +- .../destination/destination_controller.dart | 47 +-- lib/pages/destination/destination_page.dart | 310 +++++++++++++-- .../destination_map/destination_map_page.dart | 360 +++++++++++++----- lib/pages/drawer/drawer_page.dart | 12 +- lib/pages/index/index_binding.dart | 1 + lib/pages/index/index_controller.dart | 16 +- lib/pages/index/index_page.dart | 39 +- lib/pages/login/login_page.dart | 6 - lib/routes/app_pages.dart | 4 +- lib/services/destination_service.dart | 16 +- lib/services/maxtrix_service.dart | 19 +- lib/utils/const.dart | 5 +- lib/utils/database_helper.dart | 47 ++- lib/utils/string_values.dart | 12 +- lib/widgets/destination_widget.dart | 21 +- lib/widgets/list_widget.dart | 14 + pubspec.lock | 7 + pubspec.yaml | 1 + 36 files changed, 762 insertions(+), 185 deletions(-) create mode 100644 assets/images/list2.png create mode 100644 assets/images/list2_off.png create mode 100644 assets/images/map.png create mode 100644 assets/images/map2.png create mode 100644 assets/images/map3.png create mode 100644 assets/images/map_off.png create mode 100644 assets/images/p4_10_train.png create mode 100644 assets/images/p4_13_position__down.png create mode 100644 assets/images/p4_13_position_map2.png create mode 100644 assets/images/p4_6_map_destination_icon.png create mode 100644 assets/images/p4_8_car.png create mode 100644 assets/images/p4_9_man.png create mode 100644 assets/images/route2_off.png create mode 100644 assets/images/route2_on.png create mode 100644 assets/images/route3_off.png create mode 100644 assets/images/route3_on.png create mode 100644 assets/images/viaicon.png diff --git a/assets/images/list2.png b/assets/images/list2.png new file mode 100644 index 0000000000000000000000000000000000000000..869dd4589d54c54816bbc500065d105dbdfb055d GIT binary patch literal 3115 zcmV+`4Ak?9P)UDEifTPh-7F&Ok!)Q zX|M@UJwRwu2g}6h#^_r2kv3_Q#)%z2uJ85bobS7SHP?;p*h?pIq|d&#@9THZ@0|0U zb3QBRq0Hd%Ass<>E9I8q~dkw`RU>cLqv`PH7uexZ*5H0R z-5}j`7#aa`dujLpk6&)PJP=wfY1Xpjv8F*o2MT%8ye>!4kPk@Hk|>%JFwGE{lU4IUDw@Q37JuwH)^P#Rv+vP%^JOIOqAqlZ3sxfFzHbkS#e zgGsp3dJzj51M`bn7)u0tXwJNlSf66Fck>+RIZ3~ zH*%PpPr+KaPQa7$jx8$zvoJ(}>7Pd?NjU}Iv`xZ^{F#PL!aYz3~JP`I^vsV=wzeJ$lxSqwe8Pf8?j66n|fN>Dt z-*c?}V24LX$g>_mR~TaWx+PfFCOe(ftOUXK$=Yp2guSNeJtr8m`OdrW&>cZ+4QS#< z-%J^J{Zb0~*{j6&8El^w{R6c?}I&+lEu*63aMWUm`%HuNFMCYMV^NV|hH zr5s;QW2x2sg061A)T+!cm)%5!T>sdkTWWxITKHNgKKBuE?HcJ`kMz~cI5nMthn(j_ z{dDg=8%q)6P(7R7OR5i-(=(lvdza|zE}pwb~bS?g+n_x);(s=Js})_Yp&+I_~oS<=hTpp{hm!s;o%MU z<37^v8-XB9jwX7Bz4B1CX7`E2xRh|WIB{Tyva9MQ+0NLuZ$*0!GdDjBegJHr&1zRq z&f-im4?m$=7xK%=kfMf(%F$|X94l*-0hj7SEjW=CV`L|Nfab#a*+o3qvjH1}Zp?Bb zu{g_BOt#xe6)(+&#UxtPiCl8D2zJedoa@5e9FnGm9!mVBSu!5%keYqvg{bgo43^8B z)s?>nWc+Ln&%U4QD29Fa`Y?E(uOYC7g=t*L7+B|{gx~Fg#kllLnZ~hlZC7hPZeCb2 z5uesO3O3g7ZhU9b)3v1n`WURo4NKO;q7?_l+TfI@Ug9d^`KxFSTqHrD@BHoi!8gC~!%MS;auPx1{IeC2yRtJKvT5ORK3|uL~m&ch^wy;OVpoNBi#e zH+8Oqr&Dyi(E^Pv8A5eaV&algFqDvBdp9I7KU)DSI&7`ggu@=yF`jZrYBtXDxmryI zB-ny%a_dhV zmRqUpow(VSOS9c3aBN?qlF#b-lQf}-39xL?oZ+`H!KfE{4o@zL(Q#qQa$!GjFIUKl zM)|l`D~oD8g~ZE5)2(dIyEN2`epstVSU8-J4sOy zNkgw(8pyLJrf+IaE-tw_D%E`Y(Gz6MR$O|rlx^TeN6m7Nrd}hf6T%>OpE$o+%3i4&fv6xns%sUhr}!3@|kZE&{yhKY;JMN zA<+fPam}@=WaII#Jy0%w3(uRC3rCo~xutQk)A1F!a0}s{EpSTIUAbQy49k@>qIbIn z^(wI#+a)#1u{4vEi_WrX0{Zo#28h3cjQlNvvu92Sz`VeV6JvjmT+ya}fOTfkt+2hX zm z7kE*|pm0<^dm**YUdPyW=cUNJR8&!H+U8OcB*#RFo%ltC8sNphS+^}zwi`^$ z1o0P_V&%^c0%!@ay{f!eoU~K4iPeH^FW6e(Q3)Em;C9DQFzhCwTA#iQ+T~6XRXHVl z%?6n0zy!0yBDEf|KgFu&_x1oj`-RDN{#oh&Lh?TW1^~>+ylJ%;*WmyF002ovPDHLk FV1g|~`OyFX literal 0 HcmV?d00001 diff --git a/assets/images/list2_off.png b/assets/images/list2_off.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bf69a10fa372980fb3cf9bb80476c2a5a1bde5 GIT binary patch literal 3297 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 literal 0 HcmV?d00001 diff --git a/assets/images/map.png b/assets/images/map.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a31a3e0d08aeba275265dd1ab31c39bb6b1b86 GIT binary patch literal 2633 zcmV-P3byr$P)q$gGRCwCVn0stf*B!^dzP^4Wwi71= zk}$}Nlu;PL0Xmp~HBnd8(3J&gNU#Z!Xe*-47_fD#x))^=+qzBywq~7DwW0K%u1s1e zEqfxI@zi*QmPZLVB!s+4;>7Q3`+C1~Zk)vU#x^aJcBN}y-^aNhe}CuqI>7(=ruj@y zfA_6w`g|N3jSU*X22p2)pjC!tBS#|at`>;;7KEi{`fbN=Hnjh50qYuy=yMkVRYMT0 z(29W00RFAjg9EZrWtjlS_HYOUPv^qydJ{sy{rL6Q?GG2QuE9#5dugvBMF67-NV5Qj zbOJPjpJR|5P+;;Ykl`Q@3;=#NAo&znc27jMBP8uk2C7LBj+wHNAgnND5E$)7GoU9h zU7DhxfdKU)G@=GZ+S6&*GYiWRNKy!HuY`by0KFrC#|eZ8TEkzzkN(7N>{;jhbbxgY zd&!hLxLT&H3Dxvb<(P?uvH2F^BWkq*()9vzj9Sbz3dm-#blw??z~Pi|XTSw{^d8_I zQl5**G)IG#YLJNmzjv?^p->IX1ZK)6I8x1EQk2t>nS7(LWdaMbBwV?7T>%VASU0bN ztJ5+RL~}ox)MUozb4-|L7GWXSeo4m3UO&3}2ym#2)RY)xJ3+1^$d=Rq>lzx#bYpN? zibp`68$;N;%A4?0e zu{cBI);&EO#F-8!paN%u!MGPDvR!(n;;jT%uI^H57-A z;=LPPxb2luPHKL&Gz;SN*^0A;!#4c%{g zSYjJL9yxy=y2e9T`IrA7|J}bqYCeT<`yF(dG&t&Py>HfQkeM!Fnx+%~Y&Tks3^pL*{%F_~6h1fxZ92HLAEeRwIiO;xR6%N307{1MXar|^}r za}sXQ=P6J?0l5;^uU>=?wmu1;*%M(f_0}HM!7~1F4r1?6 z+<9$L0Zco#BCTd4KUUjHE_Yz2qc1+4k>kuYe1wY>7fpf&xfvu9^8=mE8U=iurz~b- z+N-RCFl)oAFEO3^I9{FVHORSSN5L zC~(NwR7dKWwQ@qhz?_*ezgfocHyw?;&$I83>Qkg*C5K|5Y>&dR&6a1u2-S`wazv>W zi6^dDNMv6A;uQho!vH%vLUm13_%p=LN7 zQCbCp6dyF6jjnzSIe%z^;Py>2^9To;3Tph>WecIpwIWC5+QohcF7)4|G`vs&Bv97F zOahGXe!*udK-uE5gfEJ0?}Ts9-UklWe_vIM3n$-^&_mvy?^U-QJT|f z5eZB*TOxL@Y{w2tT_Hv+p{3u0?wijfZwEI~6v2HRvA?Gl#i} zIkgWTbj?ZW#pXADmePHPURay_57YeX3{VaagcLYd7lwoOC}0zB|ALI%i$8ZhN7a&+6;tNi==QHoU&e55X40`7t^!CAJ%2w3^g0>!+mj2{Mv| zNH}QDtY1Q;e?3rKuIex>-JL%6dP?d!+=ckCQ-Hm#pW+eq%!8fn*jH0LIS%fod00X1 zKlKGJ{NnlwtjWI&t9~@$;4BZDcm0r8*KvWDiiqlxI%;rc?BA zqv?7tr6p3(*=xt|zE!E#7uQ16-iF`9OPym~IjC=4gSxp#6TU}xCWinde*A9o#&1?vE=Cy@{p%^*dcvSIE#^^ zPlqkr5nm={JV6CVE(}y$-tGDrq1iKFJl~3YKi>>F+mafbhn$g3E9MkTJ;}Eb^;^!W z11gYb@x^C~2++nuk0yd+LnRmr=Am->P0HVL93b1eZeK#EUImnK9L8f&$RMvQT1NA5w0{{&Ekh_sA5;b8Y0#WDwQ6B4 z-We{yPr4q#pf9XAglBjR&U=91o{NhFQ;rse42Nud^@&VA7|`KRPdUywAEDAnMA^)x z(27|xfK!4E&B7~vC1`e=Vl6$LxgtHoICJYS6FRh z%fA)lYtp>IXA77{W&K$YC)TIO%bqY>3{ol+W`&@SsTExcwo`akr8+j&x`-|~uK)u8xs>`ebT#qS00000NkvXXu0mjfvSju0 literal 0 HcmV?d00001 diff --git a/assets/images/map2.png b/assets/images/map2.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3dd1bf9f64888559e1271d9551d260831cbd40 GIT binary patch literal 2151 zcmV-t2$=VYP)?@Tma=A7+IK8Y zukp&?9xuOYc>ks3e+$|>6epN2`m_s*+6jd&PzjEu<_!Qo+g3gDxKa@?OL7+r5||&tGRI+A$LRY3yt_wRd(hsY1ic;> z((?y_Py`6l_BYrdy=9e`FKd|+xR?j>86Y=bh6XZmeyfrQb2k}g7br!#WC8uacH-; zdeD$C|07+* zuQxKt&Jb*Rnj~&Wb0`@Mn_M|)?+{U8l%$nFq?uIBkYNeRfF`LlJzKt!CDqJoXGyWT z`FlQ&jt@4k$ClP6BwGAvCy8fD7QUV?;FpP;FlQ&}oGd$^21DOb3)T(vC_#23x?Vyy zG)hR5pmK8(h9$e)GRQu&Y>p-Pn>HeG&s})DC4exQMv|m^=CX#uwF$arij7)BTl>R! z?UC{NK;QWA0I9nVkrq;S^DW41THFv`f923vz=N)iD0X#3#OKaUVI-$@X!#OOTuNc& zQX1o_f|Pi6PDr|CO9yt|-GYt=4}QwbY0d;XAgwG$Bo*kB(pXD|oc_r2dG5XwA zDSggZu{PvquHnSblem&M@kGpvE$yU577&Y1_4e7%_f$z!Q9dG72P@9Qw#eRVTWpW- zKGC|WtlJjyBIr?Z`mcGJVkwFk(^qiS7s36pAlgG7Tp*t^*%!=G0#EKahOa)>7E5#= zyuMgf5MRh5wsrWa_S>sn$gbnjvNN(|8=Eot`yco|Rm6Hq827ePwhK4O)Ej7c-AVN? z%TySY@sI6j(PEE|M}3X}W0M*5oSDS#Q-5LjqI(K|{h^jyfAIY%4xhVp4Jk?(_pS3m zX=L9Zf#vnCYEUjT6g6JS*{pKY0rbwWThKj^?~9WJ&d0fXmX6w%4aQ zrO;XqUs)`*+gXF>UCt*k@+Hg{$}J3=VIhCM8njeesJ2~i#DRURhOO2k%>lOuB`}NX z)DjmiT$tx`<=*NR=vbv=x6a6-ts63ZbJ1;CNjvCxrLAR=FSA&p zY^!T3%|cE#jjVfJm-TPS&@k}wm>u+N1(ZTWtvI?|Hd^j@S7~y=ylx}Cvowhzmu5#A zTU?Zk2sjqCky}#Q)yhU(wb!#)1GPQf7KS*MvR(4#9x9(ZRtc2vR~G=Q zvR1aLlIE9J-4DnTRP!b&Aig(CGoKsB2d|7cm3f0g{oK0h^RgYN!|u3Ja&9FOkoBv{J(s?4)o7%1*Dit)4|a{Xg%A;&)H#n1kB zhh*tB-9geUlp$xi8%<)M`!)Mv)d9bGL%*;UZsxeP&DR$%S!zxu(DV7k@+Zey<&=e0 z&i71BYtXYjiw~;?J-B-e!G-}ChBW5PO=$|NFoC*M&Kl!z$oJs;rKZ_7`^jgPOiPy5 zXWtw@O(xJq7ibg1hK0h`>#N%YmQ^{M6L%8ACo)p~sT(AixnUf6^)07UY853rC|r$_ z3KEs^q1hy7Pm1aiE3b+g)U6E>=X3eSp^(+hj?2TcOe#tD*}wWB8P|hi9vYRIgJ+^X z|H@~;3lnI5XfZD(v(QQ1^BThvq_v|QCRZ_bl(0v+ofoPX)4Yg$7h^}CtAwj7BU6Sv z0hyKR=56Fj-Fti1YLL56jKdWrCTy!R#0^R5F7#S z0}Ih>sdCD<@V?N+iurwcAjXpAaU#IEdw3;)Yx6skgie(ALma;C5sUVp;-?$lNA`~2 d&aM6tU;qLDr49BxW@G>W002ovPDHLkV1f$e80G)~ literal 0 HcmV?d00001 diff --git a/assets/images/map3.png b/assets/images/map3.png new file mode 100644 index 0000000000000000000000000000000000000000..429a5683de471a735567a790b23e5b1f922dba9e GIT binary patch literal 2180 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 e*=qb(fB^unKtiouyCkCk0000F3t2?Z(GI zK+A_8NYtW{XoN5l6HN$iXb2iF*i1AUE?|Fv*$|BJ!Z?iHkQkUZ%7qR>Fd8+3a3gSG zF+?JUt;_*qu=T9%+Mb@CbNv0@w`c3tjdg&$$=h?z%*zQA7`s|>Gw+dF=Uclp{>6b^r6y4G)0%o!7XgVw===(l=^2U+-1B@ABKv4F= zLttv^^F)rOC^$L}84?n5yG(?jNnA`m7( zJc9&?LHQ+HegfrnLG>!Ab1MkZ461Z%(?(9Wpk)n=rL(Xz8ju;K-wj62Y_{V-bJzTV zec024Osa>p6G7bq0u&+;0b(j3O~;y2c_Fc5nnGU+0rGp@2-Uc-Jm^N$ry}4|kSW^u zGg(02%`~jBVPHH-*leCh@X^+`>VfS(#G>v+ErD@BF;gBgok~JakC18dQa}6vHlsc+ z&-r&YEnQR7xCBo$hVfj)gNR4LVBW%S*R!~F;}-etb*Vup72swDw*SW%ZeC+h#MD9v z6Z%P0Zl45H)Dc^;2t8XLK{Vu<@fMnH;^5h<=sc4U;Dbva#!IUk@od-w-Li3VNXOq- z3Eb$v^5slpANIf2IT3Lx?s#G(g7~=})CQx1sQ~GoS>ubxNh4mLFys4AHQ@BMaSUZm z#Bb-(e&zp_v_0kWCpIt zkisTC(A+tlu@1osdmYCp))dF05~$BNEydxNmsJgl2e0keuo%6suSCS>k};30@y}nE z@XK%>5eh9^_Yk1`iS7Z~8JA>hGgC$Iew~bC+GWOGI@iXo?7JO#IohI#luS zmQ{7LdS$fETk+fGa;9q|C~8Aw<}`M!3}f9wABJulO?Dk8~GmSaT z#HN{#Su4Pj#}5t+Vqj?{jyq^$GRCo=F&1R=a`hdtT1frn4_^% zvLr6Z5{H?)L!jLgTY%Fo#-HZ) z{ktB!Cn<52+f|;*7zF3WAXUnFs$x^Of#HOPu3h!z?$<4JR>;z#@lumeu9pIt=GvU* zn{6j2rZUP$h0MF7G{o*qT#qOb25L1l5)!` z$vT(VocO1LqVItQSvckiV4Bz(8BCCz*5j-9wCMq>O|ZrS%#F#nn7)5Px^XmfCy!%~ zEZ17a;1}mgM$br)Y(}Hd&Y&v0r1K{d*t8=`3t~c)TBiIzIog|P zE(yr(0)7epK1RXw_o3WGq!;(*K9tRwqBbr&)`c(MJve(`DfcOQDd@#SgUby`pkC}z zaB0op*n}&)FIT0v!!IwV1|}lbuK(@|61mbYkmG?|N~cHT_~M=Q<=0jE@%a;ZY}ocQ zUENB7&hK>E(Xfx|B`;1>7yZGh8`Mu0s}enTNIK=gvp4h5OcjabxReNcA&Xtlu&!Pd z&#iKcfH&fLi1Mf?-ozF`NJeQkuTtd>ma|{Rp`D|8Auq+w&2ugj$EwG-qkUsyew!-N ztUa`>NeGp?8nIPSzWpTXCuJ&-^2{OIf0}Bkv2<^Hu+qFOG@C_t1!7U?NU6+$ur;y&3LNL=sv1Df_)mZV Y0IzjTRk|wE-2eap07*qoM6N<$g3saMfdBvi literal 0 HcmV?d00001 diff --git a/assets/images/p4_13_position__down.png b/assets/images/p4_13_position__down.png new file mode 100644 index 0000000000000000000000000000000000000000..65493597b12888d20c3d832f5f42abf2b3667384 GIT binary patch literal 2204 zcmV;N2xIq&P)wlTiT%go-n^S;l0&N0F!obwY&{bk~%Z^7YMVFTHC0br70%%z#gJs6UAUL&&Vh_ zegc3}W}*+k5~S)eYnY0n0~kPA8o(+PfSiG(PW^o*4R1-(;DAMzrOR4N`3k*zJ4d(g z<)~E5Q^2gU{lfrk2FDjxUbK4x$R-5~6U>-l0UX#9)-V-C6H~e66}i{<901hticNhV z_vm;KgN6nN>Cs1qY40OjX!~$Kd{w1IyF^#7-=jNs=kWb}#3s=+Tw!c2NToeEb;4k9 zNr2OtIZHN%vy)dT3P25h*lGj-9ZeSxm!v)E9rWo>rfJ*o0C`?OH)j4re|a-Y#k?)| zan!E`sWn@8&yEwBLZSF8u$B;TY*qkapYog%ZyhnDMW!1XO3>KYK6>)W$7pnPx6F?m z+)j>5lv{KJ96!wb+#Jo^nuA$&+Bq^r5AWPe52gC(-fWp1ht2J8w@hRIO6iT4TQUgd zQn);2Sc#08gh`B~Fc+DzQUg^5_JdQOr=v$d-jc<;cWoMf?jl{fG!w0X0AWV=?Rl8K z__+f#Fp!{|@6FT2EAP_s;ykS5ap0Ul;Jnb3K|^`$hnj925$5pZ8o&jRiI7=S>$i^{ z+D)&$_Dy>H@m+0$Y}2L$nEfd2+O?T3{c)zo{M_su&F0Fqd)F2k0h^YtQ}%vAEM(~V zrw%;&g_l2=o3gbv>>Y;azQ_R~QleRP;Z>9daId`bjaqbeGY%dck@@QHZ^)V&lpr^s zqnz!~zTI1CWZNLwOAgI17RhrfiA6h~Dmj0BRa?W}gl?E=Lv${ZlPDWdgISrmUcgny z-n|cr_FcPnM_!r9`MDe{V^JCmZ%rlXojW!;W%lzhlQceYUTt8Hg_t!CQ&Ej|;CQgl zF~|oUC%-=ibEl#JfXlE7ym9>|{qvqpsZ@dv?%f9K^+o!q&@pWld*krEjId`WBtu9N zUBlklvqxKQ&Vg_p`ZhF_6yIx?z%F0DSp(_9?~0{ROg#i)pSit2ZUrm`ep+7@xyLj; zN?R<#;Tmw_dytQ2V|lquU-|0K={>J;lf+ZumAe3uGip1@c!LdDwSN?3|A7pRq6nv zx=tiTZOUG|(JE+q2_}}ELZLwO3q=$gh7iU6Sp}HlUr1FO^lp7tSZsRz>8D4Vf_tik z4>mPDmtOFD*1;%(qpG~lAW>Uz)hKNx9VbtIw#FC>`EMZPtr+Bt(zLih5wfsUCfD_2 z&?@P@l!zRy4DyL54m1aexe=e`y&cDg zhEythT*OMEr~=GN(HI0B!{aJ8kW}@6s1xZ1JjA@>@Iewf!m6vsz}z|U3zPBJLp^Q7AChDCPtpLQ8A9Q|BXxAi^j ztD``67#z}`S1Gg0O$xwb@Jm+CNv4%=~gQxv3;@44lYjSHt5ggPF_nMDsrK;J3L7rGhDVlz{p z{_#{xQLYyWmY7$-VLD*bGPE-V{}79DQ9GU+D>)hpa1k-B-^ zcZ)&7R!SNtK9b%bcevsv5_Ry+bz8*+KoCSq!D5U?6Xe#Ct2ND&vOaDlK4N4n=Iv00Qimi!y!Jy^IeJ0bF*&Enu*D1TW8H zrscp52ANe=k6XXe{#9atO06o2%o#|3hqDw<&atd>0QS;{-bClVp=lb=IF6gCHqBK5 zs7j-}zGNuCBz?soxzo?-s~cb&{xbykt^50uM+(K#$C%al&k=PKOF&h_m~ e*=qb(fB^unKtiouyCkCk0000?@Tma=A7+IK8Y zukp&?9xuOYc>ks3e+$|>6epN2`m_s*+6jd&PzjEu<_!Qo+g3gDxKa@?OL7+r5||&tGRI+A$LRY3yt_wRd(hsY1ic;> z((?y_Py`6l_BYrdy=9e`FKd|+xR?j>86Y=bh6XZmeyfrQb2k}g7br!#WC8uacH-; zdeD$C|07+* zuQxKt&Jb*Rnj~&Wb0`@Mn_M|)?+{U8l%$nFq?uIBkYNeRfF`LlJzKt!CDqJoXGyWT z`FlQ&jt@4k$ClP6BwGAvCy8fD7QUV?;FpP;FlQ&}oGd$^21DOb3)T(vC_#23x?Vyy zG)hR5pmK8(h9$e)GRQu&Y>p-Pn>HeG&s})DC4exQMv|m^=CX#uwF$arij7)BTl>R! z?UC{NK;QWA0I9nVkrq;S^DW41THFv`f923vz=N)iD0X#3#OKaUVI-$@X!#OOTuNc& zQX1o_f|Pi6PDr|CO9yt|-GYt=4}QwbY0d;XAgwG$Bo*kB(pXD|oc_r2dG5XwA zDSggZu{PvquHnSblem&M@kGpvE$yU577&Y1_4e7%_f$z!Q9dG72P@9Qw#eRVTWpW- zKGC|WtlJjyBIr?Z`mcGJVkwFk(^qiS7s36pAlgG7Tp*t^*%!=G0#EKahOa)>7E5#= zyuMgf5MRh5wsrWa_S>sn$gbnjvNN(|8=Eot`yco|Rm6Hq827ePwhK4O)Ej7c-AVN? z%TySY@sI6j(PEE|M}3X}W0M*5oSDS#Q-5LjqI(K|{h^jyfAIY%4xhVp4Jk?(_pS3m zX=L9Zf#vnCYEUjT6g6JS*{pKY0rbwWThKj^?~9WJ&d0fXmX6w%4aQ zrO;XqUs)`*+gXF>UCt*k@+Hg{$}J3=VIhCM8njeesJ2~i#DRURhOO2k%>lOuB`}NX z)DjmiT$tx`<=*NR=vbv=x6a6-ts63ZbJ1;CNjvCxrLAR=FSA&p zY^!T3%|cE#jjVfJm-TPS&@k}wm>u+N1(ZTWtvI?|Hd^j@S7~y=ylx}Cvowhzmu5#A zTU?Zk2sjqCky}#Q)yhU(wb!#)1GPQf7KS*MvR(4#9x9(ZRtc2vR~G=Q zvR1aLlIE9J-4DnTRP!b&Aig(CGoKsB2d|7cm3f0g{oK0h^RgYN!|u3Ja&9FOkoBv{J(s?4)o7%1*Dit)4|a{Xg%A;&)H#n1kB zhh*tB-9geUlp$xi8%<)M`!)Mv)d9bGL%*;UZsxeP&DR$%S!zxu(DV7k@+Zey<&=e0 z&i71BYtXYjiw~;?J-B-e!G-}ChBW5PO=$|NFoC*M&Kl!z$oJs;rKZ_7`^jgPOiPy5 zXWtw@O(xJq7ibg1hK0h`>#N%YmQ^{M6L%8ACo)p~sT(AixnUf6^)07UY853rC|r$_ z3KEs^q1hy7Pm1aiE3b+g)U6E>=X3eSp^(+hj?2TcOe#tD*}wWB8P|hi9vYRIgJ+^X z|H@~;3lnI5XfZD(v(QQ1^BThvq_v|QCRZ_bl(0v+ofoPX)4Yg$7h^}CtAwj7BU6Sv z0hyKR=56Fj-Fti1YLL56jKdWrCTy!R#0^R5F7#S z0}Ih>sdCD<@V?N+iurwcAjXpAaU#IEdw3;)Yx6skgie(ALma;C5sUVp;-?$lNA`~2 d&aM6tU;qLDr49BxW@G>W002ovPDHLkV1f$e80G)~ literal 0 HcmV?d00001 diff --git a/assets/images/p4_6_map_destination_icon.png b/assets/images/p4_6_map_destination_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..617ab0bb68429e23190b5b1b43ad021840a48ee1 GIT binary patch literal 1415 zcmV;21$g?2P)^@RCwCFmtSZcMHs-pnccfe+Qv&! zq7rK)T4Dul9!xC?Nt#sbgBq)dK2&=MK2(w3gW`i&QUrYvOh8dVY|w{3sqsNUP;&K8 zs~}DK;3XzaFKU%mvE3wI(%$Xv_ zM+%2tlpQENk*^$-(}`E7lB7mh7s&E1Vhjv1xhs-Edpf_ zI9eABK}T^ou+9{XA~3xw3_+i&u+qcAW+0z4c& zFPQsK;cbhpCWGZ50@xO>gyE)Z2l`=CXD3{>B?a!{qJdciWCC2z2iLC%@1PE2PZVUM z#sr1OQbKbI8Oo-cZj>PUwC)*@>r!wJ8E5PLIFhc26Fpr0vqP7r^oTCx>f!{6Qkb-$ zW#`T?8QpiuH3Ou*28t1h1KZ{7ldT30Rq(Srg*@y96@_pMgK$e@}T8>QUaMbQqmj z<=`W5$k|ZE?dj{z+wyq6 z+LLrpleRgm$*WVa<T5#vJa=gkE`Iod1j(H7ARrpH^!>NkfL*g+P$L$>h#?!Q zd8Z!VzCDj!q&<8Ln?@E5QH}`X&soaX>2uP!X zak7~E3@v6R(Uc0G`wGUC_voERf% zQBDFWsnJss2VodT`*OL-*qN+Wd1!3LbHxPuW$s55fAUlx1?{Q~Bi+X|D1bV+KU1!k zSA*@I&P`$%hh0~gJkVG&xo`t1hHEBQ1oOoRM#!oAA@!?mohfu7k3BAB=@zEiP%MW+ z7m1LSiSx<+>8Y-2I(aSFz|6FR7N%vcq$n?n=+PBVO0npL-kH2rhOh1yi!VC1jpHHi z4f|bLek0!DFuZr}mzpqpEtu;hA+ig{Mk`IGb-RbHHFo5S!=`* z<@ZxV@Kty4{P3|&=1RcB5B+*(dfo45>N#axy`#lE)6ew#%3dNGDv&Clv@S?A?^p=^e_j(%||D@HswS%BcBNzTBzyKn7 Vs=hto(*pni002ovPDHLkV1jz3oGJhS literal 0 HcmV?d00001 diff --git a/assets/images/p4_8_car.png b/assets/images/p4_8_car.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ac37f52ed6f1c33dbd359925ffb2dcbd1c253e GIT binary patch literal 2097 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 Rp@ske002ovPDHLkV1iX_@+bfR literal 0 HcmV?d00001 diff --git a/assets/images/route2_off.png b/assets/images/route2_off.png new file mode 100644 index 0000000000000000000000000000000000000000..42ce921fb454d8f7a11862d2ca784183f6441850 GIT binary patch literal 2255 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 literal 0 HcmV?d00001 diff --git a/assets/images/route3_off.png b/assets/images/route3_off.png new file mode 100644 index 0000000000000000000000000000000000000000..7e80fb233c4215b65f894b011e4e9976a0fc1b07 GIT binary patch literal 2299 zcmVJNRCwCVnO$rgR~5(4eD3V}BO51i zoQkwIDwL243@K1omEs^Zw7lRJ)Q2JgNsENUL)!X*$6)b*Dim-YS`{cw0-}h5Nc)14 zB7qS~)22XOP-^-SvW=a(wUc;l@9yl*C;xM1X0zVxuGfu0++;F4vpe_x=6}yQ_naG| z|MR9?&%+)1*RnVbD~d9Ru6C=cij#tSNKX9Zq=4228%L)HVjQvo1HJv z+wWYV3$qL4mX}3UK?uX6mzN&jw`RcD){Yo}GOP?#y9%c$n*7FhZJ9#u$#^mh)apW8V1t2{Ysmvq+ez&xgr|FsZ>5YG1rcybeEt@*%hQ4mP z<-?o6q|^MO6ThG`m^N?gw=1tazbYW$24QcT>*%T0P9LE4> z^)sAqL~z_ZOecf!;LY08KYM^ay=yy7OuV(?ega!5+w|tSi{!Yf0N${zn>sC%aTs1xgmhjvd#%J#FkdW;=f^YxN!rb)Muf!nVXy zOB}P56~VS?8y~-q9{a&x==G^Ndg#H=(6i6J+H(5m=jO@vSjisRwzUgRW7FaiOvv}M z2=^7+d1a!0)Pw8<65}|8zya7h+kw0P{!fW#pML2A{pPp-l+Uba)A$Cb(&2z-{{9C2 z18SS5PIvCQkHJn!ty6DUkBy(Ff+K&sZS>L4(~l0Hs$TQw(a}AvmoY%{ zSQ9X}IfS0Rt(|nsK(Ck;R-!D9ky>dEuuyc{LTq2>??p zmFUdmG**~^cHF#$G&3W!W}3zUwZ?NtG%Z>g6aZe2dbKK!joq{A^9(ul<}_WpT%yfA zY3keDEke1DH<&0mqNvJ>jHKQ6&4-3WJ#Jsv`;qE>{yaUiNXyHvDBP;?n3ZygUVnRD zmc+g-odV7FFLA?4rFJ`>FX~Yn4pH0gzIz7^VH!WaV>9hUc)4-lF}eTKAKxdThVPwv z@!YEY@Dh41H%FiR*jCDRS>gjsD1hZkrC$QDK&!nOhT?SBT#Sy?{6d+~cKzPoGh z6V%;pwbhTRr|8PU5-k@hk`0lF6$7FTs!&eCN|VL|aRA=Avrkk>&WC>ZCpvWKk4>Lr z__47siYc5veV(SL^P=q8v+vQ1xUP+jfnPx^EKqL`oP_^?DFMtT$xZ#*%1al6Y~P-3 z2yo)W)T-*7#BUgoO<`z=?_9M>20n3eiVhz9y_i_BNKk~ck^?pnXU$+CwCc?9@Kbgw-dG7P7a)CH$#r0`n*_N!`$B|6&pZN!Y@5>j> z8mCX}ZMD~*{oJ7y12uZFyY@c5!rS@9YD0|FHmLYGyICr_sB7XfH3)J_O<8$fN1A13 zI!U)WTc%i?0Mrh^p7@6szAg5atRxrCe@E2i7pPU4f7{6E9J@f7?p`SABmFN?rLcgy z#~u@kQt(Tz@+VnRE?`=z$gTeEdB9&cNKQF`*PB2iIG(*Iy+hvayK;C?lq6#7|DO^{fl^Qke}H5(1&9_bMg!;G;$F=ea5%R6L4P-UA%h1yTyG zp*6C@X7O`{?O{AU)j^RDI3kW)w)40#)*w*RBdnr}63|11wc1p#N7Ilb=w>>C!@;(g zGPJ`*{};Jy0Am#=*o(Z1EoCMH|JU~Z6jf~Rs&YkgE9Hqx#izbo&2k!LP>?szM#_-9 z*%PkO9@~ZEBY|VPbL?Usg50|z4Xb}J_UJtfg}1>`BEM1;171%!4$2W6%n8Z`yvO5v zdoX^!t<9r&FYpNGX}r5&q%0IOmTVlYr6gzsCy9Wccr0cJ3RWuReX)tHX?JTFr{m}} ztD%VDO(D%pMLS&TT51<1%9J=EK_He`=Q=V&a7NxEWaTD5=>8zDGRGzBR`qBH%QWL{ zI9)2hD9KeC0}E6jV3BH`ENdP@nWid}j^o@Lo7MGg0R!}5-g)3na^6wZ;u@NjjY?Hj z3a%t0mu=oSr{hQv#H*An1c8^w{V{-zulF7`r`8PmbsYWTiM-De1B&r;;Z+3;qdjWQ zGjWEJxpdk(X4~cQdS_Vo|Ayc_M6RcC?B?m0x~6`L5w3WR=WGebbIt6mRr`+s0{{{R VV9e@wd&mF)002ovPDHLkV1n5iXXXF^ literal 0 HcmV?d00001 diff --git a/assets/images/route3_on.png b/assets/images/route3_on.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3bb995d8d36eee46573965564383fc7b577631 GIT binary patch literal 2178 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 Vs=hto(*pni002ovPDHLkV1jz3oGJhS literal 0 HcmV?d00001 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d113457..bcddbcf 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -9,7 +9,7 @@ PODS: - FMDB/standard (2.7.5) - geolocator_apple (1.2.0): - Flutter - - google_maps_flutter (0.0.1): + - google_maps_flutter_ios (0.0.1): - Flutter - GoogleMaps - GoogleMaps (4.1.0): @@ -34,7 +34,7 @@ DEPENDENCIES: - flutter_compass (from `.symlinks/plugins/flutter_compass/ios`) - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`) - - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`) + - google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) @@ -55,8 +55,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" geolocator_apple: :path: ".symlinks/plugins/geolocator_apple/ios" - google_maps_flutter: - :path: ".symlinks/plugins/google_maps_flutter/ios" + google_maps_flutter_ios: + :path: ".symlinks/plugins/google_maps_flutter_ios/ios" image_picker_ios: :path: ".symlinks/plugins/image_picker_ios/ios" path_provider_ios: @@ -74,7 +74,7 @@ SPEC CHECKSUMS: flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a geolocator_apple: cc556e6844d508c95df1e87e3ea6fa4e58c50401 - google_maps_flutter: c59fc576c0d0c7f4dc4bd63832c862d22d5a7c6d + google_maps_flutter_ios: 66201f392bf62d500f07670a30488a247b9bb5b9 GoogleMaps: 008e2c80e38605b56b560e8deb73d4194ff30bef image_picker_ios: b786a5dcf033a8336a657191401bfdf12017dabb path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 diff --git a/lib/pages/destination/destination_controller.dart b/lib/pages/destination/destination_controller.dart index 3e7060e..5c7ee71 100644 --- a/lib/pages/destination/destination_controller.dart +++ b/lib/pages/destination/destination_controller.dart @@ -30,34 +30,33 @@ class DestinationController extends GetxController { List currentSelectedDestinations = [].obs; bool checking_in = false; - List isSelected = [true].obs; + var isSelected = false.obs; BuildContext? context; List gps = ["-- stating --"].obs; List locationPermission = [" -- starting -- "].obs; + var travelMode = 0.obs; + Map matrix = {}; final IndexController indexController = Get.find(); + void getRoutePoints() { + indexController.routePoints = []; + indexController.routePointLenght.value = 0; + DestinationService.getDestinationLine(destinations)?.then((value){ + indexController.routePoints = value; + indexController.routePointLenght.value = indexController.routePoints.length; + }); + } Future getDEstinationForLatLong(double lat, double long)async { String jjjj = '{"id":1,"type":"Feature","geometry":{"type":"MultiPoint","coordinates":[[136.731357,35.370094]]},"properties":{"location_id":915101,"location_name":"柳津","category":"買い物","zip":"〒501-6100","address":"柳津町字仙右城7696-1"}}'; for(final d in destinations){ - // var geom = d["location"]["geometry"]; - // var props = d["location"]["properties"]; - // print("--props- ${d["location"]["geometry"]["coordinates"][0][1]}"); - // List geom_multi = [geom]; - // Map final_geom = {"features":[{"id":d["id"],"type":"Feature", "geometry": geom, "properties": props}]}; - // //print("----- geom : ${final_geom}"); - - // String js = json.encode(final_geom); - // //print("---features-- ${js}-----"); - // GeoJsonFeatureCollection features = await featuresFromGeoJson(js); - // GeoJsonMultiPoint p = features.collection[0].geometry as GeoJsonMultiPoint; if(lat == d.lat && long == d.lon){ return d; } @@ -145,11 +144,9 @@ class DestinationController extends GetxController { @override void onInit() async { - super.onInit(); checkPermission(); PopulateDestinations(); - //print("------ in iniit"); @@ -190,7 +187,7 @@ class DestinationController extends GetxController { StreamSubscription positionStream = Geolocator.getPositionStream(locationSettings: locationSettings).listen( (Position? position) { - if(isSelected[0]){ + if(isSelected.value){ double czoom = indexController.rogMapController!.zoom; indexController.rogMapController!.move(LatLng(position!.latitude, position!.longitude), czoom); //String user_id = indexController.currentUser[0]["user"]["id"].toString(); @@ -209,6 +206,7 @@ class DestinationController extends GetxController { locationPermission.add(err.toString()); } + super.onInit(); } @@ -266,10 +264,10 @@ class DestinationController extends GetxController { void PopulateDestinations(){ print("--------- destination controller populsting destinations ----------- ::::::"); - destinations.clear(); - destinationCount.value = 0; DatabaseHelper db = DatabaseHelper.instance; db.getDestinations().then((value){ + destinations.clear(); + destinationCount.value = 0; for(Destination d in value){ for(Destination s in currentSelectedDestinations){ if(d.location_id == s.location_id){ @@ -280,27 +278,24 @@ class DestinationController extends GetxController { destinations.add(d); } // destinationCount.value = 0; - destinationCount.value = destinations.length; print("------ destination controller destinationcount-------- ${destinationCount}-------- :::::"); MatrixService.getDestinations(value).then((mat){ - print(mat); + print(" matrix is ------- ${mat}"); matrix = mat; + getRoutePoints(); + destinationCount.value = destinations.length; + }); }); } - void makeOrder(int action_id, int order, String dir){ - DestinationService.updateOrder(action_id, order, dir).then((value){ - //print("----action value----${value}"); - PopulateDestinations(); - destination_index_data.clear(); - }); - + void makeOrder(String locationId){ + } diff --git a/lib/pages/destination/destination_page.dart b/lib/pages/destination/destination_page.dart index d7a54cb..bad5142 100644 --- a/lib/pages/destination/destination_page.dart +++ b/lib/pages/destination/destination_page.dart @@ -12,15 +12,9 @@ import 'package:rogapp/routes/app_pages.dart'; import 'package:rogapp/widgets/destination_widget.dart'; import 'package:timeline_tile/timeline_tile.dart'; +class DestnationPage extends StatelessWidget { + DestnationPage({Key? key}) : super(key: key); -class DestinationPage extends StatefulWidget { - DestinationPage({ Key? key }) : super(key: key); - - @override - State createState() => _DestinationPageState(); -} - -class _DestinationPageState extends State { final DestinationController destinationController = Get.find(); final IndexController indexController = Get.find(); @@ -47,14 +41,20 @@ class _DestinationPageState extends State { } } - @override - void initState() { - //destinationController.context = context; - //destinationController.PopulateDestinations(); - super.initState(); + Widget getRoutingImage(int route){ + switch (route) { + case 0: + return Image(image: AssetImage('assets/images/p4_9_man.png'), width: 35.0,); + case 1: + return Image(image: AssetImage('assets/images/p4_8_car.png'), width: 35.0,); + case 2: + return Image(image: AssetImage('assets/images/p4_10_train.png'), width: 35.0,); + default: + return Image(image: AssetImage('assets/images/p4_9_man.png'), width: 35.0,); + } } - @override +@override Widget build(BuildContext context) { final ColorScheme colorScheme = Theme.of(context).colorScheme; final Color oddItemColor = colorScheme.primary.withOpacity(0.05); @@ -68,13 +68,72 @@ class _DestinationPageState extends State { drawer: DrawerPage(), bottomNavigationBar: BottomAppBar( child: Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded(child: Container(width: 0, height: 0,),), - const Expanded(child: Text('')), - Expanded(child: IconButton(icon: const Icon(Icons.travel_explore), onPressed: (){ - indexController.switchPage(AppPages.INITIAL); - }),), + Padding( + padding: const EdgeInsets.only(left:13.0), + child: InkWell( + child: Obx((() => getRoutingImage(destinationController.travelMode.value))), + onTap: (){ + Get.bottomSheet( + Obx(() => + ListView( + children: [ + Padding( + padding: const EdgeInsets.only(top:30.0, bottom: 30), + child: Center(child: Text("select_travel_mode".tr, style: TextStyle(fontSize: 22.0, color:Colors.red, fontWeight:FontWeight.bold),),), + ), + ListTile( + selected: destinationController.travelMode == 0 ? true : false, + selectedTileColor: Colors.amber.shade200, + leading: Image(image: AssetImage('assets/images/p4_9_man.png'),), + title: Text("walking".tr), + onTap:(){ + destinationController.travelMode.value = 0; + destinationController.PopulateDestinations(); + Get.back(); + }, + ), + ListTile( + selected: destinationController.travelMode == 1 ? true : false, + selectedTileColor: Colors.amber.shade200, + leading: Image(image: AssetImage('assets/images/p4_8_car.png'),), + title: Text("driving".tr), + onTap:(){ + destinationController.travelMode.value = 1; + destinationController.PopulateDestinations(); + Get.back(); + }, + ), + ListTile( + selected: destinationController.travelMode == 2 ? true : false, + selectedTileColor: Colors.amber.shade200, + leading: Image(image: AssetImage('assets/images/p4_10_train.png'),), + title: Text("transit".tr), + onTap:(){ + destinationController.travelMode.value = 2; + destinationController.PopulateDestinations(); + Get.back(); + }, + ), + ], + + ), + ), + isScrollControlled:false, + backgroundColor: Colors.white, + ); + //destinationController.PopulateDestinations(); + } + ), + ) + , + IconButton( + icon: const Icon(Icons.travel_explore, size: 35,), + onPressed: (){ + indexController.switchPage(AppPages.INITIAL); + } + ), ], ), ), @@ -84,7 +143,12 @@ class _DestinationPageState extends State { indexController.toggleDestinationMode(); }, tooltip: 'Increment', - child: const Icon(Icons.document_scanner), + child: Obx(() => + indexController.desination_mode == 1 ? + Image(image: AssetImage('assets/images/list2.png')) + : + Image(image: AssetImage('assets/images/map.png')) + ), elevation: 4.0, ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, @@ -92,21 +156,19 @@ class _DestinationPageState extends State { automaticallyImplyLeading: true, title: Text("app_title".tr), actions: [ - //Obx(() => + Obx(() => ToggleButtons( disabledColor: Colors.grey.shade200, selectedColor: Colors.red, children: [ - Icon(Icons.explore + Icon(Icons.explore, size: 35.0, )], onPressed: (int index) { - setState(() { - destinationController.isSelected[index] = !destinationController.isSelected[index]; - }); + destinationController.isSelected.value = !destinationController.isSelected.value; }, - isSelected: destinationController.isSelected, + isSelected: [destinationController.isSelected.value], ), - //), + ), // IconButton(onPressed: (){ // showCurrentPosition(); // }, @@ -122,4 +184,194 @@ class _DestinationPageState extends State { ); } -} \ No newline at end of file +} + + +// class DestinationPage extends StatefulWidget { +// DestinationPage({ Key? key }) : super(key: key); + +// @override +// State createState() => _DestinationPageState(); +// } + +// class DestinationPage extends State { +// final DestinationController destinationController = Get.find(); + +// final IndexController indexController = Get.find(); + +// final List _items = List.generate(50, (int index) => index); + +// DestinationWidget dest = DestinationWidget(); +// DestinationMapPage destMap = DestinationMapPage(); + +// Future showCurrentPosition() async { +// LocationPermission permission = await Geolocator.checkPermission(); +// if (permission != LocationPermission.whileInUse || +// permission != LocationPermission.always) { +// permission = await Geolocator.requestPermission(); +// } +// Position position = await Geolocator.getCurrentPosition( +// desiredAccuracy: LocationAccuracy.high); +// indexController.rogMapController?.move(LatLng(position.latitude, position.longitude), 14); +// } + +// Image getImage(int index){ +// if(destinationController.destinations[index].photos == null || destinationController.destinations[index].photos == ""){ +// return Image(image: AssetImage('assets/images/empty_image.png')); +// } +// else{ +// return Image(image: NetworkImage(destinationController.destinations[index].photos!)); +// } +// } + +// Widget getRoutingImage(int route){ +// switch (route) { +// case 0: +// return Image(image: AssetImage('assets/images/p4_9_man.png'), width: 27.0,); +// case 1: +// return Image(image: AssetImage('assets/images/p4_8_car.png'), width: 27.0,); +// case 2: +// return Image(image: AssetImage('assets/images/p4_10_train.png'), width: 27.0,); +// default: +// return Image(image: AssetImage('assets/images/p4_9_man.png'), width: 27.0,); +// } +// } + +// @override +// void initState() { +// //destinationController.context = context; +// //destinationController.PopulateDestinations(); +// super.initState(); +// } + +// @override +// Widget build(BuildContext context) { +// final ColorScheme colorScheme = Theme.of(context).colorScheme; +// final Color oddItemColor = colorScheme.primary.withOpacity(0.05); +// final Color evenItemColor = colorScheme.primary.withOpacity(0.15); +// return WillPopScope( +// onWillPop: () async { +// indexController.switchPage(AppPages.INITIAL); +// return false; +// }, +// child: Scaffold( +// drawer: DrawerPage(), +// bottomNavigationBar: BottomAppBar( +// child: Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// Padding( +// padding: const EdgeInsets.only(left:13.0), +// child: InkWell( +// child: Obx((() => getRoutingImage(destinationController.travelMode.value))), +// onTap: (){ +// Get.bottomSheet( +// Obx(() => +// ListView( +// children: [ +// Padding( +// padding: const EdgeInsets.only(top:30.0, bottom: 30), +// child: Center(child: Text("select_travel_mode".tr, style: TextStyle(fontSize: 22.0, color:Colors.red, fontWeight:FontWeight.bold),),), +// ), +// ListTile( +// selected: destinationController.travelMode == 0 ? true : false, +// selectedTileColor: Colors.amber.shade200, +// leading: Image(image: AssetImage('assets/images/p4_9_man.png'),), +// title: Text("walking".tr), +// onTap:(){ +// destinationController.travelMode.value = 0; +// Get.back(); +// }, +// ), +// ListTile( +// selected: destinationController.travelMode == 1 ? true : false, +// selectedTileColor: Colors.amber.shade200, +// leading: Image(image: AssetImage('assets/images/p4_8_car.png'),), +// title: Text("driving".tr), +// onTap:(){ +// destinationController.travelMode.value = 1; +// Get.back(); +// }, +// ), +// ListTile( +// selected: destinationController.travelMode == 2 ? true : false, +// selectedTileColor: Colors.amber.shade200, +// leading: Image(image: AssetImage('assets/images/p4_10_train.png'),), +// title: Text("transit".tr), +// onTap:(){ +// destinationController.travelMode.value = 2; +// Get.back(); +// }, +// ), +// ], + +// ), +// ), +// isScrollControlled:false, +// backgroundColor: Colors.white, +// ); +// destinationController.PopulateDestinations(); +// destMap. +// } +// ), +// ) +// , +// IconButton( +// icon: const Icon(Icons.travel_explore), +// onPressed: (){ +// indexController.switchPage(AppPages.INITIAL); +// } +// ), +// ], +// ), +// ), +// floatingActionButton: FloatingActionButton( +// onPressed: (){ +// //print("######"); +// indexController.toggleDestinationMode(); +// }, +// tooltip: 'Increment', +// child: Obx(() => +// indexController.desination_mode == 1 ? +// Image(image: AssetImage('assets/images/list2.png')) +// : +// Image(image: AssetImage('assets/images/map.png')) +// ), +// elevation: 4.0, +// ), +// floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, +// appBar:AppBar( +// automaticallyImplyLeading: true, +// title: Text("app_title".tr), +// actions: [ +// //Obx(() => +// ToggleButtons( +// disabledColor: Colors.grey.shade200, +// selectedColor: Colors.red, +// children: [ +// Icon(Icons.explore +// )], +// onPressed: (int index) { +// setState(() { +// destinationController.isSelected[index] = !destinationController.isSelected[index]; +// }); +// }, +// isSelected: destinationController.isSelected, +// ), +// //), +// // IconButton(onPressed: (){ +// // showCurrentPosition(); +// // }, +// // icon: Icon(Icons.location_on_outlined)) +// ], +// ), +// body: Obx(() => +// indexController.desination_mode.value == 0 ? +// dest: +// destMap +// ) +// ), +// ); + +// } +// } \ No newline at end of file diff --git a/lib/pages/destination_map/destination_map_page.dart b/lib/pages/destination_map/destination_map_page.dart index 7b3b79d..cfb1bd2 100644 --- a/lib/pages/destination_map/destination_map_page.dart +++ b/lib/pages/destination_map/destination_map_page.dart @@ -12,22 +12,16 @@ import 'package:get/get.dart'; import 'package:latlong2/latlong.dart'; import 'package:rogapp/model/destination.dart'; import 'package:rogapp/pages/destination/destination_controller.dart'; -//import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/services/destination_service.dart'; import 'package:rogapp/widgets/bottom_sheet_new.dart'; import 'package:rogapp/widgets/bottom_sheet_widget.dart'; import 'package:rogapp/widgets/bread_crum_widget.dart'; -class DestinationMapPage extends StatefulWidget { - DestinationMapPage({ Key? key }) : super(key: key); +class DestinationMapPage extends StatelessWidget { + DestinationMapPage({Key? key}) : super(key: key); - @override - State createState() => _DestinationMapPageState(); -} - -class _DestinationMapPageState extends State { final IndexController indexController = Get.find(); final DestinationController destinationController = Get.find(); @@ -35,7 +29,7 @@ class _DestinationMapPageState extends State { final PopupController _popupLayerController = PopupController(); List? getPoints(){ - //print("##### --- route point ${indexController.routePoints.length}"); + print("##### --- route point ${indexController.routePoints.length}"); List pts = []; for(PointLatLng p in indexController.routePoints){ LatLng l = LatLng(p.latitude, p.longitude); @@ -63,8 +57,6 @@ class _DestinationMapPageState extends State { int index = -1; for (int i = 0; i < destinationController.destinations.length; i++) { Destination d = destinationController.destinations[i]; - //for(Destination d in destinationController.destinations){ - //print("-----lat ${lat}, ----- lon ${lan}"); Marker m = Marker( point: LatLng(d.lat!, d.lon!), anchorPos: AnchorPos.align(AnchorAlign.center), @@ -80,8 +72,7 @@ class _DestinationMapPageState extends State { indexController.currentDestinationFeature.add(d); //indexController.getAction(); - showModalBottomSheet(context: context, isScrollControlled: true, - //builder:((context) => BottomSheetWidget()) + showModalBottomSheet(context: Get.context!, isScrollControlled: true, builder:((context) => BottomSheetNew()) ); } @@ -111,36 +102,6 @@ class _DestinationMapPageState extends State { ], ), ); - - //return Icon(Icons.pin_drop); - // return IconButton( - // onPressed: ()async { - // Destination? fs = await destinationController.getDEstinationForLatLong(d.lat!, d.lon!); - // print("-- Destination is --- ${fs!.name} ------"); - // if(fs != null){ - // if(indexController.currentDestinationFeature.length > 0) { - // indexController.currentDestinationFeature.clear(); - // } - // indexController.currentDestinationFeature.add(fs); - // //indexController.getAction(); - - // showModalBottomSheet(context: context, isScrollControlled: true, - // //builder:((context) => BottomSheetWidget()) - // builder:((context) => BottomSheetNew()) - // ); - // } - // }, - // icon: Container( - // width: 60, - // height: 60, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(d.checkin_radious ?? 0), - // color: Colors.transparent, - // border: BoxBorder() - // ), - // child: Icon(Icons.pin_drop) - // ) - // ); }); @@ -149,19 +110,6 @@ class _DestinationMapPageState extends State { return pts; } - @override - void initState() { - - DestinationService.getDestinationLine(destinationController.destinations)?.then((value){ - //print("---- loading destination points ------ ${value}"); - indexController.routePoints.clear(); - setState(() { - indexController.routePoints = value; - }); - }); - super.initState(); - } - @override Widget build(BuildContext context) { return Obx((() => @@ -177,19 +125,6 @@ class _DestinationMapPageState extends State { child: TravelMap(), ), - // Positioned( - // bottom: 200, - // left: 10, - // child: Container( - // color: Colors.white, - // child: Row( - // children: [ - // Text(destinationController.gps[0]), - // Text(destinationController.locationPermission[0]) - // ], - // ), - // ) - // ), ], ) )); @@ -204,14 +139,9 @@ class _DestinationMapPageState extends State { indexController.is_rog_mapcontroller_loaded.value = true; subscription = indexController.rogMapController!.mapEventStream.listen((MapEvent mapEvent) { if (mapEvent is MapEventMoveStart) { - //print(DateTime.now().toString() + ' [MapEventMoveStart] START'); - // do something } if (mapEvent is MapEventMoveEnd) { - destinationController.isSelected.clear(); - destinationController.isSelected.add(false); - //print(DateTime.now().toString() + ' [MapEventMoveStart] END'); - //indexController.loadLocationsBound(); + destinationController.isSelected.value = false; } }); }); @@ -220,7 +150,6 @@ class _DestinationMapPageState extends State { zoom: 1, maxZoom: 42, interactiveFlags: InteractiveFlag.pinchZoom | InteractiveFlag.drag, - //plugins: [LocationMarkerPlugin(),] ), children: [ TileLayerWidget( @@ -229,32 +158,22 @@ class _DestinationMapPageState extends State { subdomains: ['a', 'b', 'c'], ), ), - //Obx(() => - indexController.routePoints.length > 0 ? + Obx(() => + indexController.routePointLenght > 0 ? PolylineLayerWidget( options: PolylineLayerOptions( polylines: [ Polyline( points: getPoints()!, strokeWidth: 6.0, - color: Colors.indigo), + color: Colors.indigo + ), ], ), ) : Container(), - //), - // PopupMarkerLayerWidget( - // options: PopupMarkerLayerOptions( - // popupController: _popupLayerController, - // markers: _markers, - // markerRotateAlignment: - // PopupMarkerLayerOptions.rotationAlignmentFor(AnchorAlign.top), - // popupBuilder: (BuildContext context, Marker marker) => - - // examplePopup(marker), - // ), - // ), + ), LocationMarkerLayerWidget(), MarkerLayerWidget( options: MarkerLayerOptions( @@ -265,4 +184,261 @@ class _DestinationMapPageState extends State { ); } -} \ No newline at end of file +} + + + + +// class DestinationMapPage extends StatefulWidget { +// DestinationMapPage({ Key? key }) : super(key: key); + + +// @override +// State createState() => _DestinationMapPageState(); +// } + +//class _DestinationMapPageState extends State { + // final IndexController indexController = Get.find(); + + // final DestinationController destinationController = Get.find(); + // StreamSubscription? subscription; + // final PopupController _popupLayerController = PopupController(); + + // List? getPoints(List ptts){ + // //print("##### --- route point ${indexController.routePoints.length}"); + // List pts = []; + // for(PointLatLng p in ptts){ + // LatLng l = LatLng(p.latitude, p.longitude); + // pts.add(l); + // } + // return pts; + // } + + // String getDisplaytext(Destination dp){ + // String txt = ""; + // if(dp.cp! > 0){ + // txt = "${dp.cp}"; + // if(dp.checkin_point != null && dp.checkin_point! > 0){ + // txt = txt + "{${dp.checkin_point}}"; + // } + // if(dp.buy_point != null && dp.buy_point! > 0){ + // txt = txt + "[${dp.buy_point}]"; + // } + // } + // return txt; + // } + + // List? getMarkers() { + // List pts = []; + // int index = -1; + // for (int i = 0; i < destinationController.destinations.length; i++) { + // Destination d = destinationController.destinations[i]; + // //for(Destination d in destinationController.destinations){ + // //print("-----lat ${lat}, ----- lon ${lan}"); + // Marker m = Marker( + // point: LatLng(d.lat!, d.lon!), + // anchorPos: AnchorPos.align(AnchorAlign.center), + // builder:(cts){ + + // return InkWell( + // onTap: (){ + // print("-- Destination is --- ${d.name} ------"); + // if(d != null){ + // if(indexController.currentDestinationFeature.length > 0) { + // indexController.currentDestinationFeature.clear(); + // } + // indexController.currentDestinationFeature.add(d); + // //indexController.getAction(); + + // showModalBottomSheet(context: context, isScrollControlled: true, + // //builder:((context) => BottomSheetWidget()) + // builder:((context) => BottomSheetNew()) + // ); + // } + // }, + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Container( + // width:20, + // height:20, + // decoration: BoxDecoration( + // color: Colors.red, + // shape: BoxShape.circle, + // border: new Border.all( + // color: Colors.white, + // width: d.checkin_radious != null ? d.checkin_radious! : 1, + // ), + // ), + // child: new Center( + // child: new Text( + // (i + 1).toString(), + // style: TextStyle(color: Colors.white), + // ), + // ), + // ), + // Container( color: Colors.yellow, child: Text(getDisplaytext(d), style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, overflow: TextOverflow.visible),)), + // ], + // ), + // ); + + // //return Icon(Icons.pin_drop); + // // return IconButton( + // // onPressed: ()async { + // // Destination? fs = await destinationController.getDEstinationForLatLong(d.lat!, d.lon!); + // // print("-- Destination is --- ${fs!.name} ------"); + // // if(fs != null){ + // // if(indexController.currentDestinationFeature.length > 0) { + // // indexController.currentDestinationFeature.clear(); + // // } + // // indexController.currentDestinationFeature.add(fs); + // // //indexController.getAction(); + + // // showModalBottomSheet(context: context, isScrollControlled: true, + // // //builder:((context) => BottomSheetWidget()) + // // builder:((context) => BottomSheetNew()) + // // ); + // // } + // // }, + // // icon: Container( + // // width: 60, + // // height: 60, + // // decoration: BoxDecoration( + // // borderRadius: BorderRadius.circular(d.checkin_radious ?? 0), + // // color: Colors.transparent, + // // border: BoxBorder() + // // ), + // // child: Icon(Icons.pin_drop) + // // ) + // // ); + + // }); + + // pts.add(m); + // } + // return pts; + // } + + // @override + // void initState() { + + // //indexController.routePoints.clear(); + // DestinationService.getDestinationLine(destinationController.destinations)?.then((value){ + // //print("---- loading destination points ------ ${value}"); + // setState(() { + // indexController.routePoints = value; + // }); + // }); + // super.initState(); + // } + + // void reload(){ + // setState(() { + + // }); + // } + + // @override + // Widget build(BuildContext context) { + // return Obx((() => + // Stack( + // children: [ + // indexController.is_rog_mapcontroller_loaded.value == false ? + // Center(child: CircularProgressIndicator()) + // : + // BreadCrumbWidget(mapController:indexController.rogMapController), + // Padding( + // padding: const EdgeInsets.only(top:50.0), + // //child: TravelMap(), + // child: + // TravelMap(indexController.routePoints), + // ), + // // Positioned( + // // bottom: 200, + // // left: 10, + // // child: Container( + // // color: Colors.white, + // // child: Row( + // // children: [ + // // Text(destinationController.gps[0]), + // // Text(destinationController.locationPermission[0]) + // // ], + // // ), + // // ) + // // ), + // ], + // ) + // )); + // } + + // FlutterMap TravelMap(List ptts) { + // return FlutterMap( + // options: MapOptions( + // onMapCreated: (c){ + // indexController.rogMapController = c; + // indexController.rogMapController!.onReady.then((_) { + // indexController.is_rog_mapcontroller_loaded.value = true; + // subscription = indexController.rogMapController!.mapEventStream.listen((MapEvent mapEvent) { + // if (mapEvent is MapEventMoveStart) { + // //print(DateTime.now().toString() + ' [MapEventMoveStart] START'); + // // do something + // } + // if (mapEvent is MapEventMoveEnd) { + // destinationController.isSelected.value = false; + // //print(DateTime.now().toString() + ' [MapEventMoveStart] END'); + // //indexController.loadLocationsBound(); + // } + // }); + // }); + // } , + // bounds: indexController.currentBound.length > 0 ? indexController.currentBound[0]: LatLngBounds.fromPoints([LatLng(35.03999881162295, 136.40587119778962), LatLng(36.642756778706904, 137.95226720406063)]), + // zoom: 1, + // maxZoom: 42, + // interactiveFlags: InteractiveFlag.pinchZoom | InteractiveFlag.drag, + // //plugins: [LocationMarkerPlugin(),] + // ), + // children: [ + // TileLayerWidget( + // options: TileLayerOptions( + // urlTemplate: 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', + // subdomains: ['a', 'b', 'c'], + // ), + // ), + // //Obx(() => + // indexController.routePoints.length > 0 ? + // PolylineLayerWidget( + // options: PolylineLayerOptions( + // polylines: [ + // Polyline( + // points: getPoints(ptts)!, + // strokeWidth: 6.0, + // color: Colors.indigo + // ), + // ], + // ), + // ) + // : + // Container(), + // //), + // // PopupMarkerLayerWidget( + // // options: PopupMarkerLayerOptions( + // // popupController: _popupLayerController, + // // markers: _markers, + // // markerRotateAlignment: + // // PopupMarkerLayerOptions.rotationAlignmentFor(AnchorAlign.top), + // // popupBuilder: (BuildContext context, Marker marker) => + + // // examplePopup(marker), + // // ), + // // ), + // LocationMarkerLayerWidget(), + // MarkerLayerWidget( + // options: MarkerLayerOptions( + // markers: getMarkers()! + // ), + // ), + // ], + + // ); + // } +//} \ No newline at end of file diff --git a/lib/pages/drawer/drawer_page.dart b/lib/pages/drawer/drawer_page.dart index 422ad90..f502f2c 100644 --- a/lib/pages/drawer/drawer_page.dart +++ b/lib/pages/drawer/drawer_page.dart @@ -1,14 +1,20 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/routes/app_pages.dart'; +import 'package:url_launcher/url_launcher.dart'; class DrawerPage extends StatelessWidget { DrawerPage({ Key? key }) : super(key: key); final IndexController indexController = Get.find(); + void _launchURL(url) async { + if (!await launch(url)) throw 'Could not launch $url'; + } + @override Widget build(BuildContext context) { return SafeArea( @@ -47,7 +53,7 @@ class DrawerPage extends StatelessWidget { leading: const Icon(Icons.login), title: Text("logout".tr), onTap: (){ - indexController.currentUser.clear(); + indexController.logout(); Get.toNamed(AppPages.TRAVEL); }, ) @@ -88,7 +94,9 @@ class DrawerPage extends StatelessWidget { ListTile( leading: const Icon(Icons.featured_video), title: Text("rog_web".tr), - onTap: (){}, + onTap: (){ + _launchURL("https://www.gifuai.net/?page_id=4425"); + }, ) : Container(width: 0, height: 0,), // ListTile( diff --git a/lib/pages/index/index_binding.dart b/lib/pages/index/index_binding.dart index 2d969ff..6202ebb 100644 --- a/lib/pages/index/index_binding.dart +++ b/lib/pages/index/index_binding.dart @@ -1,6 +1,7 @@ import 'package:flutter_map/plugin_api.dart'; import 'package:get/get.dart'; +import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/index/index_controller.dart'; class IndexBinding extends Bindings { diff --git a/lib/pages/index/index_controller.dart b/lib/pages/index/index_controller.dart index 77bfa30..4803fe8 100644 --- a/lib/pages/index/index_controller.dart +++ b/lib/pages/index/index_controller.dart @@ -11,7 +11,6 @@ import 'package:rogapp/model/destination.dart'; import 'package:rogapp/pages/destination/destination_binding.dart'; import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/destination/destination_page.dart'; -import 'package:rogapp/pages/destination_map/destination_map_page.dart'; import 'package:rogapp/routes/app_pages.dart'; import 'package:rogapp/services/action_service.dart'; import 'package:rogapp/services/auth_service.dart'; @@ -36,6 +35,7 @@ class IndexController extends GetxController { List> currentUser = >[].obs; List currentAction = [].obs; List routePoints = [].obs; + var routePointLenght = 0.obs; var is_loading = false.obs; @@ -94,7 +94,7 @@ class IndexController extends GetxController { case AppPages.TRAVEL : { rog_mode.value = 1; //Get.back(); - Get.off(DestinationPage(), binding: DestinationBinding()); + Get.off(DestnationPage(), binding: DestinationBinding()); } break; @@ -199,6 +199,18 @@ void login(String email, String password, BuildContext context){ }); } + void logout() async{ + locations.clear(); + DatabaseHelper db = DatabaseHelper.instance; + db.deleteAllDestinations().then((value){ + DestinationController destinationController = Get.find(); + if(destinationController != null){ + destinationController.PopulateDestinations(); + } + }); + currentUser.clear(); + } + void register(String email, String password, BuildContext context){ AuthService.register(email, password).then((value){ if(value.isNotEmpty){ diff --git a/lib/pages/index/index_page.dart b/lib/pages/index/index_page.dart index 30bd5cb..6aac0d2 100644 --- a/lib/pages/index/index_page.dart +++ b/lib/pages/index/index_page.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rogapp/model/destination.dart'; +import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/drawer/drawer_page.dart'; import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/routes/app_pages.dart'; @@ -19,6 +20,7 @@ class IndexPage extends GetView { IndexPage({Key? key}) : super(key: key); final IndexController indexController = Get.find(); + final DestinationController destinationController = Get.find(); @override Widget build(BuildContext context) { @@ -59,13 +61,31 @@ class IndexPage extends GetView { ), bottomNavigationBar: BottomAppBar( child: Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.end, children: [ - Expanded(child: Container(width: 0, height: 0,),), - const Expanded(child: Text('')), - Expanded(child: IconButton(icon: const Icon(Icons.travel_explore), onPressed: (){ - indexController.switchPage(AppPages.TRAVEL); - }),), + Padding( + padding: const EdgeInsets.only(right: 10.0, top: 4.0, bottom: 4.0), + child: InkWell( + child: + Obx(() => + destinationController.isSelected == true ? + Padding( + padding: const EdgeInsets.only(right: 10.0, top: 4.0, bottom: 4.0), + child: InkWell( + child: Image(image: AssetImage('assets/images/route3_off.png'), width: 35, height: 35,), + onTap: (){Get.toNamed(AppPages.DESTINATION_MAP);}, + ), + ) : + Padding( + padding: const EdgeInsets.only(right: 10.0, top: 4.0, bottom: 4.0), + child: InkWell( + child: Image(image: AssetImage('assets/images/route2_on.png'),width: 35, height: 35,), + onTap: (){Get.toNamed(AppPages.DESTINATION_MAP);}, + ), + ) + ) + ), + ), ], ), ), @@ -78,7 +98,12 @@ class IndexPage extends GetView { }, tooltip: 'Increment', - child: const Icon(Icons.document_scanner), + child: Obx(() => + indexController.mode == 0 ? + Image(image: AssetImage('assets/images/list2.png')) + : + Image(image: AssetImage('assets/images/map.png')), + ), elevation: 4.0, ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, diff --git a/lib/pages/login/login_page.dart b/lib/pages/login/login_page.dart index d44f438..bef5ff9 100644 --- a/lib/pages/login/login_page.dart +++ b/lib/pages/login/login_page.dart @@ -63,12 +63,6 @@ class LoginPage extends StatelessWidget { padding: EdgeInsets.only(top: 3,left: 3), decoration: BoxDecoration( borderRadius: BorderRadius.circular(40), - border: Border( - bottom: BorderSide(color: Colors.black), - top: BorderSide(color: Colors.black), - right: BorderSide(color: Colors.black), - left: BorderSide(color: Colors.black) - ) ), child: Obx((() => indexController.is_loading == true ? MaterialButton( diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index fd98d57..fcbed9e 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -81,7 +81,7 @@ class AppPages { ), GetPage( name: Routes.TRAVEL, - page: () => DestinationPage(), + page: () => DestnationPage(), binding: DestinationBinding(), ), GetPage( @@ -91,7 +91,7 @@ class AppPages { ), GetPage( name: Routes.DESTINATION_MAP, - page: () => DestinationPage(), + page: () => DestnationPage(), //binding: DestinationBinding(), ), GetPage( diff --git a/lib/services/destination_service.dart b/lib/services/destination_service.dart index 525b1c7..d0acace 100644 --- a/lib/services/destination_service.dart +++ b/lib/services/destination_service.dart @@ -1,8 +1,10 @@ import 'dart:convert'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; +import 'package:get/get.dart'; //import 'package:google_maps_webservice/directions.dart'; import 'package:http/http.dart' as http; import 'package:rogapp/model/destination.dart'; +import 'package:rogapp/pages/destination/destination_controller.dart'; import '../utils/const.dart'; @@ -92,8 +94,20 @@ class DestinationService{ wayPoints.add(pwp); i+=1; } + + final DestinationController destinationController = Get.find(); + int trav_mode = destinationController.travelMode.value; + TravelMode _mode = TravelMode.walking; + if(trav_mode == 1){ + _mode = TravelMode.driving; + } + else if(trav_mode == 2) { + _mode = TravelMode.transit; + } + + //PolylineResult result = await polylinePoints.getRouteBetweenCoordinates("AIzaSyAUBI1ablMKuJwGj2-kSuEhvYxvB1A-mOE", PointLatLng(35.389282, 136.498027), PointLatLng(36.285848, 137.575186)); - PolylineResult result = await polylinePoints.getRouteBetweenCoordinates("AIzaSyAUBI1ablMKuJwGj2-kSuEhvYxvB1A-mOE", origin,dest, travelMode: TravelMode.driving, wayPoints: wayPoints); + PolylineResult result = await polylinePoints.getRouteBetweenCoordinates("AIzaSyAUBI1ablMKuJwGj2-kSuEhvYxvB1A-mOE", origin,dest, travelMode: _mode, wayPoints: wayPoints); //print("#####@@@@@ ${result.points}"); return result.points; } diff --git a/lib/services/maxtrix_service.dart b/lib/services/maxtrix_service.dart index acc7aa9..03c6473 100644 --- a/lib/services/maxtrix_service.dart +++ b/lib/services/maxtrix_service.dart @@ -1,13 +1,17 @@ import 'dart:convert'; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:rogapp/model/destination.dart'; +import 'package:rogapp/pages/destination/destination_controller.dart'; class MatrixService{ static Future> getDestinations(List destinations) async { + final DestinationController destinationController = Get.find(); + String locs = ""; String origin = ""; int i = 0; @@ -24,10 +28,21 @@ class MatrixService{ i++; } - //print(locs); + String _mode = "walking"; + switch (destinationController.travelMode.value) { + case 1: + _mode = "driving"; + break; + case 2: + _mode = "transit"; + break; + default: + _mode = "walking"; + break; + } Map cats = {}; - String url = "https://maps.googleapis.com/maps/api/distancematrix/json?destinations=${locs}&origins=${origin}&key=AIzaSyAUBI1ablMKuJwGj2-kSuEhvYxvB1A-mOE"; + String url = "https://maps.googleapis.com/maps/api/distancematrix/json?destinations=${locs}&mode=${_mode}&origins=${origin}&key=AIzaSyAUBI1ablMKuJwGj2-kSuEhvYxvB1A-mOE"; print(url); final http.Response response = await http.get( Uri.parse(url), diff --git a/lib/utils/const.dart b/lib/utils/const.dart index e837171..77df041 100644 --- a/lib/utils/const.dart +++ b/lib/utils/const.dart @@ -4,9 +4,10 @@ class ConstValues{ static const server_uri = "http://container.intranet.sumasen.net:8100"; static const dev_server = "http://localhost:8100"; - static const dev_ip_server = "http://192.168.8.103:8100"; + static const dev_ip_server = "http://192.168.8.100:8100"; + static const dev_home_ip_server = "http://192.168.1.10:8100"; static String currentServer(){ - return dev_ip_server; + return server_uri; } } diff --git a/lib/utils/database_helper.dart b/lib/utils/database_helper.dart index 3a31be1..96063fb 100644 --- a/lib/utils/database_helper.dart +++ b/lib/utils/database_helper.dart @@ -66,17 +66,22 @@ class DatabaseHelper{ return destList; } - Future deleteDestination(int location_id) async { + Future deleteDestination(int location_id) async { Database db = await instance.database; var dest = await db.delete('destination', where: "location_id = ${location_id}"); int ret = dest > 0 ? dest : -1; return ret; } + Future deleteAllDestinations() async { + Database db = await instance.database; + await db.delete('destination'); + } + FutureisAlreadyAvailable(int location_id) async{ Database db = await instance.database; - var dest = await db.delete('destination', where: "location_id = ${location_id}"); - return dest > 0 ? true : false; + var dest = await db.query('destination', where: "location_id = ${location_id}"); + return dest.length > 0 ? true : false; } Future insertDestination(Destination dest) async { @@ -108,6 +113,42 @@ class DatabaseHelper{ ); } + Future updateOrder(Destination d, int dir)async { + Database db = await instance.database; + var target = await db.query('destination', where: "list_order = ${d.list_order! + dir}"); + var dest = await db.query('destination', where: "location_id = ${d.location_id}"); + if(target.isNotEmpty){ + + List target_indb = target.isNotEmpty + ? target.map((e) => Destination.fromMap(e)).toList() : []; + + List dest_indb = dest.isNotEmpty + ? dest.map((e) => Destination.fromMap(e)).toList() : []; + + Map row_target = { + "list_order": d.list_order + }; + + Map row_des = { + "list_order": dest_indb[0].list_order + }; + + await db.update( + "destination", + row_target, + where: 'location_id = ?', + whereArgs: [target_indb[0]!.location_id] + ); + + await db.update( + "destination", + row_des, + where: 'location_id = ?', + whereArgs: [dest_indb[0]!.location_id] + ); + } + } + // Future getPending() async{ // Database db = await instance.database; // return await Sqflite.firstIntValue(await db.rawQuery("SELECT COUNT(*) FROM incidents")); diff --git a/lib/utils/string_values.dart b/lib/utils/string_values.dart index e24954d..8de8082 100644 --- a/lib/utils/string_values.dart +++ b/lib/utils/string_values.dart @@ -31,7 +31,11 @@ class StringValues extends Translations{ 'no_values': 'No Values', 'email_and_password_required': 'Email and password required', 'rogaining_user_need_tosign_up': "Rogaining participants do need to sign up.", - 'add_location': 'Add Location' + 'add_location': 'Add Location', + 'select_travel_mode':'Select your travel mode', + 'walking':'Walking', + 'driving': 'Driving', + 'transit': 'Transit' }, 'ja_JP': { 'drawer_title':'ロゲイニング参加者はログイン するとチェックポイントが参照 できます', @@ -63,7 +67,11 @@ class StringValues extends Translations{ 'no_values': '値なし', 'email_and_password_required': 'メールとパスワードが必要です', 'rogaining_user_need_tosign_up': "ロゲイニング参加者はサインアップの必要はありません。", - 'add_location': '目的地選択' + 'add_location': '目的地選択', + 'select_travel_mode':'移動モードを選択してください', + 'walking':'ウォーキング', + 'driving': '運転中', + 'transit': 'トランジット' }, }; } \ No newline at end of file diff --git a/lib/widgets/destination_widget.dart b/lib/widgets/destination_widget.dart index 056594c..be9ae82 100644 --- a/lib/widgets/destination_widget.dart +++ b/lib/widgets/destination_widget.dart @@ -6,6 +6,7 @@ import 'package:get/get.dart'; import 'package:rogapp/model/destination.dart'; import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/index/index_controller.dart'; +import 'package:rogapp/utils/database_helper.dart'; import 'package:rogapp/widgets/bottom_sheet_new.dart'; import 'package:rogapp/widgets/bottom_sheet_widget.dart'; import 'package:timeline_tile/timeline_tile.dart'; @@ -59,6 +60,11 @@ class DestinationWidget extends StatelessWidget { } void moveUp() { + for(Destination d in destinationController.destinations){ + // if(d.selected){ + + // } + } destinationController.destination_index_data.forEach((element) { //print(element["index"]); //int action_id = destinationController.destinations[element["index"]]["id"] as int; @@ -84,6 +90,11 @@ class DestinationWidget extends StatelessWidget { // }); } + Future getIsLocationAvilable(int location_id) async { + DatabaseHelper db = DatabaseHelper.instance; + return await db.isAlreadyAvailable(location_id); + } + @override Widget build(BuildContext context) { @@ -97,7 +108,6 @@ class DestinationWidget extends StatelessWidget { padding: const EdgeInsets.only(top:45.0), child: ListView.builder( itemCount: destinationController.destinationCount.value, - itemBuilder: (BuildContext context, int index) { return TimelineTile( @@ -105,7 +115,10 @@ class DestinationWidget extends StatelessWidget { lineXY: 0.2, isFirst: index == 0 ? true : false, indicatorStyle: IndicatorStyle( - color: index == 0 ? (Colors.red) : (Colors.grey[400])! + indicator: CircleAvatar( + child: Text(destinationController.destinations[index].list_order.toString(), style: TextStyle(color: Colors.white),), + backgroundColor: Colors.red, + ), ), key: Key(index.toString()), endChild: Card( @@ -165,8 +178,8 @@ class DestinationWidget extends StatelessWidget { Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - //Text(destinationController.matrix["rows"][0]["elements"][index]["distance"]["text"].toString()), - //Text(destinationController.matrix["rows"][0]["elements"][index]["duration"]["text"].toString()) + Text(destinationController.matrix["rows"][0]["elements"][index]["distance"] != null ? destinationController.matrix["rows"][0]["elements"][index]["distance"]["text"].toString(): ''), + Text(destinationController.matrix["rows"][0]["elements"][index]["distance"] != null ? destinationController.matrix["rows"][0]["elements"][index]["duration"]["text"].toString() : '') ], ): Container() diff --git a/lib/widgets/list_widget.dart b/lib/widgets/list_widget.dart index 1451f52..255f29a 100644 --- a/lib/widgets/list_widget.dart +++ b/lib/widgets/list_widget.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:geojson/geojson.dart'; import 'package:get/get.dart'; +import 'package:rogapp/model/destination.dart'; +import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/widgets/bottom_sheet_new.dart'; import 'package:rogapp/widgets/bottom_sheet_widget.dart'; @@ -9,6 +11,7 @@ class ListWidget extends StatelessWidget { ListWidget({ Key? key }) : super(key: key); final IndexController indexController = Get.find(); + final DestinationController destinationController = Get.find(); Image getImage(int index){ if(indexController.locations[0].collection[index].properties!["photos"] == null || indexController.locations[0].collection[index].properties!["photos"] == ""){ @@ -39,8 +42,18 @@ class ListWidget extends StatelessWidget { itemCount: indexController.locations[0].collection.length, shrinkWrap: true, itemBuilder: (_, index){ + bool _is_found = false; + for(Destination d in destinationController.destinations){ + if(indexController.locations[0].collection[index].properties!['location_id'] == d.location_id){ + _is_found = true; + break; + } + } return Card( child: ListTile( + selected: _is_found, + + selectedTileColor: Colors.yellow.shade200, onTap: (){ GeoJsonFeature gf = indexController.locations[0].collection[index]; changeCurrentFeature(gf); @@ -54,6 +67,7 @@ class ListWidget extends StatelessWidget { leading: getImage(index), title: indexController.locations[0].collection[index].properties!['location_name'] != null ? Text(indexController.locations[0].collection[index].properties!['location_name'].toString()) : Text(""), subtitle: indexController.locations[0].collection[index].properties!['category'] != null ? Text(indexController.locations[0].collection[index].properties!['category']) : Text(""), + trailing: Text(indexController.locations[0].collection[index].properties!['sub_loc_id'] ), ), ); }, diff --git a/pubspec.lock b/pubspec.lock index d16bd9f..63e4748 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -57,6 +57,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + circular_menu: + dependency: "direct main" + description: + name: circular_menu + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" cli_util: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a7d0f82..9ac933f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -68,6 +68,7 @@ dependencies: flutter_typeahead: ^4.0.0 flutter_launcher_icons: ^0.10.0 rename: ^2.0.1 + circular_menu: ^2.0.1 flutter_icons: android: true