From 4ab4992918216b7252015061f163af6e85eede8c Mon Sep 17 00:00:00 2001 From: DarkSlein Date: Wed, 29 Jan 2025 00:49:21 +0300 Subject: [PATCH] Initial commit --- .gitattributes | 2 + .gitignore | 4 + ATTRIBUTION.md | 36 +++ README.md | 4 + assets/comfortel_logo.png | Bin 0 -> 4198757 bytes assets/comfortel_logo.png.import | 34 +++ assets/textures/time_setting.tres | 12 + assets/themes/big.tres | 4 + assets/themes/medium.tres | 4 + assets/themes/panel_cyan.tres | 12 + assets/themes/time_font.tres | 4 + export_presets.cfg | 205 ++++++++++++++++++ icon.svg | 1 + icon.svg.import | 37 ++++ override.cfg | 36 +++ project.godot | 56 +++++ scenes/board/board.gd | 121 +++++++++++ scenes/board/board.tscn | 57 +++++ scenes/board/reservation.gd | 36 +++ scenes/board/reservation.tscn | 40 ++++ scenes/board/reservation_indent.gd | 6 + scenes/board/reservation_indent.tscn | 9 + scenes/board/time_slot.gd | 6 + scenes/board/time_slot.tscn | 62 ++++++ scenes/common/calendar/calendar_edit.gd | 1 + scenes/common/calendar/calendar_edit.tscn | 20 ++ scenes/common/edit_field.gd | 86 ++++++++ scenes/common/edit_field.tscn | 53 +++++ scenes/common/time/time_edit.gd | 41 ++++ scenes/common/time/time_edit.tscn | 31 +++ scenes/common/time/time_hand.gd | 40 ++++ scenes/common/time/time_hand.tscn | 54 +++++ scenes/common/time/time_setting.gd | 175 +++++++++++++++ scenes/common/time/time_setting.tscn | 131 +++++++++++ scenes/main/main_mobile.gd | 48 ++++ scenes/main/main_mobile.tscn | 58 +++++ scenes/reservation/reservation_creation.gd | 115 ++++++++++ scenes/reservation/reservation_creation.tscn | 99 +++++++++ .../reservation_creation_window.tscn | 27 +++ src/domain/entities/reservation.gd | 20 ++ src/infra/dtos/reservation/create.gd | 18 ++ src/infra/dtos/reservation/update.gd | 18 ++ src/infra/repos/abstract/reservation.gd | 25 +++ src/infra/repos/local/reservation.gd | 54 +++++ 44 files changed, 1902 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 ATTRIBUTION.md create mode 100644 README.md create mode 100644 assets/comfortel_logo.png create mode 100644 assets/comfortel_logo.png.import create mode 100644 assets/textures/time_setting.tres create mode 100644 assets/themes/big.tres create mode 100644 assets/themes/medium.tres create mode 100644 assets/themes/panel_cyan.tres create mode 100644 assets/themes/time_font.tres create mode 100644 export_presets.cfg create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 override.cfg create mode 100644 project.godot create mode 100644 scenes/board/board.gd create mode 100644 scenes/board/board.tscn create mode 100644 scenes/board/reservation.gd create mode 100644 scenes/board/reservation.tscn create mode 100644 scenes/board/reservation_indent.gd create mode 100644 scenes/board/reservation_indent.tscn create mode 100644 scenes/board/time_slot.gd create mode 100644 scenes/board/time_slot.tscn create mode 100644 scenes/common/calendar/calendar_edit.gd create mode 100644 scenes/common/calendar/calendar_edit.tscn create mode 100644 scenes/common/edit_field.gd create mode 100644 scenes/common/edit_field.tscn create mode 100644 scenes/common/time/time_edit.gd create mode 100644 scenes/common/time/time_edit.tscn create mode 100644 scenes/common/time/time_hand.gd create mode 100644 scenes/common/time/time_hand.tscn create mode 100644 scenes/common/time/time_setting.gd create mode 100644 scenes/common/time/time_setting.tscn create mode 100644 scenes/main/main_mobile.gd create mode 100644 scenes/main/main_mobile.tscn create mode 100644 scenes/reservation/reservation_creation.gd create mode 100644 scenes/reservation/reservation_creation.tscn create mode 100644 scenes/reservation/reservation_creation_window.tscn create mode 100644 src/domain/entities/reservation.gd create mode 100644 src/infra/dtos/reservation/create.gd create mode 100644 src/infra/dtos/reservation/update.gd create mode 100644 src/infra/repos/abstract/reservation.gd create mode 100644 src/infra/repos/local/reservation.gd diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2cf7bf8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# Godot 4+ specific ignores +.godot/ +addons/ +build/ \ No newline at end of file diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md new file mode 100644 index 0000000..0d4b741 --- /dev/null +++ b/ATTRIBUTION.md @@ -0,0 +1,36 @@ +# Attribution +## Collaborators + +### Role +Person 1 +Person 2 +[Person w/ Link]() + + +## Sourced / Unaffiliated +### Asset Type +#### Use Case +Author: [Name]() +Source: [Domain : webpage.html]() +License: [License]() + +#### Godot Engine Logo +Author: Andrea Calabró +Source: [godotengine.org : press](https://godotengine.org/press/) +License: [CC BY 4.0 International](https://github.com/godotengine/godot/blob/master/LOGO_LICENSE.txt) + +## Tools +#### Godot +Author: [Juan Linietsky, Ariel Manzur, and contributors](https://godotengine.org/contact) +Source: [godotengine.org](https://godotengine.org/) +License: [MIT License](https://github.com/godotengine/godot/blob/master/LICENSE.txt) + +#### Git +Author: [Linus Torvalds](https://github.com/torvalds) +Source: [git-scm.com](https://git-scm.com/downloads) +License: [GNU General Public License version 2](https://opensource.org/licenses/GPL-2.0) + +#### Godot Menus Template +Author: [Marek Belski](https://github.com/Maaack/Godot-Menus-Template/graphs/contributors) +Source: [github: Godot-Menus-Template](https://github.com/Maaack/Godot-Menus-Template) +License: [MIT License](LICENSE.txt) diff --git a/README.md b/README.md new file mode 100644 index 0000000..7aa9ca2 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# Talkpal - Frontend + +This is the **frontend** for the **Meeting Room Booking System**, built using **Godot 4.3**. +It provides a UI for managing meetings, rooms, and schedules. diff --git a/assets/comfortel_logo.png b/assets/comfortel_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3e171edb53de1b551689a7a3e1af4b6a1b6eb0c6 GIT binary patch literal 4198757 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 z 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 z zFpxl(2>h~4_R6XgHt~y{aCHW#aQErl8vuhSFFuQJ#{_iSe7cWvW+UrV2*&|X-c%^F zWkNiTn;LtR9lI~6kJF>tvz!D-fCRcuV9%~Efb%B-5+DH*XeEKi+pG>f^uM@cj{Z@% z#~ypQZ{B&Id(2~RbPwQ*0kQ$l1AIrWf65j!M*^)T@NAjgO>!MkHcNhNPq;oN?>oB_`{pC2+V*4c`ke`d_wG#tr~1#eNSUI8mpu3UL$n5Z?KI z<|J?qs$9i8>`fYAZy>W*$AZqooD7I@H5JOlHR|K5%wf>Pyy7{<=_YK`1__V=3AB*_ z9RO{-E1VMvkN^pEpTJ{n2|IW0a67i&<8J=iE$+Yr4|4b4XElZK4k?AIfuLd_fi4li zzu8rC?JAn|C~>KR-kbm`xL2%zxL4sl>;TZ+c{mVoiGH6dsMsHf9Tng4d{EY;2p`43 z7Jzz;zbKv$q|4e{ziH!mtfd-r+Bvg736KB@OiEzN|7=V;Ec=lF36KB@^qfF?0^s)B z?{T-^eusRRueF;9C%|`m&WOwFAAy~+q$7)#l^62X2IVTk!y^EiS23Iy;409wZOzss zv5NfIo;f4T(a_vS#Ze4w-X_EmcH2$hn-c(W9IQOFhp((Wj1spP4>s-6d~iPG9T4Rsjcze&4%P$p>6M&Fu)0~r zHm7u4nF9j}kN^qvnLzfxDt%rl*G2*)KmsJNlmzy&!5)6txt%+Axqa8HaBKF(y8vqa zr{{;n&Oewf#w5@Y0+-7?&x+@|X3d&7o2FIphu!ud?8C``w6P>iuxmfvxsU5drP019 zK=_6+bsjo~IRT3M71=5)GqF9YT|BM{@=3A7xWwi$YCBz(Z+s5l(x$?*+tRAo!?rzsx2l9u?J$1!s|d25fF@Nj#u^t)jmPo0 z_D$5;Sg_UPTAP>~ZIA#7kiaYm@J)cTph}x0KmsH{0;vN4$7=W8cdZxyD^~2`w=wa( zfHea=26xHzM>YGgISDK$fs zz~)q7ZlWR++oL+89`iIYK5EXR`cG1BW7*s+p2QaWkN^pgKo-f`zeZo?B_RCm_5N(Y>O#+R=%kU(b$ zeC%WYcd&i?-A9~y>dU@%@WC70Lk~UVwr#uBEu_2ox)YB_09LG!AM(#Ue{|mjI~Hw^ z3RD4*w_|-^Z!j46aUg)resBmBI}WUWow!V3qu%CV={oi&X=~%e@g#QGhXhD~1iC_i z4uG!QDbAAwNPq;oMIe31Up~`&;s3CF9e|1peGh=W4`7OA!3l7uTu+$72D_5Lk`lP| z(o1iW>l7LEUvVmC-MaO1t#cbTZ15sng}S~60Gs>yoqHAL_@^IV*xrz2F3m+xE%|;wU1jqR*_N%lpu|2A-{%r`3hf#AL)qj$56Z|?i9eWZx z>_Y-1KmuJMko~VpS7yz5k^l*i010%4KyU!4;MWh_(c=Jh-ejJhE66PWNXh+6ri2+1 zXg`7TWQrfLY2I|xR__FW=*7u^o$~#en>TOvrvj`EVw?~_o8U;R_E8S)i-Ow9if*%y z7*|ta)Evw{)`q_iHm-_ttDQ}(e~-fYG0IYmJDb(eYWE3j8f@(TBDjJs5NPgCdly#A zIg$VgkN^oRIRSV9@SSB3KfFt>ol%UmT%vYvxZz`!=5^AEk9RM6(Gl*&FFDFRaYLrd z3ncfOnG$A5p#211BU8K))4cocyWQ5UTiqRZ+@5a#t18ZZRD+UMPe4%1RhEf9MM3SU z+Rv*0tTHa@Teob~9L$b+0Agisb+d}&vEuZs#-m*lAOR9sZUTG}z;fRKj!yz4Kmt7{ z;2&2`zUK^L!+*%eTLJy{KWatbjM$%n20l?pitn*`B-%0C&=npReD4XY` zW3e9zkN^p^fdCxF=Wnf0S9eiv22WU~gP7F>dQFJ25cMR@FKi z6MthYjhKN1NPqpQW+euOb5h%NwK6HQWYyapD zKm5g+nM3e<2Y}S4X-OS<#53HAg+1iq>3iHAw_oV)x-0GWPm(%Ju5D=v6C}_L0)rcF zxc&#^ae({qU4hsQzw0jevoyq_+`b18zh70tI57tvz!D-fCRcufDVAJ-$Blw1W14cT280v3uZw6vnN|KsZ{>KmuJNaIc&Mc%EFJ$xqruIpXy9 z$p0?nTMp;TcHd2WhcVO%P}XmFq{&N6fQPw^KQS=*NTH{VnT0iOSY zA9Z`}mF=1s9V%o23ACKRr)7S>o1dc!W8ImrE0W8Ed~6R+fH}EbAYSm8L5?RmyC$o&-pM1lmY|4uCe^70!tSNPq--L;(67V&5PAH_?w+D)4B4 ze+eKS5%6g(&o1BhmLe7W+1OexI5+~H{){JBK^&vwy>S84B+vl@XUiPl7tiyNM;=Lq zxjjl#ChV=hI^irg9Gmzx;jejpTqoaJPaxz=r_aaY-_p}t9dE(b9mn|F#6SWhKmvUw zKnFly?=06v0wh2JEg|4PO6N}inDF;bfJE3w>2G`k8=w}F`iui0)D5KE&iNm({s61U z$NNjc=6oUZB+zmKZ;<(27SC~~d~K%g&@Z@~ZrUo>O>y0wh2J^G-lS{LnFg zNb&1&fSl5o`Vc~0s`v+?%#H=1t|Yun>dz`^!)g*}8-WvLLgwg_H(&0MufN!poR_cu zF|JIxoBD?GkJWflzoN1xpuuje#F3tL$d70FS&vKmBtQZruv`SH|CeLAX2@|#fCNZ@ z1UgN?e}qqu0Yqo|b4~y+(?cQ8IeGj z2zV#Ju3fvl69A5YvaS7iab=<%&k3N7U2#6PgY>L~Iqcf_7U#!qI&Xp><5_xE>uY-M zv_}FYKmwBx;8y`mLXCY$fCNZ@1gaAdO|G&ZK4-c7TL42^g?!`~$cTLmlZbzae6R1r zxqqwk$_Vv7Q98BvOACC#+CP-GWCIdt7XkbW-}|0>c05vdT4gT+7~c8ENdOha@mMC( zmWJ3R= z&ZNqAwN2O~E)wE4me$YaHhiQpi-<+n3=2LK))h=nrJvk3V) zSbmm*JRT!n=PcGon!Nxu>k85i$f!X{SZ|{0JGZG*H5+H$PAs}aM zq3#RM{F~~JW0_=f6hOtlDt$=(@O^*k3Gns!Vb^r)dzN(nFu?SD?(n;l7D`3Tsr#?TBPrpJX?Z0FMu{Mj;fzKydtNgc*065}XC-7JEwD;{@N zW6fgzv`GRaKmv6M%;v9Y-C3|b36KB@kU$>^cn5$=1rzxN@sQ}(HmYPK?UlVc0fO>J z8wpb9zbD+c(Y!C8{>OX71kP78kU-Z6;J4w4`AI|IjteG$vw~O!xji6{x}^}~Hivv% zwuW)*8&zlP&c~zLvz!D-fCRcufDVAJ-$Blw1W14c+Djlk0T6ciRorVH6OZ#IP$Y(g zkvi4&Nx5Y3LI4PUUo9=PUY!8G+$zw0`f!1mIBI$`v_Jw&PT&q1@ul&oYu2odvqNbU z+u7ZI-Fc6Ne`sgFuS2FLE->dpJVq?cQQmYg`!*(GlrfM136MZv2{iwgw6CPNE)pOC z5+H%P1XiXU@PRu0P%Y{7`TpdCcIFfSdZCR(iJ;e{Is|_Dr(d3wCw8RLnhvZ(I`Gtq ztvZ>h?a%-TEH#16GT`|(Xw^3XqFvSr5RU)n1-jX8DmL+5B+5;oH#L^oF}pUV#a7Rl z1W14c`bK~bfWF;Pu7?CjfCSn@Ku-X8;SZr7UzjBF2uU0{0Zh;bM}V|R3geyr^fW+J zr#2h^X_IZ-Fb$Hx3<@X&TH4Z!f*>ZITm?L1U!3iph# z#~71=1W14c`bvO*;re=Kxh@hQ0TNh#0?8u)rkxQFU(oIuCqSzH!y^Dzl>g2@-&cO5 zP61!w4Nm;yv5#GFkAM7H_k<@rCT|0i-<~gIo&;J>;CV8?uWjAB)m?Ypbt9*00yq}j zNaHjB>O#3W0h<2^8IPl5hd1=w_#+oEVMTu3HtvMx*o_28fCO4kp!vVvtzR-HNCG54 z0wl0R1R@83XlF0Zp`j6yeEKK=s*@M}W$Gn^enl7BNx7W@NSy#EpCT-Jn*(?7!H2k~ z9{%{er30kk%lSg)NucEfp8Dvcj}Fc~_uP@wG=Uu-|5rh-;y;LUa|YP&@<@}lD@=SB ziE^u}ZM39ASa)zXV0;D=m@R=#gN?HtfYwQ1Jb^vOSF@G`NPq-LfCMHckh};0pQ!DE zaQEK^n3PEbg^&8=gLn4({E|X6u?9Zv+&8~@n>+Bp1Jfe_FauA(v|%7_fMcKjbhkpb zKMy$I0C&Lp1KibHu66&pE46%_q~0ahThkIINT34*KKQ{84!-xjhZkP+n$z6Vp7u2N z&_fToZ+zn$?yvv)LvG!={gbVJQ~BWq08q*U`Q^gzm#JpNO^4WaoQ}N$O^<1|<9HTp zYkJ_-A5KmsICMj(3(00JJ{{<6hpB41qrru-2nX>U1BXNOXs z0R&0%?mw^o6JJ8MY3&?D&S25G#f5=8^sqzR`t=8TN5IurZ*h0td5_t9nKA9ez$17P4C01(Tw5XrIVN7_Vr zT;4R}*tVrHE&~aW015P!0385*y|Y{w36KB@EI)zpRRCVGV?y%58fpLeI(P0rGvC|? z@U*`+vf8`vzS}>jY~lp*w81+75<74Nz~+%h9_3cA-q+nI4^#igH8MAkA?Is zgt?8CkDFc_?U4WpkU(1qH2>GTEi2uV@CWB0Q@Bx z#CR`&IsuMyr<`(%d&x^qiHG^>&_d!`rb(c^1UAal{3(E2Zn@cQ*|NpmbkkOUs>TGd z#U_j`kGSa&+qSe9=qrK~Vpe0ujsTgY zZx+HFHuKjCnFj+2kN^qvl>pxX(APW5b&&uGkiha2NKXLx-G8smi#}KNd!L1)m-T0t1<>A1As>WAowu`;`juBPfHmd2RQ1equhxno+L-7x4J8?xI%=} z4HyvJz9(14Gk^*P5@<1j^)k1?z4zX`aLFZ?xK*oG`IiI6;@=!>u`sW*o+=IieDlWQ z!eT1OWizmkn;^ z%9ZXr-}z3u6AveVy(3_u!j68tU=!MLSw0<$@HlPazlx2#&9XdfBjis3l=Wjh2~0*{ z(_rId9odTnnk7IlK(jn)jRZ)51V|td2;T)Ll0N8leCme8RwbV{*P=x3YhBp>Px5Kw z;sg}@v>`qQFc9^h9s@|!zdaW)yivH9JL8PExq}Zr#J%iguRKoX@lLtkHtl@ap9Gee zz~Gi!Zh3}WS3`C0v(HNL2JGV=eDFc<8NeBNuh45gEN^Oi+*)GgkF+WCxO`myx^=J* z+X(R(R#w*@+miqZkU$p*41a#?Z@Uj&ehvnU>dfm|11j8`0pwo*AOyg3~#wl<7OfCNaOZv^-bfWF;Pu7?CjfCSn@K;HpiTG?WI)*thfGRdZI z{fpDS(ys-j5_}~RX2=Q=BgExeGU-pe`ENlUSAgL6NB-?y0Nx3pCjrLUM!#IxD*1E; zxjJS^pv?q+Mka@^x4;`N-HshQyfX|!xlX9k-UPYDCdMs~xXEDlVKW}1>2aEzGi{Lo z36Q|F1n2;mmLU6+011!)35+5T9s%%rIC=HI2y2rLcqKrw6F@p7?ShoHl=a52R)(aM z%l~Ds-hKV+*SRM@`3KQpqJR?s-c};~)e)f1fGUpwJoL~*qsC2EJgS=IB+yC%_-;%5 zvMt|9}xW5;6$7r{kKy9QU)i$xKMBcAa3qg6c;c}0v#dXe-ZD$|Nh$3g}^Qg5Z)%r zbf0VRgH3_tl0Dd(Otvj(Q;@yOPUW~{2y5o*(kMV3?mNusVVg?du zj=-kD#^#LC5(!LCfL?&<8PWm?kN^pgKrw;j7=TpD);yHDxdVI>KTwpEL;oXf7ZPcm zPsjC0TV7)C4UoRJZJ)H)5$gXmr4M^Z>vI6fR{{94Wbz|S<3$1$!qcS9c@^5R2??}~ zz&4pst?#)swLNYjro`ho_5f6|G0uLz4)#p#oBEH(&bMct1W14c`apmVfIi$su7Lzd zfCSn}VC*pfulphRW$r=fBZIt&`=YefA;wm{w!xM??D)QkBjBc+zA_OR75vGTKgLMx zXs3vY9pU1&CaOSl&wghRRsP-X7lcG*hjE& z%n{J^SoyJ;Cjk;5f#o7V2f%WX=eQ(50wmCX0?`Qo2ydW& zGERUZXF$#oAnQm4KAZ<4yi?)t1;3Of!e85Ie?1L=wgY$LjrE_mPagqDg+H7D@&W*i zkGSMP|C$Z}+%0_J`awuAkU+->oF?=ATG^bd2x=Aix+`yjKNjRwY?RF-t~b$-vivxx zV;}(%Ab~y-;8y|k@vd@BBtQZr&<+BtFb%&~?!`NH*;K^atN!s3+t>T~BBdX?@kIdm zLIAC`7>z7#G0LnJ-ZP-D@b^Zo3F4XoNBuF^_)!2&+xq~*tcy&e?F8Yw(#K{!L3ef` zfn_7`R2ez^0vAl9ig-tx#YH@qznBr^u`{5+^u$Fb`e6WRa|qaY6B}kn5+DH*XfXkv z0BG^e;nYZAjtTH@Q$KEgH~}Ei0O~;Wxep=M0>68o)ay<@+9sy~lGt|j;~jqpZP@ZJ z>+|ifLyxj-e8Uab=)e_!T7TX3H_;!*<6rVO!3ltPW)rw9;_gh7z_Jm*FZ5%IMz87s zFi~!?iE+yp*`Bm4wwWIXbqpjx0wmB!0{rXN$GgfkkwEte?9u%ta0NmjyaNC@Ak^_c zAIAb8>7?F^__!`~4wsqhy&e&=5v1yHAeI01ZFvkrju z>({w`_gx*&4Nidi-?$!IV44J$hXDTF9-bc>0=q1jAh$R#%B$EY8zZiVJ+m2)8JEZH znI-`eAb~y*paY-}cadu#f&LMo1E3%GG&%vGLf$(8Qn9a#%%5wHf+e7+)oNVoiAjb z1Uf+ACYj@F<9V)KyEe`ircHzw#SrBvZ!*|8u!*#d5tlbP9&ODdflY&r^SErTx%~v1 z{d3y>^>T(JKmy$$KrcWy?o-(;^%#JNZx#N@mcI1LD0*L?)Ridzbjx4*q>4Y;s#lv~ z>)({W#=4Dv?X_2z&DqyO#TQ)z|7Jj~8)pb}s}nHR%9X2%JOL+*o!_owi)~4uB?LY! z^T787`e57bmM@B96&|Nel_PF4m|fV+k5^^BP0oe3NPq-LV5tZ+`persO@ ze3f7}yb~aCF!=t-5db(M#s&1N6U^DLa^*_5&pvv3BI^HtB>kc&&m;+Sg}|@KME@C+ z-LYdw>6{_RA-s#kcr4aS4OMJlW1+d(w=(1zNPq-LppOLj*R79tm1`n_?i1kOrtaUv zbOq4LcA?OxEk>PB2WNn`HQ}!gg19Ue{qY+BQ_(JsN2aComMve#G{y!9a^3A0TVC|r zi2!>pV7$Pe)B#|QfP%?=O3I#DP|hL}Xgh%y$OLct<~P6TZn)uwv2!&M9>-Z{K>5oA z#tx9Hv~f_3bapKMXDEk@SrQH0$Np8==S9ChtRM9gk*|*jh=})TJ^rsk9yZ2{cc4#q`~8uB75!;h z;t&{ji)P>ez;IW|HFP{++&oxE0xcncHv}@9Yv`i}S z9C6fU0fR~j<^nT_$A#cjP{EH=19pPIoCD+f!^u!5#14Q{PB~fT7>*+!bIdXBzyl9- zM;&#PyYk8_-HkVX6{fK~JXF0uG7Kcp6#|!Ddg-_1I^mE*4!QDq&wHNxkstXHclhCl z%fERQ<0ka+J7D4;Lfz6$uG7YVP1v`wXE9cj^QJ8lAORAXh5+50)6ipI5+H$D5ugKL zR%DmKZpHy1nKUnIUDJs3>EV35qi+J;$9|U{Cj!il#A%rx|JM@$mR3>!#V`KbNE#;c ztzXCw@6s0;LHjx(bpY&Mbi3tB^U31|#~ypEJN494-D#(t<_UbCO^!udBtQZr&=vwb z0nnB^!FiAX3B&~G0ElUHK8@XQy#@o@#n&Brk?P6ntQ=XS5v&gBq+W`AsbsAcYJIRe z$=HrR8tWL?U6i!%to4}7zyJIHbI*F#vl9a$QUSjZ32}QAK%EC=0>7+2jHD^Fhw$GW zy;J|U+8u0Zv1a{XVqUWp6?33Q0SU&~y7?Azb|_8UL^ z;SZ<(&T%5Zgn8Z>V80Vht^qe)t*)O$XUH_ELm-r27V5^^@xBR6F^wAW?%RG=bz$^Jn|^Fe*JoXj(X?LhtHQP zyx#Cyv|%8D4iWHQ6Cm?l*t~hOTe)(j{~g$Gzx^`e-^6SQKmsZbgOue77YhMD&n&( zqgDmUVbL$2>=S2#jN&~75dWAHx@$UbC_Mp?dHsKKA|Mgz`95)eS_goM5ya{o*zMzZ zj6)AS*qwaxDekh%E_a{)^d+eJid=`uwG9~t66hF#!OopKQzyU^p74a!0f65F6YGfU z{(g<(pf>eykO}@-y>wvI99T{QBtQa7O@I!7r6$htNPq;Y5a8dYDwMj?Ceiv3+_CW1 z=_i%xS|W!)t}2&JdkiIT!XTCWQY!;%U$w1sNXAJ{BV2ab=iNys{X}ZYzxp3e2ru@d zM*x!D|1tqmR-X=(Bvj;wHvmHLfERWnL*4FtH@9KK2Dffq=Gy>nl}1=xWn4o>SwI5I zM__R8z4sn^;e{98_SC07)$P6a-tN&yA9Y{)(wEX1p-g`-rvE3dyZw6f-v%&8gE`@> zoG}TI015Pk06%2+KJNNnA8E_-v%g0{Z*L2dh7rgey;$= zL7#$v#osH}eg$0`)_5# z{e~Y6h}!&sq_2wdOp-uX2;l22&c$SL0w4|$=yqH`E}tZAyZv!ra|#sI#qF3T0TLjA zt`gvf?5^H9&YJ}KO@Jo=dUStd@vqCWo%zXj)?hD$IAeB0t){FEp7&2mQX~2ffN(NF z>mj%iOn9q9AbJ!)oCf29^&i(JuG2UDL(J42b(6ZS%{QNBL(;8lH`x zjLMiKfi4jEHJRk&<;r}|r3v&V7NDmIvVS*B_+$5ro6 zAOR4dbFx?e4rGTN{}auu7t-S{w9D2nO5Q|xzAof#$A8qxfOvOZ?P2FX-tGVNr$6n< zLs-ME3T&B6W@o_r%_ zyz6@b^gO@!0?32?3nEPP`v5VAP?uSvWYlX=>4E4or8$lRT$H!LJPEX%z>zXP{F3@V z8oPJzcJh@0jZC>n>6>SusIHMgX@mqwfCQGAK-TxU%#-2pBtQZrkPzT=06qGrpxg8i zwE8I?pX9^VeRjJ)F1M|J-%oyI>XHZhm73vAn0&^tL83Opz(de5k zZOcC)RdWdPtxj1o*e9ANSF(!UVjR|M&=>1fPuZR&Fu+ zg`k;iSyY>88_Ls^)Q2V^g-u0031DURVgNV`^fmnHvjVwO0IBVQL|q2}W~V}5oesMD z4@b#@7x;^ED!^ZI8eqkW;2*Qo0R>YSRdl;lKt$a)ssYPMpv466^%lp-_0=ZkSoBsw za|)Ovpowv4g9J!`1lmM^Cji=XH#ip(AORyl2Y`|2L99FT5VP2MN1VU1yZdN|-T9&& z{h~5$YrFdz$6|Uot@d%kK*hc7^am0CiBD|yf;<)fepf!!mkIo``l8#aeQYj>!zloq z3h-C%d;coF2p~V){ZhcK%{&$6yF%awndmPyG1;QG3i1(vCdkqT36MaW3GhR9o9_sl=8>}n0hop?`;q_&w3z@;0JQn;aBd_pzXa$2=+V80poh@T@7@pR(Pp?^ z{xm?y+it(^=*RZZMz0{8O)Q7HY@6(E|DxNxSx*6kez7fe9gMn7(>MTZSHF1N?8^ty z1}{aMB0NR4i0fZ1x(r+dq5?0DZ&G zKhoI!4>oPL-^%j4{8}ErCt$cQZ0dzNO`m)2d1;x|S-Ww!sK%T5BQq-QVc!e>bUr$l z-STLFISH(jwX^&b@h?bUd{rO=33QFXUNT|x+|`M;tr=R)7Ba=O>;3Yo}g_akmJ4Ck;04sOJGGzpLZ3G{&gKV;}9&jI9}166FY z4GE9{3ACL6PXM(24sm`YFrNhIob1niUj;Spb+?Z-jlAyCBd=xp-F%wYo%rFj^$GR1 zYj16f^0spyP7atIocE6}6ZdvXz}^mc&N=6d72^5ZHH`xx^BsWV4DcrbB%a}m0P@pE zKI<7NYQZuRXeR-DO~C)EGPR;zek&_-4pgzpHY7j-B+zyO{E*%DJH+{szBtQaPB)}5@UA$|YGYRyc03QM9&plqHOVM3^DBH06o=?Z80yLfO z^!sP?ZI?eA!yW{;+0CY{&UX5dA9aP30%{|hKkKZsGN%B>-J)q70P!gR*orTVi#2Fm z?u_saEB@GHkG3rCcwW<{kgy10e~HA+u=uAa(;zHX)V(>R&Qmg z4fIzNsa-7^w(Bh=ZPQMEbj&G9M3KG|Ec@MnA_?3;p2@dI15AKN-7?8(9RLs>m>UF2 zEdI?d;yw1*!`C(W4uB($IKmxw+;Q%(!wz%z+;fk+)rDC5`k#rNkWT8P+$^GGRIqu(^?oN%I-h>}>)b~^ z@)0)>0X{C6P#@Q3R9)sJfP)o@V zFMQbDe*3L&lJ>XA^@m0MSVjUZCxBmleCFL9&l6%lzsqlB<_L(}Gfe^{KmvUrKnFk{ z?jqMf0{tVvzfJwQrz0EySfI*r6WrN2H~@mkFK+KGCC-Ap4L^o-)1LV;kuMLr8*dh{ zBQGZb-5)4Wn1cZ;S`=KAJ8o6l|;D|=yFvu`g97&n(Xb>7}?8*kC! zxqwqnIoZABC8wI1OC`ZK0~!s+T_bS0O!#+f(x&(=kJvl|MRjpIrb&PVNT90(=m6;I zo#VVopx*@O0O-&CO&kESATRJuoaf`%F_5ndqTR%OHilR>v2K0ivXBmr02SEkbO?RD z!vMCtJ#Ay#;yOks8+VILppR=as!qp~*Z(JH{KNPiM*Ze~5dngHTpm z5V6)?1+A6Cb`bO04sG?qIsa^Zw*AQ`r((G9PNDClAv(4s?%$4A2pw%F4LT0S!?XA{uEoQme44THbJX#4TsRvr2aR=n zI2)hd%V7RX_K0Kj+Rm>nwjFAU*}qv9)lz zBtQZrP)dLffKo(kKmsJN3rRb!q)># zGFHCNqP$PQgnxD(yWOw;>YLr3dklYUIOm*mVCHRdy)18!c@pRd0le4Zxu5&o=ez^p z$}6w*$NzB(fPn-^fCTzRfPdNgc1O7$66gm3Isp1{AF+x82Y?>W7pGIi-&c62&~MT(7{ojO zaa!jFyMA8D^Z#%VG!^WTf~*4~j9WC$Q=al9ci@5l1y!5n`mv%mEF*yq5cssr@lCsS z?Q(DgY}vBKKMv4=d2@;+KmsICivZsNPzx6ulK=@U5dk^?mI(9`3==&9fYDUwkBZ?4 zusTf#CxP#sh7@P`|2lR#L)|Ze4 zCxnzG?*M>6kKfim`B>SWnXwWl2FftrxUg>B{_eZq{SKOZQLcmKx*Zt?66hF#Kb83& zF4wQ&8v<}KkU%kkO@oca6)YuzZV=!xfNtC;&XNS?jR3s>{kh}mF#xD$RoWWs*1vA) zPnw28wZ3*lz{-YWj0JTajt5v;+a^Z?#3u6bHSptDnI0*y`uD!~PloOm>ZS|o3BY{) zmONB{qWoc3$Id<*Fx`0C+tw89W6gRLVVwQkdLf)3Dr zgy#dww&?4O7hXD$I36&LI3CK@^WcMpUkL~&zyo#0XIm0z34udo9`M33kN^pgK<^0f zIe^~XQZ9%DdO?5=fL`22zlih%fQosPL4=1GG9&c&OFSff9$|B3hNwar)0f{ zNZ(7x^=BOkw3q_99W$0`9P_LpFZA{Rc_*G{>5d4SK&kkia4dVzKzJNrl%b02eZTa7<|rF1CxMm|c$duY{Fcv=(<1>AAc0Z>d<-KDe$|u5qGADqoy4VY#V&Bi+ zH`I3kE_g@4JKpgJGV%;|<&(GZt01@C`SRoWwvs9_-uNFo8Q|W~{P_0_lszJl8~YZ? ztLG$F!7K@MfWV0|M|``*V>&QbPO)(Un+6*jw@HH}unYv~1y}~?9Fhb`U^Id4+qa{V z#{fnn>RL_43xLU+>KCaDou1}Lc>#iox3-auw7-^li|_`(wl^53vt`=WaB4fv#c8Y0 z$H6<0`C0(~((q;lu5H8T&;DC^jV<{6B8KudhIsl3Hqcibpoi3-~@>C5V6RcqaYibc-J|Y2#&`_`|JgKdP%t#;>c?olyBPfyN%HG zXY;*%%u627Pt!KfiN$x}{DSDWXALA4r^C2_c})?1RQi5$ivH|M0?SF@KV z*d#y#Bv6L{9RPJ`u`LOZz)}(534o;{J^OJoj{rbmBLuOZq|>AP<_HLFq;b@KI2{}W z5Z_uKi+x{~I0>@l*4~^0D&VyZ>;!?0vf)eXeLER92FiJOlgDNNnp7Md{zejqvaZ$ykwA+H{Ho0D>K4zBQzHQqAOTN+F9GB~1QH;DHWJ_?0ByW0Q_V?5 zs)=*e{pI2x-T?nU#F?wuNf4X~pjD#WeraGTf(V7v8knI6;E{-Hi|5+K?AM;i#xd~7ELRP>r{X(w&9 zY&Z@l1k5Jd*eQTT_uIey_Nj0VkDWZ5520T2Z2lwz$B!J~+W_Kk1Q=xx4C;pXRK<}; z9_fxh{sec-(Z|5dcjWSK1FdV5?Ma{o1P+inr0&5M%!gAT0TLjA3;~`1$lzdx1W2GI z1n2;0$&F}g8bRE{q6uq@gYefacYJoXx^Z#nXHEmeu;KrQIC3heP3_}nfl5D)&*{)< zJ}yJr0{X;ZA?b&*f#31R&VQWNZwrh2)Jres9zTd35oOQj*BeP&!+tFKZM;crmGv>( zh&OE5;F~|Z^I^Ab+cu;XWSJ4xlR!HO;Ex4P1YFb3>2X%|2y7Z`tk;39Nub>XcnqN3 z_lL71fq5mc$Gk4Qzw4F{#Q03?RkkU6$)Pw=JG5_||&c1;-FvIRA+D}ss`=^|8vOfZ_YSl{rRzSQQ0M7;Nu}A6$ z{2>|R{AtEvUlLeG0`Hfxxr4lnH-JNv010FX&;gL;!5j&Y011%53<%gxzu)ZlM*(mg zAQsk0n`59#obNlFFLMIKF9=Xk4;!)*?VS+1o1Z!g(j9mc`uSLdzqC=oZ+(+EaVWg) zZIgY~-LN3X*kP=uZ&!BbKY8hZj5mugyf!e?X9DnIfG0ia$!_nx{bNC|m+^mn7IUCY z5?BHPn`DfCSb}jl1PPD;36v7xivUUyu>lE?011%5^aP;pVI?orW3ivFYbFoRg8!d) zFsMzP2gdf3N@CR69Bsu`7V?(z>xtf1r(LxG5C6w61aMP)Er5w+b1uYh21L5)VB;Z1 zK#Ugy%p%xWc;;WfHetb!hw@{OJ=UFc(ur>E+O=-iu3c`+mTTVi$xm*+S?<~9S2-JwH;l!@dt_KySTPC4EZ*mTfw!m)oFx9M?UFW4S-0HE%)(_Z5aKm4ib&>#Ki zM?ZP?*=Ijl-W2%tw2%oB=njE(GFAN5c#K>Rc4yk0DG883p9t^~fIi(#u7w0hfCO4h z0J_=)w|)l3=U^|x(-^t94jr0s2Iz7BU`vnrYkuUT0O^Ya?MOe`>(TpBu?pJwh`#ng zx$WTBy+zhfZK!P>N1Xt5?Ul8UZO7@dev{P4_D7{-yFdH0KMSY8H>4~&dl9!_nglvQ z;DLpOg=buU{q z5Xu&-F!yEV5E$wcwW(U?1wDkg_RR?YMC@Bxa2RC8Kg!E4a}ESsYC{F?z@2f%nKf_D zu;`D)a!q5U&12hfy0qg24PyJsRh=5K(<5&dFAYorod8CHaTf`E`P_5QeQ6gb&N-6+ z33QtP9RS_Ff1EuDkN^pEfss5D62@evbwg)+MC^Myt}O1MD;qxXa@(l-kaX8SE@yhV2y7Z`T&|%xE(y$%0KEXSq)Xc*KmsH{ z0to>qVI=Wm{AJ2qWAh3m3OwnXZDZ=ZLY!>(tAf`p{d_uX-v@hIhP-$LN{#}kJyYu1 zC)iYv!kgcGM#809g!N`sx!E69$<-{5Znae7UI0@_qCD{TxjEV_Y4hvXP1n&2B!f*u7S>{1_o0xaAF^&4}R3zyZ6|>5 zyucql1`;3v5|}9gIsj&hm&Qqe1W14cKmejxKii71i~eV27OQwhd%LtX>a`9r>NJmX z6j*+`ScQI(4RZ*1XFwwQwVeubbrQtl+~%Yr9c}TwecoA+IusV&8{haVmHvU4F!pxL zk>Kr&6vLJ57B#Z5biU@uXnq`wZDYkJ8mvrX{JY5pl#dCYkh*7$sb>`lw4DI{(I40L zNpgN9Kmy$*KnFl~?;U4O0wh2Jog$#Z-Rt#4#K-AK&_mRxg5TO`SrGduPegX6y$SEC zv5I~b_;DW<>n8YZEEVu*XTm@3V`*~)m<`*l*M8oHKgO@+Rc>OjK(5}u${5xrE5Mh= z0WfOJBC!t^CE*KFU+)=<5`(NJfh8vJMH%lcOFSlrBLNba69RMq%*l=BGD(00NMJb$ zKtMy(kGitX0Tt4|t%-c;>P2`)?4v9xPwbmeFO6jvy|_&f?N+ak2&kh#%YxHD#XN-g z@MUcwVnce^32^%9Zz#Prus;wx!$KKMn+?Nb=(x>}qSl7TGLB)b`Ek*wVxSYCA}BU% zC4oPbS-q!~GvlO4fCM^CfG+{;^zGy1Nq_`MpgRPzB7a!CONlH70y(Nn%d8x+wbQh= zFDkeC;#kMBI&jRVLzz!`t?hsKIimfzfO*O5|NLIG&N=%sKqoH;9LUQ7tGp1<3uQ5g z*iIjqcpf*0N$SilVg$=iVymo=+17U=g3m%ao}HA)+pu}%%SYtl1o)m@t4Gwcm;~BP z;7pm^2DyHw&6DKZNPq;oMSv#&x^=%eTM{4v66hoW6YVORA)M`!lqB;a9`$j#Z!ZP; zcDl1ZT#kmJu3FmfvRglYLLfQ~kmO-g+u5#uWZUo3M|rfB6r+D}`q_H`{bRvH(q4|NlSACo@sn4llK zkU$#iHY!6g+Q12+ZFNjvR)0%;$acO!?PkS4)-bDJTmD7kqAVY#aC)32 zwqBLD$2Yd-oebtx<#k=!k^Q+r|pHEsMqYr0MbR0SFEQvv0!I@`zRB4#&FdjX5Wra{nMgy`3fqLOIv8 zfvkydb5!V94HzyoVVwLU6(a6KzIa@;s~cc*)v8r)&6+jV^=3)%y8?{{<1P}w>qEcP z#ffvyBtQboOMni5<>k-ONq_`~2=Fuc5R&c}tilq!5KaVpyd)Fz5boMe+lG7)#&KIq zt7y&&e(jqr^W#gW`mu?76U12?c-DWMO%?r7oAd;L*@Mu9P035$YhU~GF&>|`dKJkK z=%M{k;|2tXQo38F-;+^*SdN`<9O5d>Z*t0n=N6gG0XT9y7I{x>jgVjI)61q%Lcz z_ym9mA{2zBX;lK|iQ-uGe? zdr0PMay>OJWSRszLf~;SPyAWgTdqesGG|Vc1V~^R3Gf8KGQ#K3BtQZrFee1U2>?;T zCd_T^CgSxoto)RZvf3t2qtMEO@b`scD2VpZZn!M8vpS10sHLZmRk%WI#4XBAYPD=Xs_$N6zlS2e`=9Ec*1eTBh9RN!Rn?sQR36Q{?5?E#89XebE zE(B!|m7&apxz<5nf(T4^uDgX16w%uoh3Kvqs^!-f*DAI8x1DAUvW26Vmo@ysDGygo3f8jR(r zwX9pW-W_@5k?w>OPH;ybeGJV0sa!9pYM<>$poIkfT;}wYiIeQ z7-g7evc$a{MgKs zKt~9iE%SVuTtC&3`Er^hKmtohfF}T!5H^P*0TLjAIVB*E00hyc46;HD^;uz-w2#WY z7|%Ed-~>=d0BrjDXdKInWj|z^Pi&6L+gz+3Lfq2R#JY<=-j?n3+s^eXU-@c3cPmG1 z;uv#5eip&Th~rV?)Dh%GHsUqucwhu4fX4YgXj3&PBRy52_bz*y!Nx`%P6E8_WiNAQ zo_VHw@rz&l&2{V6`S%l69gFQqpk)O9o6P54x$uTS1`;3v5=aT~1VD;{2@)WIHV}C9 z(MR}Ur42Wt**VA~07*#2w-qG9-LgqNvR<$yk zrNUdZJYodPTRM)BwthZ6<_FAS$3N`!L*$M>1@OvOzRF#F_0_2$wz)tEPbjf;fdx}2bXKO`#$|_0j^`~ zZv3cmrk#VXEBk$Y7+DVY^7x)-mDMed|F4=a;w)EW96@+cG)tl#rL;388d4;+ehnc zx7q4cSevl-yV1$9ce4eti}GWSJyyr`JJ!1MZ*|77$=Jj&#?UK>=KMHlJ54YVo{deA z58DQhssS8r{>nMqH*nT_lec}s3CFwFyyi9H2sreIWXw-j9hdD$poIkfUgq?n7S4-P zA^{RuVghskEHQ8nM*<`;p1`AzKFSjS;}LbSb{&Ma1{1&8e40xeqFvG>B!&t5+QB#7#*w7hl9Y{#Az!->{~|dOiadYs-+jxu~fK1klOev_+vX-XDe$m z#+b1n&kN&ttZ{X5yHRP30~;pPb)CUElJAH1RYPh!Sr66~2U}yh-dsJ}o_gx3{@nnQ zJXx;4Kp6uGbdxhode}>cEG}t&p>oiRQts_7$Kc&M>s03@X`ivQwe!7U!Q0UOA&qja(=l|MP@ivK zFR#iyD0<1;*1yHF7*oP#8~IhMRz*tL>{M68SasE4>RG)Is>nz6#oVR|=x^isbtlgN zsAph!eRal5ZF^6HjuX!{@Kv6J0uKYY!xQj=7rYQ%-yqj3V;fA9K*tC?M&|o(a`CyA zj@>v;mjs$3KnFlmBx#2PNT4YK-)YJa?X-r#Hq0a|6SHC*LQF#_A1)iN8*XEwT}M=b zmzd57ezXhaIy)4Y&^J4AnWaOW+P6Mc<3w!A1km5M{?j;e1o-+ikA9)Aisp0?wwOlZ zur0672#hrG~G^kpMUyiX9JVUo{vnwKZ(d%9XRSEwX+5@yE+ifK%O1 z{KQY7`r~pPiUb1*bdrTkp`EWz~8FC z#x#P6)=5DG+w`*OY<;MMSVOQFHnj+`8M89q(wAEsZLe+79_7QA*|K&vp0>}9X=5Np zusLY1`cL%Bz8w(r3U38;?$%pxbg?i|3c2z8+-0J*%Bx52lj&tK3j*J3S`}_t|NxW%_U!_V_-C_d3fhMZeQm}e%#N}=)bUFP5`V= z#~dZd>y8)Ow=pfwv&5K1!TxPL_qoq?xRS8zlb`(L!du?*mch1d+pLT+33P?P8ky)G za_#QQggH+VAc1BG@DYG!IMNCUkU&EO_T1C^CEqCK{-q(4G_!mJZj+($3iUJueWgNc zSZ+c5X>*Iyf^=tH+W02cHjd3=C`13$RwUw4CN*Md_(HjfeHDcvucFxUFoHCqP*$E+ z0iU+>qF0aGr)7QzKG=j<#WU)E_jiA%VS)SZ9+`S9Mnwx}P=NT9_8w#eKl z{#$&5I5iTO6#@tckU+W<`T{X&UY00K#mPT9@308W7j}727sp7)dHnal z$}G0BIF8eJnH0V`9cA|>@z*5A3#R@?t}n}#28d)0nuzn7hEU740j{KVQfF;O#ps`{ z3;jd6w$VJs9DSiT+F4u6508U(zSKvW_5~Gwptas)O<_KIIzT&Pd>oUv@Z~Rm*`0LK zNq$~d)?^I9YvQ=<1VDX3o}DSi(nkP73_-4Qz^_p@puBFdG4lOTZsX|77>n;U*r z$$ww2Z^{LslM5!SG={*{pu*a6*)prE9z)5i?GVRhD&|%2t6;}O^a_GElxcglh59(J zY0Nkp3pq6NAx&68jTn6smw*_I#lIODCrYi&q%mxp&@Mj#FwHte35(bdj{xZ725>6G zbBNc0_LBr#Puy1-;{M5c{i6=WA|EG{)~vya>Edwk!3R4yWumY>N_RO4*yaSq-_$+? z{QWYKA3FoAY+M}I<7O8;vY@`1`;5FIV8~JACx)7$0d^h z2`m8t`|yO_G+g*F1QBYxYqq;&F+QYP8p0px*a2W^DQ2iaz(ju>uaf?_z}R*LvEy0b z0FcsTha4#lv5*TQIxe-Ag>gYcEsAVOL0qQd93|QYc@u%!(&|(cYMr*xKC$h@vKmc< zzm;Lenl7CCP$Ale9sZ%}f`ZE~`@9#=1yxfQrMu!Xty!M{Q2Y7d|0TLhq5+DH*AOR8}0TLjAc_Tm<;Jn>& zu9pNzfCNZ@1W14cNPq-LfCNZjE(y>9FqgNTizWdQAOR8}0TLhq5+DH*AORAXHv)73 z%-bF3dP#r;NPq-LfCNZ@1W14cNPq<9k^mh5b9vjjXc8a+5+DH*AOR8}0TLhq5+H$j zBR~hhyxnoGmjp-BT-b5DR?fVuxCKma5_0wh2J zBtQZrKmsH{0wh2J^FV+OfO)vfTq6mP011!)36KB@kN^pg011%5+!LS!VDA435C92~ z011!)36KB@kN^pg011%5JP@D*U>@!=*GK{+KmsH{0wh2JBtQZrKmsH%_XOwwnEQVM z1V92LKmsH{0wh2JBtQZrKmsH%4+Q7{n1{Q}HIe`ckN^pg011!)36KB@kN^qHJpnoZ z=Kh}m0gwO*kN^pg011!)36KB@kN^qH0|7b!=HV`LjU+$F3nBp$AOR8}0TLhq5+DH*aBkCJBQcNw2@DgU7hsqPOGtnO zNPq-LfCNZ@1W14cNPq-Lpmzl50O;K<<$_3n1W14cNPq-LfCNZ@1W14cNMM)%9RR~j zSV96MKmsH{0wh2JBtQZrKmsH{0=*+Z2SD#`DHlWnBtQZrKmsH{0wh2JBtQZrKmx-A z=l~dI!V(f70TLhq5+DH*AOR8}0TLhq66hTPIskfiOSvEtAOR8}0TLhq5+DH*AOR8} z0TLJ{KnK7u6PAzw36KB@kN^pg011!)36KB@kU;MU&;ii9TgnBI011!)36KB@kN^pg zz&sP!G}t)L%jeojpo{>$0A++&PXZ)B0wh2JBtQZrKmsH{0wh2JJs>~_Ko4#rmp}p} zKmsH{0wh2JBtQZrKmsH{0%Zi~04O8GdJ-T35+DH*AOR8}0TLhq5+DH*=m7yb0D5o} zxdaj*0TLhq5+DH*AOR8}0TLhq5-1};2S6Di){_7UkN^pg011!)36KB@kN^pgKo1De z0nme+$R&^f36KB@kN^pg011!)36KB@kU$v$IsnQDv7Q7-fCNZ@1W14cNPq-LfCNZ@ z1bRS#4uBrqL@t2@NPq-LfCNZ@1W14cNMO@oBO#Cg36v9{7oeOGTaW+=kN^pg011!) z36KB@kN^pgK<5e20nqtd$OVu936KB@kN^pg011!)36KB@kU%*BIsnQUu>}c`011!) z36KB@kN^pg011!)33Q$S9RQubg6paYm1nLr?7oaXNwkH7+AOR8}0TLhq5+DH*AOR8}fesR&1E7O9jZ-E85+DH*AOR8} z0TLhq5+DH*Ac49B=m4lojO|H)1W14cNPq-LfCNZ@1W14cNT7oR=m6;8P2-eFfCNZ@ z1W14cNPq-LfCNZ@1W2GR0XhKc5@UN3AOR8}0TLhq5+DH*AOR8}0TSpS0XhIWc+)s# z5+DH*AOR8}0TLhq5+DH*AORAnOMni5y2RL?1W14cNPq-LfCNZ@1W14cNPq-7NPrH2 z4&F3QnFL6H1W14cNPq-LfCNZj(_kYZkN^qPCqOSieP--I0wh2JBtQZrKmsH{0wh2J zBtQb4BR~g0=WZD%Oadf80wh2JBtQZrKmsH{0wh2J^$E}cP@frlkN^pg011!)36KB@ zkN^pg011#l=LpaN(79X236lT`kN^pg011!)36KB@kN^pgKz#yq0Muv39wa~lBtQZr zKmsH{0wh2JBtQZr&^ZEh0Cet_al#}(0wh2JBtQZrKmsH{0wh2JBv79K9RT&2u?Go| z015p6?by4moHr1F(QCk&>rf+x9XL@9ZbK0Xcc3;LxFuKN$N?qAyTCs98vb+A#V*M? zv(ZO@009C72oNAZfWUDA0>E)A^I!r52oNAZfB*pknFVSqna4LffnEU>pjXiE2@oJa zfB*pk1PBlyK!Csj0s_DROY%el1PBlyK!5-N0t5&UAkZry0Q3s_Jplp)2oNAZfB*pk z1PBl~KtKREU`d`xfB*pk1PBlyK!5-N0t9*m1b|*azb8O|009C72oNAZfB*pk2M7oN z2Q0}G2@oJafB*pk1PBlyK!8B6fB?`d==TH&5FkK+009C72oNAZ-~a&u;D9B0A^`#f z2oNAZfB*pkwG{{i2=oi60R4teAV7cs0RjXF5FkK+009Ew1q6WbEAl`B1PBlyK!5-N z0t5&UAkZ%$0Q4I=fdByl1PBlyK!5-N0t5(z7Z3o#ugC)l5FkK+009C72oNAZfIz>1 z0MKvf1OfyI5FkK+009C72oN9;UO)f{zakGLK!5-N0t5&UAV7cs0RsI30zki^69^C> zK!5-N0t5&UAV7dXcmV+*{E9q~009C72oNAZfIwz}+Dhi}%}!vnfC?~L)OiF55FkK+ z009C72oNAZAfSK%5O67;M1TMR0t5&UAV7cs0RjX@3kU$CMV&{0009C72oNAZfB*pk z1Of^O00EccNdyQGAV7cs0RjXF5FkKcw15CGTGV+22oNAZfB*pk1PBlyKp>!i01$8~ zo;z}5FjvKKm{0Y>O=wr2oNAZfB*pk1PBly5Kce<2)7asB0zuu0RjXF5FkK+ z009Ey1q6WcrcNY4fB*pk1PBlyK!5-N0^tM%fN(4EAOZvk5FkK+009C72oNAJUO)gC zZ|Xz>1PBlyK!5-N0t5&UAP`PK00_4d4O2oNAZfB*pknFVSqna4Lff!P8oz-(dX6Cgl<009C7 z2oNAZfB=C20s=sQC3pe>0t5&UAV7cs0RjXF5ST3>0L&J4J^=y*2oNAZfB*pk1PBla zARqt)Sb`@IAV7cs0RjXF5FkK+0D;*80>Erx=Mx}6fB*pk1PBlyK!5;&00II)fF*bW z0RjXF5FkK+009C72oRVpAOOr3c0K_D1PBlyK!5-N0t5&U2p}K;1XzM65FkK+009C7 z2oNApTY*4;z%2oNAZfB*pk1PBlyK!Ct@0Rdq93Os-S0RjXF5FkK+009C7 z2+S7{0OlLJfdByl1PBlyK!5-N0t5(b7Z3opufPKc5FkK+009C72oNAZfWUkK0bstd z8wd~}K!5-N0t5&UAV7e?b^!rk`wBdO009C72oNAZfB*pk1PII*5CG;IyMX`!0t5&U zAV7cs0RjXFY!?s!wy(eg2oNAZfB*pk1PEjnsI6ok-|Pfd3#b6A#ob4M009C72oNAZ zfB*pk1U3i=02|O| z3kVP(K!5-N0t5&UAV7e?bO8ZiI009C72oNAZfB*pk1PJUG5CHb?zzYZvAV7cs0RjXF5FkK+ zz;potU^=l22oNAZfB*pk1PEjnsI6ok-|PgU38(OcYn2oNAZfB*pk1PBly5Klk=h_@3jB0zuu0RjXF5FkK+009ES z1q6WMqz)uNfB*pk1PBlykXfL%l6icy6NoOL0z}`C_YojKfB*pk1PBlyK!5;&0RjTR z07OR+AV7cs0RjXF5FkK+0D+ z0O#$@iwO`QK!5-N0t5&UAV7e?%K`$x%Vd5)fB*pk1PBlyK!5-N0tC(z5CG2GnHLiv zK!5-N0t5&UAV7csftLjYfS1YqfB*pk1PBlyK!5-N0t5)0Cm;Zvw=*v$K!5-N0t5&U zAV7cs0Rk@z2mmjW`2hg}1PBlyK!5-N0t5&UI8Q(TIB#cOOn?9Z0t5&UAV7cs0RjYG z77zelCi4RV1PBlyK!5-N0+|JBE1AbPJAu;$RDjbr==}r;5FkK+009C72oNAZ;0XZ% z;0YvOAwYlt0RjXF5FkK+009E03kU$GZ_xV*5FkK+009C72oNAZfWQ+10>BeUzCwTi z0RjXF5FkK+009C7P8SdWPT!#S6Cgl<009C72oNAZfB=Cf1O$L5kbH#z0RjXF5FkK+ z009C72%Ih;0Gz%-?Jq@Gywqu1PBly zK!5-N0t5&UcqkwMJS6f30t5&UAV7cs0RjXF5Fl{AfB!M2oNAZfB*pk1PBngBOn0WLGcj* z0t5&UAV7cs0RjXF5V)Fv0C2U9nuh=Z0t5&UAV7cs0RjXF+z}7}?x6UH009C72oNAZ zfB*pk1PEMBKmfSfM$JQj009C72oNAZfB*pk1nvk30C!M)M1TMR0t5&UAV7dXZ3O}W z0@o8z0j{@G6A>UlfB*pk1PBlyK!5;&8vy~}hQtR12oNAZfB*pk1PBlyK;U`;0>Jfl zY9ayz2oNAZfB*pk1PBlya3df9+>rQy009C72oNAZfB*pk1PEMDKmfSjPEACB009C7 z2oNAZfB*pk1a1TbfEyAY5FkK+009C72oNAZfB=E(2?zk!+o_2N5FkK+009C72oNAZ zfWVD_0B}R%0|EpH5FkK+009D-1!^mq$2U8Hs|%*CP07y0RjXF5FkK+0D)uz0zk5b8 z_ikze1PBlyK!5;&^a8b&^acP3Bot5q5-#1y1PBlyK!5-N0t5&UAdpW$0LZs<6B8gn zfB*pk1PBlyK!89(0RbT4(v3`j009C72oNAZfB*pk`2+-jd^%X5q{Q&vn_s_rm^Xs2~eFNqWAj$v$ literal 0 HcmV?d00001 diff --git a/assets/comfortel_logo.png.import b/assets/comfortel_logo.png.import new file mode 100644 index 0000000..01add56 --- /dev/null +++ b/assets/comfortel_logo.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7jnjarkiduib" +path="res://.godot/imported/comfortel_logo.png-f15e1acabec7ae2a6f363848bac9dc4c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/comfortel_logo.png" +dest_files=["res://.godot/imported/comfortel_logo.png-f15e1acabec7ae2a6f363848bac9dc4c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/textures/time_setting.tres b/assets/textures/time_setting.tres new file mode 100644 index 0000000..6cb837b --- /dev/null +++ b/assets/textures/time_setting.tres @@ -0,0 +1,12 @@ +[gd_resource type="GradientTexture2D" load_steps=2 format=3 uid="uid://d0llucl6yfmwj"] + +[sub_resource type="Gradient" id="Gradient_4ltd2"] +offsets = PackedFloat32Array(0, 0.545455, 0.551948, 1) +colors = PackedColorArray(0.117647, 0.101961, 0.101961, 1, 0.117647, 0.101961, 0.101961, 1, 1, 1, 1, 0, 1, 1, 1, 0) + +[resource] +gradient = SubResource("Gradient_4ltd2") +width = 1024 +height = 1024 +fill = 1 +fill_from = Vector2(0.5, 0.5) diff --git a/assets/themes/big.tres b/assets/themes/big.tres new file mode 100644 index 0000000..5d36172 --- /dev/null +++ b/assets/themes/big.tres @@ -0,0 +1,4 @@ +[gd_resource type="Theme" format=3 uid="uid://cmhwbyqu6nh38"] + +[resource] +default_font_size = 46 diff --git a/assets/themes/medium.tres b/assets/themes/medium.tres new file mode 100644 index 0000000..8866de3 --- /dev/null +++ b/assets/themes/medium.tres @@ -0,0 +1,4 @@ +[gd_resource type="Theme" format=3 uid="uid://7lcget51crj1"] + +[resource] +default_font_size = 42 diff --git a/assets/themes/panel_cyan.tres b/assets/themes/panel_cyan.tres new file mode 100644 index 0000000..8cbb43b --- /dev/null +++ b/assets/themes/panel_cyan.tres @@ -0,0 +1,12 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://crantichmjy77"] + +[resource] +bg_color = Color(0, 0.694118, 0.631373, 0.839216) +border_width_left = 3 +border_width_top = 3 +border_width_bottom = 3 +border_blend = true +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 diff --git a/assets/themes/time_font.tres b/assets/themes/time_font.tres new file mode 100644 index 0000000..38b5aad --- /dev/null +++ b/assets/themes/time_font.tres @@ -0,0 +1,4 @@ +[gd_resource type="Theme" format=3 uid="uid://c5nehi7j4wsjd"] + +[resource] +default_font_size = 145 diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..6c55ace --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,205 @@ +[preset.0] + +name="Android" +platform="Android" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="./Talkpal.apk" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=false +encrypt_directory=false + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +gradle_build/use_gradle_build=false +gradle_build/export_format=0 +gradle_build/min_sdk="" +gradle_build/target_sdk="" +architectures/armeabi-v7a=false +architectures/arm64-v8a=true +architectures/x86=false +architectures/x86_64=false +version/code=1 +version/name="" +package/unique_name="com.example.$genname" +package/name="" +package/signed=true +package/app_category=6 +package/retain_data_on_uninstall=false +package/exclude_from_recents=false +package/show_in_android_tv=false +package/show_in_app_library=true +package/show_as_launcher_app=false +launcher_icons/main_192x192="" +launcher_icons/adaptive_foreground_432x432="" +launcher_icons/adaptive_background_432x432="" +graphics/opengl_debug=false +xr_features/xr_mode=0 +screen/immersive_mode=true +screen/support_small=true +screen/support_normal=true +screen/support_large=true +screen/support_xlarge=true +user_data_backup/allow=false +command_line/extra_args="" +apk_expansion/enable=false +apk_expansion/SALT="" +apk_expansion/public_key="" +permissions/custom_permissions=PackedStringArray() +permissions/access_checkin_properties=false +permissions/access_coarse_location=false +permissions/access_fine_location=false +permissions/access_location_extra_commands=false +permissions/access_mock_location=false +permissions/access_network_state=false +permissions/access_surface_flinger=false +permissions/access_wifi_state=false +permissions/account_manager=false +permissions/add_voicemail=false +permissions/authenticate_accounts=false +permissions/battery_stats=false +permissions/bind_accessibility_service=false +permissions/bind_appwidget=false +permissions/bind_device_admin=false +permissions/bind_input_method=false +permissions/bind_nfc_service=false +permissions/bind_notification_listener_service=false +permissions/bind_print_service=false +permissions/bind_remoteviews=false +permissions/bind_text_service=false +permissions/bind_vpn_service=false +permissions/bind_wallpaper=false +permissions/bluetooth=false +permissions/bluetooth_admin=false +permissions/bluetooth_privileged=false +permissions/brick=false +permissions/broadcast_package_removed=false +permissions/broadcast_sms=false +permissions/broadcast_sticky=false +permissions/broadcast_wap_push=false +permissions/call_phone=false +permissions/call_privileged=false +permissions/camera=false +permissions/capture_audio_output=false +permissions/capture_secure_video_output=false +permissions/capture_video_output=false +permissions/change_component_enabled_state=false +permissions/change_configuration=false +permissions/change_network_state=false +permissions/change_wifi_multicast_state=false +permissions/change_wifi_state=false +permissions/clear_app_cache=false +permissions/clear_app_user_data=false +permissions/control_location_updates=false +permissions/delete_cache_files=false +permissions/delete_packages=false +permissions/device_power=false +permissions/diagnostic=false +permissions/disable_keyguard=false +permissions/dump=false +permissions/expand_status_bar=false +permissions/factory_test=false +permissions/flashlight=false +permissions/force_back=false +permissions/get_accounts=false +permissions/get_package_size=false +permissions/get_tasks=false +permissions/get_top_activity_info=false +permissions/global_search=false +permissions/hardware_test=false +permissions/inject_events=false +permissions/install_location_provider=false +permissions/install_packages=false +permissions/install_shortcut=false +permissions/internal_system_window=false +permissions/internet=false +permissions/kill_background_processes=false +permissions/location_hardware=false +permissions/manage_accounts=false +permissions/manage_app_tokens=false +permissions/manage_documents=false +permissions/manage_external_storage=false +permissions/master_clear=false +permissions/media_content_control=false +permissions/modify_audio_settings=false +permissions/modify_phone_state=false +permissions/mount_format_filesystems=false +permissions/mount_unmount_filesystems=false +permissions/nfc=false +permissions/persistent_activity=false +permissions/post_notifications=false +permissions/process_outgoing_calls=false +permissions/read_calendar=false +permissions/read_call_log=false +permissions/read_contacts=false +permissions/read_external_storage=false +permissions/read_frame_buffer=false +permissions/read_history_bookmarks=false +permissions/read_input_state=false +permissions/read_logs=false +permissions/read_phone_state=false +permissions/read_profile=false +permissions/read_sms=false +permissions/read_social_stream=false +permissions/read_sync_settings=false +permissions/read_sync_stats=false +permissions/read_user_dictionary=false +permissions/reboot=false +permissions/receive_boot_completed=false +permissions/receive_mms=false +permissions/receive_sms=false +permissions/receive_wap_push=false +permissions/record_audio=false +permissions/reorder_tasks=false +permissions/restart_packages=false +permissions/send_respond_via_message=false +permissions/send_sms=false +permissions/set_activity_watcher=false +permissions/set_alarm=false +permissions/set_always_finish=false +permissions/set_animation_scale=false +permissions/set_debug_app=false +permissions/set_orientation=false +permissions/set_pointer_speed=false +permissions/set_preferred_applications=false +permissions/set_process_limit=false +permissions/set_time=false +permissions/set_time_zone=false +permissions/set_wallpaper=false +permissions/set_wallpaper_hints=false +permissions/signal_persistent_processes=false +permissions/status_bar=false +permissions/subscribed_feeds_read=false +permissions/subscribed_feeds_write=false +permissions/system_alert_window=false +permissions/transmit_ir=false +permissions/uninstall_shortcut=false +permissions/update_device_stats=false +permissions/use_credentials=false +permissions/use_sip=false +permissions/vibrate=false +permissions/wake_lock=false +permissions/write_apn_settings=false +permissions/write_calendar=false +permissions/write_call_log=false +permissions/write_contacts=false +permissions/write_external_storage=false +permissions/write_gservices=false +permissions/write_history_bookmarks=false +permissions/write_profile=false +permissions/write_secure_settings=false +permissions/write_settings=false +permissions/write_sms=false +permissions/write_social_stream=false +permissions/write_sync_settings=false +permissions/write_user_dictionary=false +dotnet/include_scripts_content=false +dotnet/include_debug_symbols=false +dotnet/embed_build_outputs=false diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..3fe4f4a --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..7e0ee75 --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d4gjit28wdndu" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/override.cfg b/override.cfg new file mode 100644 index 0000000..d2cce21 --- /dev/null +++ b/override.cfg @@ -0,0 +1,36 @@ +; Project settings override file. +; Adds gamepad inputs to built-in actions. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + + +[input] + +ui_accept={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":32,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) +] +} +ui_cancel={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194305,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":6,"pressure":0.0,"pressed":true,"script":null) +] +} +ui_page_up={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194323,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":9,"pressure":0.0,"pressed":true,"script":null) +] +} +ui_page_down={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194324,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null) +] +} diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..ce28135 --- /dev/null +++ b/project.godot @@ -0,0 +1,56 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Talkpal" +run/main_scene="res://scenes/main/main_mobile.tscn" +config/features=PackedStringArray("4.2", "GL Compatibility") +boot_splash/bg_color=Color(0.800491, 0.800491, 0.800491, 1) +boot_splash/image="res://assets/comfortel_logo.png" +config/icon="res://assets/comfortel_logo.png" + +[autoload] + +AppConfig="*res://addons/maaacks_menus_template/base/scenes/autoloads/app_config.tscn" +SceneLoader="*res://addons/maaacks_menus_template/base/scenes/autoloads/scene_loader.tscn" +ProjectMusicController="*res://addons/maaacks_menus_template/base/scenes/autoloads/project_music_controller.tscn" +ProjectUISoundController="*res://addons/maaacks_menus_template/base/scenes/autoloads/project_ui_sound_controller.tscn" +uuid="*res://addons/uuid/uuid.gd" + +[display] + +window/size/viewport_width=1080 +window/size/viewport_height=2340 +window/stretch/aspect="keep_width" +window/handheld/orientation=1 + +[dotnet] + +project/assembly_name="Talkpal Frontend" + +[editor_plugins] + +enabled=PackedStringArray("res://addons/maaacks_menus_template/plugin.cfg", "res://addons/uuid/plugin.cfg") + +[internationalization] + +locale/translations=PackedStringArray("res://addons/maaacks_menus_template/base/translations/menus_translations.en.translation", "res://addons/maaacks_menus_template/base/translations/menus_translations.fr.translation") + +[maaacks_menus_template] + +disable_plugin_dialogues=true +copy_path="res://" + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" +textures/vram_compression/import_etc2_astc=true diff --git a/scenes/board/board.gd b/scenes/board/board.gd new file mode 100644 index 0000000..4b1d81d --- /dev/null +++ b/scenes/board/board.gd @@ -0,0 +1,121 @@ +extends VBoxContainer + +const TimeSlot = preload("res://scenes/board/time_slot.tscn") +const ReservationScene = preload("res://scenes/board/reservation.tscn") +const ReservationIndent = preload("res://scenes/board/reservation_indent.tscn") + +const WorkingDayStart = 8 +const WorkingDayEnd = 21 + +const MinimalMinutesToShowTitle = 30 + +const MockedSchedule = [ + { + "title": "Психолог", + "start_time": 120, + "end_time": 180, + "color": 1 + }, + { + "title": "Дипал", + "start_time": 180, + "end_time": 210, + "color": 2 + }, + { + "title": "Маркетинг", + "start_time": 280, + "end_time": 325, + "color": 3 + } +] + +@onready var _main: Main = get_tree().get_current_scene() +@onready var _timeline = $Panel/Timeline +@onready var _reservations = $Panel/Reservations + +func _ready(): + _remove_time_slots() + _remove_reservations() + + _fill_with_slots() + _update_schedule() + +func _remove_time_slots(): + for time_slot in _timeline.get_children(): + time_slot.queue_free() + +func _fill_with_slots(): + for hour in range(WorkingDayStart, WorkingDayEnd): + var slot = TimeSlot.instantiate() + _timeline.add_child(slot) + slot.set_time(hour) + +func _remove_reservations(): + for reservation in _reservations.get_children(): + reservation.queue_free() + +func _update_schedule(): + if not _main.is_node_ready(): + await _main.ready + + var repo = _main.get_reservation_repo() + var previous_finish_time = 0 + + for reservation in repo.list_reservations(): + var start_time_hours = reservation.start_time['hours'] + var start_time_minutes = reservation.start_time['minutes'] + var start_time = (start_time_hours - WorkingDayStart)*60 + start_time_minutes + + var finish_time_hours = reservation.finish_time['hours'] + var finish_time_minutes = reservation.finish_time['minutes'] + var finish_time = (finish_time_hours - WorkingDayStart)*60 + finish_time_minutes + + var reservation_time = finish_time - start_time + + _compose_indent(start_time - previous_finish_time) + _compose_reservation(reservation_time, reservation.title, reservation.color) + + previous_finish_time = finish_time + +func _compose_indent(minutes): + var indent = ReservationIndent.instantiate() + _reservations.add_child(indent) + indent.set_minutes(minutes) + +func _compose_reservation(minutes, title, color): + if minutes <= MinimalMinutesToShowTitle: + title = "" + + var reservation = ReservationScene.instantiate() + _reservations.add_child(reservation) + reservation.set_minutes(minutes) + reservation.set_title(title) + reservation.set_color(color) + +func _input(event): + if event is InputEventScreenTouch or (event is InputEventMouseButton and event.pressed): + if _clicked_on_timeline(event.position): + await get_tree().create_timer(0.01, false).timeout + + if _main.get_current_page() == Main.Pages.Board: + _main.load_page(Main.Pages.ReservationCreation) + +func _clicked_on_timeline(pos: Vector2): + var timeline_position = _timeline.global_position + return ( + pos.x > timeline_position.x and + pos.x < _timeline.size.x + timeline_position.x + ) and ( + pos.y > timeline_position.y and + pos.y < _timeline.size.y + timeline_position.y + ) + +func _on_room_button_pressed(): + print("emit change room signal") + +func _on_date_button_pressed(): + print("emit change date signal") + +func update(): + _ready() diff --git a/scenes/board/board.tscn b/scenes/board/board.tscn new file mode 100644 index 0000000..0840540 --- /dev/null +++ b/scenes/board/board.tscn @@ -0,0 +1,57 @@ +[gd_scene load_steps=6 format=3 uid="uid://c431r28ef5edp"] + +[ext_resource type="Script" path="res://scenes/board/board.gd" id="1_2wgc4"] +[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="1_na0ey"] +[ext_resource type="PackedScene" uid="uid://cnr23ry08ntv4" path="res://scenes/board/time_slot.tscn" id="2_kklmx"] +[ext_resource type="PackedScene" uid="uid://blv30rxduydmw" path="res://scenes/board/reservation_indent.tscn" id="3_mltgm"] +[ext_resource type="PackedScene" uid="uid://dpi5ft4r8sfwb" path="res://scenes/board/reservation.tscn" id="4_o5rhy"] + +[node name="Board" type="VBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 75.0 +grow_horizontal = 2 +theme_override_constants/separation = 50 +script = ExtResource("1_2wgc4") + +[node name="TopBar" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="RoomButton" type="Button" parent="TopBar"] +layout_mode = 2 +theme = ExtResource("1_na0ey") +text = "Переговорка 1" + +[node name="DateButton" type="Button" parent="TopBar"] +layout_mode = 2 +size_flags_horizontal = 10 +theme = ExtResource("1_na0ey") +text = "Вт, 14 июн. 2022" + +[node name="Panel" type="Control" parent="."] +layout_mode = 2 + +[node name="Timeline" type="VBoxContainer" parent="Panel"] +layout_mode = 2 +offset_top = 50.0 +offset_right = 1036.0 +offset_bottom = 354.0 + +[node name="TimeSlot" parent="Panel/Timeline" instance=ExtResource("2_kklmx")] +layout_mode = 2 + +[node name="TimeSlot2" parent="Panel/Timeline" instance=ExtResource("2_kklmx")] +layout_mode = 2 + +[node name="Reservations" type="VBoxContainer" parent="Panel"] +layout_mode = 2 +offset_top = 50.0 +offset_right = 1036.0 +offset_bottom = 117.0 +grow_horizontal = 2 + +[node name="Indent" parent="Panel/Reservations" instance=ExtResource("3_mltgm")] +layout_mode = 2 + +[node name="Reservation" parent="Panel/Reservations" instance=ExtResource("4_o5rhy")] +layout_mode = 2 diff --git a/scenes/board/reservation.gd b/scenes/board/reservation.gd new file mode 100644 index 0000000..4c6a4ed --- /dev/null +++ b/scenes/board/reservation.gd @@ -0,0 +1,36 @@ +extends HBoxContainer +class_name Reservation + +const HourSize = 150 + +const Colors = { + 1: Color("00b1a1d6"), + 2: Color("f431e0d6"), + 3: Color("eb7130d6") +} + +@onready var _main: Main = get_tree().get_current_scene() +@onready var _title = $Section/SectionLabel +@onready var _panel = $Section/SectionPanel + +func _ready(): + initialize_signals() + +func initialize_signals(): + _panel.gui_input.connect(_on_section_panel_gui_input) + +func set_title(title): + _title.text = title + +func set_minutes(minutes): + _panel.size.y = minutes * HourSize / 60 + custom_minimum_size.y = _panel.size.y + +func set_color(color): + var new_style_box: StyleBoxFlat = _panel.get("theme_override_styles/panel").duplicate() + new_style_box.bg_color = Colors[color] + _panel.set("theme_override_styles/panel", new_style_box) + +func _on_section_panel_gui_input(event): + if event is InputEventScreenTouch or (event is InputEventMouseButton and event.pressed): + print("emit open reservation info signal") diff --git a/scenes/board/reservation.tscn b/scenes/board/reservation.tscn new file mode 100644 index 0000000..ef9a646 --- /dev/null +++ b/scenes/board/reservation.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=4 format=3 uid="uid://dpi5ft4r8sfwb"] + +[ext_resource type="Script" path="res://scenes/board/reservation.gd" id="1_drhpx"] +[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_vfg04"] +[ext_resource type="StyleBox" uid="uid://crantichmjy77" path="res://assets/themes/panel_cyan.tres" id="3_xwx35"] + +[node name="Reservation" type="HBoxContainer"] +custom_minimum_size = Vector2(0, 200) +offset_right = 157.0 +offset_bottom = 200.0 +script = ExtResource("1_drhpx") + +[node name="Indent" type="Label" parent="."] +layout_mode = 2 +theme = ExtResource("2_vfg04") +theme_override_colors/font_color = Color(0, 0, 0, 0) +text = "11:00 " + +[node name="Section" type="Control" parent="."] +layout_mode = 2 + +[node name="SectionPanel" type="Panel" parent="Section"] +layout_mode = 1 +offset_right = 883.0 +offset_bottom = 200.0 +size_flags_horizontal = 3 +theme_override_styles/panel = ExtResource("3_xwx35") + +[node name="SectionLabel" type="Label" parent="Section"] +layout_mode = 1 +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_left = 50.0 +offset_top = -33.5 +offset_right = 396.0 +offset_bottom = 33.5 +grow_vertical = 2 +theme = ExtResource("2_vfg04") +text = "Интервью C++" diff --git a/scenes/board/reservation_indent.gd b/scenes/board/reservation_indent.gd new file mode 100644 index 0000000..37b3c95 --- /dev/null +++ b/scenes/board/reservation_indent.gd @@ -0,0 +1,6 @@ +extends Control + +const HourSize = 150 + +func set_minutes(minutes): + custom_minimum_size.y = minutes * HourSize / 60 diff --git a/scenes/board/reservation_indent.tscn b/scenes/board/reservation_indent.tscn new file mode 100644 index 0000000..4318857 --- /dev/null +++ b/scenes/board/reservation_indent.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://blv30rxduydmw"] + +[ext_resource type="Script" path="res://scenes/board/reservation_indent.gd" id="1_pq834"] + +[node name="Indent" type="Control"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 3 +anchors_preset = 0 +script = ExtResource("1_pq834") diff --git a/scenes/board/time_slot.gd b/scenes/board/time_slot.gd new file mode 100644 index 0000000..3d6c09a --- /dev/null +++ b/scenes/board/time_slot.gd @@ -0,0 +1,6 @@ +extends HBoxContainer + +@onready var _time_label = $TimeLabelControl/TimeLabel + +func set_time(hour): + _time_label.text = str(hour) + ":00" diff --git a/scenes/board/time_slot.tscn b/scenes/board/time_slot.tscn new file mode 100644 index 0000000..018acd0 --- /dev/null +++ b/scenes/board/time_slot.tscn @@ -0,0 +1,62 @@ +[gd_scene load_steps=4 format=3 uid="uid://cnr23ry08ntv4"] + +[ext_resource type="Script" path="res://scenes/board/time_slot.gd" id="1_hwvwy"] +[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_ty4oc"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pfkqv"] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_left = 3 +border_width_top = 3 +border_width_bottom = 3 +border_blend = true +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 + +[node name="TimeSlot" type="HBoxContainer"] +custom_minimum_size = Vector2(0, 150) +theme_override_constants/separation = 25 +script = ExtResource("1_hwvwy") + +[node name="Indent" type="Label" parent="."] +layout_mode = 2 +theme = ExtResource("2_ty4oc") +text = " " + +[node name="TimeLabelControl" type="Control" parent="."] +layout_mode = 2 + +[node name="TimeLabel" type="Label" parent="TimeLabelControl"] +layout_mode = 1 +anchors_preset = 6 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -121.0 +offset_top = -33.5 +offset_bottom = 33.5 +grow_horizontal = 0 +grow_vertical = 2 +theme = ExtResource("2_ty4oc") +text = "11:00" + +[node name="Section" type="Panel" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_pfkqv") + +[node name="EventsContainer" type="GridContainer" parent="."] +visible = false +layout_mode = 2 + +[node name="Event" type="Button" parent="EventsContainer"] +layout_mode = 2 +theme = ExtResource("2_ty4oc") +text = "Переговоры с Клиентами" + +[node name="Event2" type="Button" parent="EventsContainer"] +layout_mode = 2 +theme = ExtResource("2_ty4oc") +text = "Интервью C#" diff --git a/scenes/common/calendar/calendar_edit.gd b/scenes/common/calendar/calendar_edit.gd new file mode 100644 index 0000000..e07a0bf --- /dev/null +++ b/scenes/common/calendar/calendar_edit.gd @@ -0,0 +1 @@ +extends Control diff --git a/scenes/common/calendar/calendar_edit.tscn b/scenes/common/calendar/calendar_edit.tscn new file mode 100644 index 0000000..205072f --- /dev/null +++ b/scenes/common/calendar/calendar_edit.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=3 uid="uid://drdv8adk1wi8f"] + +[ext_resource type="Script" path="res://scenes/common/calendar/calendar_edit.gd" id="1_jxhnl"] +[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_e6eik"] + +[node name="Calendar" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_jxhnl") + +[node name="Button" type="Button" parent="."] +layout_mode = 0 +offset_right = 24.0 +offset_bottom = 31.0 +theme = ExtResource("2_e6eik") +text = "Открыть календарь" diff --git a/scenes/common/edit_field.gd b/scenes/common/edit_field.gd new file mode 100644 index 0000000..5aee32e --- /dev/null +++ b/scenes/common/edit_field.gd @@ -0,0 +1,86 @@ +@tool +extends HBoxContainer + +enum Type { + Line, + Text, + Calendar, + Time +} + +@export var title : String: + set(value): + title = value + set_title(title) + +@export var type := Type.Line: + set(value): + type = value + set_type(type) + +@onready var _label = $FieldLabelControl/FieldLabel +@onready var _line = $Line +@onready var _calendar = $Calendar +@onready var _time = $Time +@onready var _text = $Text + +var _type + +func _ready(): + set_title(title) + set_type(type) + +func set_title(new_title): + if _label == null: + await ready + + _label.text = new_title + +func get_value(): + match _type: + Type.Line: + return _line.text + Type.Text: + return _text.text + Type.Calendar: + return "" + Type.Time: + return { + "hours": _time.get_hours(), + "minutes": _time.get_minutes() + } + +func set_value(value): + _line.text = value + +func set_type(type): + if _line == null: + await ready + + _line.visible = false + _text.visible = false + _calendar.visible = false + _time.visible = false + + _type = type + + match type: + Type.Line: + _line.visible = true + Type.Text: + _text.visible = true + Type.Calendar: + _calendar.visible = true + Type.Time: + _time.visible = true + +func clean(): + match _type: + Type.Line: + _line.text = "" + Type.Text: + _text.text = "" + Type.Calendar: + pass + Type.Time: + _time.clean() diff --git a/scenes/common/edit_field.tscn b/scenes/common/edit_field.tscn new file mode 100644 index 0000000..b2bdf3d --- /dev/null +++ b/scenes/common/edit_field.tscn @@ -0,0 +1,53 @@ +[gd_scene load_steps=6 format=3 uid="uid://d0fdiesiaajlq"] + +[ext_resource type="Script" path="res://scenes/common/edit_field.gd" id="1_sdy7t"] +[ext_resource type="Theme" uid="uid://7lcget51crj1" path="res://assets/themes/medium.tres" id="1_v1b42"] +[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_iq8f3"] +[ext_resource type="PackedScene" uid="uid://drdv8adk1wi8f" path="res://scenes/common/calendar/calendar_edit.tscn" id="4_hlx5p"] +[ext_resource type="PackedScene" uid="uid://bhd0xvnvoqslr" path="res://scenes/common/time/time_edit.tscn" id="5_d0drs"] + +[node name="EditField" type="HBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 67.0 +grow_horizontal = 2 +theme_override_constants/separation = 25 +script = ExtResource("1_sdy7t") + +[node name="FieldLabelControl" type="Control" parent="."] +layout_mode = 2 + +[node name="FieldLabel" type="Label" parent="FieldLabelControl"] +layout_mode = 2 +offset_left = 25.0 +offset_top = 4.0 +offset_right = 231.0 +offset_bottom = 62.0 +theme = ExtResource("1_v1b42") + +[node name="Indent" type="Label" parent="."] +layout_mode = 2 +theme = ExtResource("2_iq8f3") +text = " " + +[node name="Line" type="LineEdit" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_iq8f3") + +[node name="Text" type="TextEdit" parent="."] +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_iq8f3") +wrap_mode = 1 +scroll_fit_content_height = true + +[node name="Calendar" parent="." instance=ExtResource("4_hlx5p")] +visible = false +layout_mode = 2 + +[node name="Time" parent="." instance=ExtResource("5_d0drs")] +visible = false +layout_mode = 2 +size_flags_horizontal = 3 diff --git a/scenes/common/time/time_edit.gd b/scenes/common/time/time_edit.gd new file mode 100644 index 0000000..36f0c47 --- /dev/null +++ b/scenes/common/time/time_edit.gd @@ -0,0 +1,41 @@ +extends Control + +@onready var _main: Main = get_tree().get_current_scene() +@onready var _edit := $Edit + +var _hours := 0 +var _minutes := 0 +var _time_setting_page + +func _ready(): + initialize_signals() + +func initialize_signals(): + _edit.focus_entered.connect(_on_click) + +func _on_click(): + if _main.get_current_page() == Main.Pages.TimeSetting: + return + + _time_setting_page = _main.load_page(Main.Pages.TimeSetting) + _time_setting_page.time_is_set.connect(self._on_time_is_set) + +func _on_time_is_set(hours: int, minutes: int): + _time_setting_page.time_is_set.disconnect(_on_time_is_set) + _edit.text = str(hours) + ":" + _correct_minutes(str(minutes)) + _hours = hours + _minutes = minutes + +func _correct_minutes(value): + return "0" + value if len(value) == 1 else value + +func get_hours(): + return _hours + +func get_minutes(): + return _minutes + +func clean(): + _hours = 0 + _minutes = 0 + _edit.text = "" diff --git a/scenes/common/time/time_edit.tscn b/scenes/common/time/time_edit.tscn new file mode 100644 index 0000000..e9e55e3 --- /dev/null +++ b/scenes/common/time/time_edit.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=4 format=3 uid="uid://bhd0xvnvoqslr"] + +[ext_resource type="Script" path="res://scenes/common/time/time_edit.gd" id="1_2wxyg"] +[ext_resource type="Script" path="res://addons/date-time-elements/scripts/time-input.gd" id="2_7d4ae"] +[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="3_bpvuo"] + +[node name="Time" type="BoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 75.0 +grow_horizontal = 2 +script = ExtResource("1_2wxyg") + +[node name="TimeEdit" type="LineEdit" parent="."] +visible = false +layout_mode = 2 +text = "21:15 " +placeholder_text = "hh:mm (a/p)m" +script = ExtResource("2_7d4ae") +current_time = true + +[node name="Edit" type="LineEdit" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("3_bpvuo") +virtual_keyboard_enabled = false + +[connection signal="mouse_entered" from="TimeEdit/Clock" to="TimeEdit/Clock" method="_on_mouse_entered"] +[connection signal="mouse_exited" from="TimeEdit/Clock" to="TimeEdit/Clock" method="_on_mouse_exited"] +[connection signal="visibility_changed" from="TimeEdit/Clock" to="TimeEdit/Clock" method="_on_visibility_changed"] +[connection signal="draw" from="TimeEdit/ManualClock" to="TimeEdit/ManualClock" method="_on_draw"] diff --git a/scenes/common/time/time_hand.gd b/scenes/common/time/time_hand.gd new file mode 100644 index 0000000..859f5a4 --- /dev/null +++ b/scenes/common/time/time_hand.gd @@ -0,0 +1,40 @@ +@tool +extends Marker2D + +@onready var number = $Number +@onready var number_label = $Number/Label + +@export_range(0, 12, 1, "o'clock") var part : float: + set(value): + part = value + set_part(part) + +@export var value : int: + set(new_value): + value = new_value + await ready + set_value(value) + +var _part: float +var _value: int + +func _process(delta): + number.rotation = -rotation + +func set_part(value): + _part = value + var new_rotation = 2*PI * value / 12 + rotation = new_rotation + +func get_part(): + return _part + +func set_value(new_value): + _value = new_value + number_label.text = str(new_value) + +func get_value(): + return _value + +func get_number_position(): + return number.global_position diff --git a/scenes/common/time/time_hand.tscn b/scenes/common/time/time_hand.tscn new file mode 100644 index 0000000..f80edf6 --- /dev/null +++ b/scenes/common/time/time_hand.tscn @@ -0,0 +1,54 @@ +[gd_scene load_steps=4 format=3 uid="uid://3omkos3a4po7"] + +[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="1_ne7tv"] +[ext_resource type="Script" path="res://scenes/common/time/time_hand.gd" id="1_tiohc"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5bs5k"] +bg_color = Color(1, 1, 1, 0) +corner_radius_top_left = 250 +corner_radius_top_right = 250 +corner_radius_bottom_right = 250 +corner_radius_bottom_left = 250 +anti_aliasing_size = 0.01 + +[node name="Hand" type="Marker2D"] +script = ExtResource("1_tiohc") + +[node name="TapArea" type="Panel" parent="."] +modulate = Color(0.282353, 0.580392, 0.235294, 1) +offset_left = -44.0 +offset_top = -345.0 +offset_right = 45.0 +offset_bottom = -256.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_5bs5k") + +[node name="Number" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_top = -301.0 +offset_right = 1.0 +offset_bottom = -301.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Label" type="Label" parent="Number"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -27.0 +offset_top = -34.0 +offset_right = 27.0 +offset_bottom = 33.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_ne7tv") +text = "20" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/scenes/common/time/time_setting.gd b/scenes/common/time/time_setting.gd new file mode 100644 index 0000000..024f1dd --- /dev/null +++ b/scenes/common/time/time_setting.gd @@ -0,0 +1,175 @@ +extends Control + +const TimeHand = preload("res://scenes/common/time/time_hand.tscn") + +const WorkingDayStart = 8 +const WorkingDayEnd = 21 + +const DigitsNumber = 12 + +enum State { + SettingHours, + SettingMinutes +} + +@export var number_flash_time := 0.5 + +@onready var _main: Main = get_tree().get_current_scene() +@onready var _hours_label = $VerticalBar/Time/Hours +@onready var _minutes_label = $VerticalBar/Time/Minutes +@onready var _time = $VerticalBar/Time +@onready var _face = $VerticalBar/Circle/Face +@onready var _arrow = $VerticalBar/Circle/Clock/Arrow +@onready var _numbers = $VerticalBar/Circle/Clock/Numbers + +var _hours : int +var _minutes : int + +var _state := State.SettingHours +var _time_after_last_flash := 0.0 + +signal time_is_set(hours: int, minutes: int) + +func _ready(): + _set_initial_values() + _start_hours_setting() + +func _set_initial_values(): + _hours = WorkingDayStart + _minutes = 0 + +func _process(delta): + if _time_after_last_flash >= number_flash_time: + _flash_number() + _time_after_last_flash = 0.0 + + _time_after_last_flash += delta + +func _flash_number(): + match _state: + State.SettingHours: + _hours_label.text = str(_hours) \ + if _hours_label.text == '_' else '_' + State.SettingMinutes: + _minutes_label.text = _correct_minutes(str(_minutes)) \ + if _minutes_label.text == '_' else '_' + +func _fill_with_hours(): + _remove_numbers() + for part in range(0, DigitsNumber): + var number = TimeHand.instantiate() + _numbers.add_child(number) + number.set_part(part) + number.set_value(WorkingDayStart + part) + +func _fill_with_minutes(): + _remove_numbers() + for part in range(0, DigitsNumber): + var number = TimeHand.instantiate() + _numbers.add_child(number) + number.set_part(part) + number.set_value(5*part) + +func _remove_numbers(): + for number in _numbers.get_children(): + number.queue_free() + +func _clicked_on_face(pos: Vector2): + var face_position = _face.global_position + return (pos.x > face_position.x and pos.x < _face.size.x + face_position.x) and \ + (pos.y > face_position.y and pos.y < _face.size.y + face_position.y) + +func _clicked_on_time(pos: Vector2): + var time_position = _time.global_position + return (pos.x > time_position.x and pos.x < _time.size.x + time_position.x) and \ + (pos.y > time_position.y and pos.y < _time.size.y + time_position.y) + +func _input(event): + if not _main.get_current_page() == Main.Pages.TimeSetting: + return + + if (event is InputEventScreenTouch and event.pressed) or \ + (event is InputEventMouseButton and event.pressed): # TODO: call on click or release, do not do anything if it was clicked + if _clicked_on_face(event.position): + var number = _get_closest_number(event.position) + _arrow.rotation = number.rotation + + match _state: + State.SettingHours: + set_hours(number.get_value()) + await get_tree().create_timer(0.01, false).timeout + _start_minutes_setting() + State.SettingMinutes: + set_minutes(number.get_value()) + time_is_set.emit(_hours, _minutes) + await get_tree().create_timer(0.01, false).timeout + _main.go_to_previous_page() + _ready() + + elif _clicked_on_time(event.position): + match _get_closest_unit(event.position): + _hours_label: + _start_hours_setting() + _minutes_label: + _start_minutes_setting() + + await event.is_released() == true + +func _get_closest_number(pos: Vector2): + var min_distance = INF + var sought = null + + for number in _numbers.get_children(): + var distance = number.get_number_position().distance_to(pos) + if (distance < min_distance): + min_distance = distance + sought = number + + return sought + +func _get_closest_unit(pos: Vector2): + var min_distance = INF + var sought = null + + for unit in _time.get_children(): + var distance = unit.global_position.distance_to(pos) + if (distance < min_distance): + min_distance = distance + sought = unit + + return sought + +func set_hours(value): + _hours = value + _update_time() + +func get_hours(): + return _hours + +func set_minutes(value): + _minutes = value + _update_time() + +func get_minutes(): + return _minutes + +func _update_time(): + _arrow.rotation = 0.0 + _hours_label.text = str(_hours) + _minutes_label.text = _correct_minutes(str(_minutes)) + +func _correct_minutes(value): + return "0" + value if len(value) == 1 else value + +func _start_hours_setting(): + _state = State.SettingHours + _fill_with_hours() + _update_time() + +func _start_minutes_setting(): + _state = State.SettingMinutes + _fill_with_minutes() + _update_time() + +func update(): + _ready() diff --git a/scenes/common/time/time_setting.tscn b/scenes/common/time/time_setting.tscn new file mode 100644 index 0000000..534b805 --- /dev/null +++ b/scenes/common/time/time_setting.tscn @@ -0,0 +1,131 @@ +[gd_scene load_steps=7 format=3 uid="uid://cxs8xe5w32jo4"] + +[ext_resource type="Script" path="res://scenes/common/time/time_setting.gd" id="1_2uqfu"] +[ext_resource type="Texture2D" uid="uid://d0llucl6yfmwj" path="res://assets/textures/time_setting.tres" id="2_6xoc0"] +[ext_resource type="Theme" uid="uid://c5nehi7j4wsjd" path="res://assets/themes/time_font.tres" id="3_gngar"] +[ext_resource type="PackedScene" uid="uid://3omkos3a4po7" path="res://scenes/common/time/time_hand.tscn" id="4_g84y5"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_23ktd"] +bg_color = Color(1, 1, 1, 1) +corner_radius_top_left = 250 +corner_radius_top_right = 250 +corner_radius_bottom_right = 250 +corner_radius_bottom_left = 250 +anti_aliasing_size = 0.01 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5mbj6"] +bg_color = Color(1, 1, 1, 1) + +[node name="TimeSetting" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_2uqfu") + +[node name="VerticalBar" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Time" type="HBoxContainer" parent="VerticalBar"] +layout_mode = 2 +theme = ExtResource("3_gngar") +alignment = 1 + +[node name="Hours" type="Label" parent="VerticalBar/Time"] +layout_mode = 2 +text = "_" + +[node name="_" type="Label" parent="VerticalBar/Time"] +layout_mode = 2 +text = ":" + +[node name="Minutes" type="Label" parent="VerticalBar/Time"] +layout_mode = 2 +text = "00" + +[node name="Circle" type="TextureRect" parent="VerticalBar"] +layout_mode = 2 +texture = ExtResource("2_6xoc0") + +[node name="Face" type="Control" parent="VerticalBar/Circle"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -350.0 +offset_top = -350.0 +offset_right = 350.0 +offset_bottom = 350.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Clock" type="Control" parent="VerticalBar/Circle"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Arrow" type="Marker2D" parent="VerticalBar/Circle/Clock"] + +[node name="Center" type="Panel" parent="VerticalBar/Circle/Clock/Arrow"] +modulate = Color(0.282353, 0.580392, 0.235294, 1) +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -7.5 +offset_top = -7.5 +offset_right = 7.5 +offset_bottom = 7.5 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_23ktd") +metadata/_edit_use_anchors_ = true + +[node name="Circle" type="Panel" parent="VerticalBar/Circle/Clock/Arrow"] +modulate = Color(0.282353, 0.580392, 0.235294, 1) +offset_left = -44.0 +offset_top = -345.0 +offset_right = 45.0 +offset_bottom = -256.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_23ktd") + +[node name="Panel" type="Panel" parent="VerticalBar/Circle/Clock/Arrow"] +modulate = Color(0.282353, 0.580392, 0.235294, 1) +offset_left = 2.0 +offset_top = 2.0 +offset_right = 6.0 +offset_bottom = 274.0 +rotation = 3.14159 +theme_override_styles/panel = SubResource("StyleBoxFlat_5mbj6") + +[node name="Numbers" type="Control" parent="VerticalBar/Circle/Clock"] +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="Hand" parent="VerticalBar/Circle/Clock/Numbers" instance=ExtResource("4_g84y5")] + +[node name="Hand2" parent="VerticalBar/Circle/Clock/Numbers" instance=ExtResource("4_g84y5")] + +[node name="Hand3" parent="VerticalBar/Circle/Clock/Numbers" instance=ExtResource("4_g84y5")] diff --git a/scenes/main/main_mobile.gd b/scenes/main/main_mobile.gd new file mode 100644 index 0000000..7bf0fbe --- /dev/null +++ b/scenes/main/main_mobile.gd @@ -0,0 +1,48 @@ +@tool +extends Control +class_name Main + +enum Pages { + Board, + ReservationCreation, + TimeSetting +} + +@onready var _reservation_repo : AbstractReservationRepo = $Repos/Reservation + +@export var current_page : Pages: + set(value): + current_page = value + load_page(value, false) + +@onready var _pages := { + Pages.Board: $Pages/Board, + Pages.ReservationCreation: $Pages/ReservationCreation, + Pages.TimeSetting: $Pages/TimeSetting +} + +var _current_page := Pages.Board +var _previous_page : Pages + +func get_current_page(): + return _current_page + +func load_page(value, with_update=true): + _pages[_current_page].visible = false + + if _previous_page != _current_page: + _previous_page = _current_page + + _current_page = value + if with_update: + _pages[_current_page].update() + _pages[_current_page].visible = true + + return _pages[_current_page] + +func go_to_previous_page(): + if _previous_page != null: + load_page(_previous_page) + +func get_reservation_repo() -> AbstractReservationRepo: + return _reservation_repo diff --git a/scenes/main/main_mobile.tscn b/scenes/main/main_mobile.tscn new file mode 100644 index 0000000..92d1c0c --- /dev/null +++ b/scenes/main/main_mobile.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=6 format=3 uid="uid://drqy50fps66oy"] + +[ext_resource type="Script" path="res://scenes/main/main_mobile.gd" id="1_vo4ao"] +[ext_resource type="PackedScene" uid="uid://c431r28ef5edp" path="res://scenes/board/board.tscn" id="2_brvql"] +[ext_resource type="PackedScene" uid="uid://csfn8q6b5hj4y" path="res://scenes/reservation/reservation_creation.tscn" id="3_qr4p2"] +[ext_resource type="PackedScene" uid="uid://cxs8xe5w32jo4" path="res://scenes/common/time/time_setting.tscn" id="4_popa2"] +[ext_resource type="Script" path="res://src/infra/repos/local/reservation.gd" id="5_50dbn"] + +[node name="Main" type="Control"] +layout_mode = 3 +anchor_left = 0.02 +anchor_top = 0.01 +anchor_right = 0.98 +anchor_bottom = 0.99 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_vo4ao") + +[node name="BackgroundColor" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.133333, 0.14902, 0.176471, 1) + +[node name="Pages" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Board" parent="Pages" instance=ExtResource("2_brvql")] +layout_mode = 1 +anchors_preset = 15 +anchor_bottom = 1.0 +offset_bottom = 0.0 +grow_vertical = 2 + +[node name="ReservationCreation" parent="Pages" instance=ExtResource("3_qr4p2")] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_bottom = 1.0 +offset_bottom = 0.0 +grow_vertical = 2 + +[node name="TimeSetting" parent="Pages" instance=ExtResource("4_popa2")] +visible = false +layout_mode = 1 + +[node name="Repos" type="Node" parent="."] + +[node name="Reservation" type="Node" parent="Repos"] +script = ExtResource("5_50dbn") diff --git a/scenes/reservation/reservation_creation.gd b/scenes/reservation/reservation_creation.gd new file mode 100644 index 0000000..ecde03c --- /dev/null +++ b/scenes/reservation/reservation_creation.gd @@ -0,0 +1,115 @@ +extends VBoxContainer + +@onready var _main: Main = get_tree().get_current_scene() +@onready var _back_button := $TopBar/BackButton +@onready var _apply_button := $TopBar/ApplyButton + +@onready var _title_field := $TitleField +@onready var _date_field := $DateField +@onready var _start_time_field := $StartTimeField +@onready var _finish_time_field := $FinishTimeField +@onready var _creator_field := $CreatorField +@onready var _room_field := $RoomField +@onready var _description_field := $DescriptionField + +func _ready(): + initialize_signals() + +func initialize_signals(): + _back_button.pressed.connect(_on_back_button_pressed) + _apply_button.pressed.connect(_on_apply_button_pressed) + +func _on_back_button_pressed(): + _main.load_page(Main.Pages.Board) + +func _on_apply_button_pressed(): + _create_reservation() + +func _create_reservation(): + if not _fields_are_correct(): + return + + var dto = CreateReservationDTO.new() + dto.title = _title_field.get_value() + dto.date = _date_field.get_value() + dto.start_time = _start_time_field.get_value() + dto.finish_time = _finish_time_field.get_value() + dto.creator = _creator_field.get_value() + dto.room_id = _room_field.get_value() # TODO: make it listbox + dto.description = _description_field.get_value() + dto.color = randi_range(1, 3) + + var repo = _main.get_reservation_repo() + repo.create_reservation(dto) + + dto.queue_free() + + _main.load_page(Main.Pages.Board) + clean() + +func _fields_are_correct(): + var successful := true + + if len(_title_field.get_value()) < 1: + print("The title is not entered.") + successful = false + + if not _time_is_correct(): + successful = false + + return successful + +func _time_is_correct(): + var start_time = _start_time_field.get_value() + var finish_time = _finish_time_field.get_value() + + var start_time_is_after_finish_time = \ + start_time["hours"] > finish_time["hours"] or \ + (start_time["hours"] == finish_time["hours"] and \ + start_time["minutes"] >= finish_time["minutes"]) + + if start_time_is_after_finish_time: + print("Start time should not be more than or equal to finish time.") + return false + + var repo = _main.get_reservation_repo() + var reservations = repo.list_reservations() + + var new_start_time_minutes = start_time["hours"]*60 + start_time["minutes"] + var new_finish_time_minutes = finish_time["hours"]*60 + finish_time["minutes"] + + for reservation in reservations: + var other_start_time = reservation.start_time + var other_finish_time = reservation.finish_time + var other_start_time_minutes = other_start_time["hours"]*60 + other_start_time["minutes"] + var other_finish_time_minutes = other_finish_time["hours"]*60 + other_finish_time["minutes"] + + var is_busy = ( + ( + new_start_time_minutes >= other_start_time_minutes and + new_start_time_minutes < other_finish_time_minutes + ) or ( + new_finish_time_minutes > other_start_time_minutes and + new_finish_time_minutes <= other_finish_time_minutes + ) or ( + new_start_time_minutes >= other_start_time_minutes and + new_finish_time_minutes <= other_finish_time_minutes + ) or ( + new_start_time_minutes <= other_start_time_minutes and + new_finish_time_minutes >= other_finish_time_minutes + ) + ) + + if is_busy: + print("The selected time slot is busy.") + return false + + return true + +func update(): + _ready() + +func clean(): + _title_field.clean() + _start_time_field.clean() + _finish_time_field.clean() diff --git a/scenes/reservation/reservation_creation.tscn b/scenes/reservation/reservation_creation.tscn new file mode 100644 index 0000000..23a34e7 --- /dev/null +++ b/scenes/reservation/reservation_creation.tscn @@ -0,0 +1,99 @@ +[gd_scene load_steps=6 format=3 uid="uid://csfn8q6b5hj4y"] + +[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="1_j1bkw"] +[ext_resource type="Script" path="res://scenes/reservation/reservation_creation.gd" id="1_whumk"] +[ext_resource type="PackedScene" uid="uid://d0fdiesiaajlq" path="res://scenes/common/edit_field.tscn" id="2_qfs8j"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dlqbv"] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_top = 5 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yafv8"] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_top = 3 +border_color = Color(0.8, 0.8, 0.8, 0.392157) + +[node name="ReservationCreation" type="VBoxContainer"] +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 23.0 +grow_horizontal = 2 +theme_override_constants/separation = 35 +script = ExtResource("1_whumk") + +[node name="TopBar" type="HBoxContainer" parent="."] +layout_mode = 2 + +[node name="BackButton" type="Button" parent="TopBar"] +custom_minimum_size = Vector2(0, 100) +layout_mode = 2 +theme = ExtResource("1_j1bkw") +text = "Назад" + +[node name="Label" type="Label" parent="TopBar"] +layout_mode = 2 +size_flags_horizontal = 6 +theme = ExtResource("1_j1bkw") +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 3 +theme_override_constants/shadow_offset_y = 3 +text = "Бронирование комнаты" +horizontal_alignment = 1 + +[node name="ApplyButton" type="Button" parent="TopBar"] +custom_minimum_size = Vector2(0, 100) +layout_mode = 2 +theme = ExtResource("1_j1bkw") +text = "Создать" + +[node name="Splitter" type="Panel" parent="."] +custom_minimum_size = Vector2(0, 15) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_dlqbv") + +[node name="TitleField" parent="." instance=ExtResource("2_qfs8j")] +layout_mode = 2 +title = "Название" + +[node name="Splitter2" type="Panel" parent="."] +custom_minimum_size = Vector2(0, 5) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8") + +[node name="DateField" parent="." instance=ExtResource("2_qfs8j")] +layout_mode = 2 +title = "Дата" +type = 2 + +[node name="StartTimeField" parent="." instance=ExtResource("2_qfs8j")] +layout_mode = 2 +title = "Начало" +type = 3 + +[node name="FinishTimeField" parent="." instance=ExtResource("2_qfs8j")] +layout_mode = 2 +title = "Конец" +type = 3 + +[node name="Splitter3" type="Panel" parent="."] +custom_minimum_size = Vector2(0, 5) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8") + +[node name="CreatorField" parent="." instance=ExtResource("2_qfs8j")] +layout_mode = 2 +title = "Создатель" + +[node name="RoomField" parent="." instance=ExtResource("2_qfs8j")] +layout_mode = 2 +title = "Комната" + +[node name="Splitter4" type="Panel" parent="."] +custom_minimum_size = Vector2(0, 5) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8") + +[node name="DescriptionField" parent="." instance=ExtResource("2_qfs8j")] +layout_mode = 2 +title = "Описание" +type = 1 diff --git a/scenes/reservation/reservation_creation_window.tscn b/scenes/reservation/reservation_creation_window.tscn new file mode 100644 index 0000000..5d34ba7 --- /dev/null +++ b/scenes/reservation/reservation_creation_window.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=3 uid="uid://dcwvxdme8mjsq"] + +[ext_resource type="PackedScene" uid="uid://csfn8q6b5hj4y" path="res://scenes/reservation/reservation_creation.tscn" id="1_yk1ll"] + +[node name="ReservationCreation" type="Control"] +layout_mode = 3 +anchor_left = 0.02 +anchor_top = 0.01 +anchor_right = 0.98 +anchor_bottom = 0.99 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="BackgroundColor" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.133333, 0.14902, 0.176471, 1) + +[node name="VerticalBar" parent="." instance=ExtResource("1_yk1ll")] +layout_mode = 0 +anchors_preset = 0 +anchor_right = 0.0 +grow_horizontal = 1 diff --git a/src/domain/entities/reservation.gd b/src/domain/entities/reservation.gd new file mode 100644 index 0000000..43b5268 --- /dev/null +++ b/src/domain/entities/reservation.gd @@ -0,0 +1,20 @@ +extends Node +class_name ReservationEntity + +var id: String + +@export var title: String + +@export var description: String + +@export var room_id: String + +@export var creator: String + +@export var date: String + +@export var start_time: Dictionary # TODO: get rid of dictionaries if can + +@export var finish_time: Dictionary + +@export var color: int diff --git a/src/infra/dtos/reservation/create.gd b/src/infra/dtos/reservation/create.gd new file mode 100644 index 0000000..dd00c42 --- /dev/null +++ b/src/infra/dtos/reservation/create.gd @@ -0,0 +1,18 @@ +extends Node +class_name CreateReservationDTO + +var title: String + +var description: String + +var room_id: String + +var creator: String + +var date: String + +var start_time: Dictionary # TODO: get rid of dictionaries if can + +var finish_time: Dictionary + +var color: int diff --git a/src/infra/dtos/reservation/update.gd b/src/infra/dtos/reservation/update.gd new file mode 100644 index 0000000..708a6f8 --- /dev/null +++ b/src/infra/dtos/reservation/update.gd @@ -0,0 +1,18 @@ +extends Node +class_name UpdateReservationDTO + +@export var title: String + +@export var description: String + +@export var room_id: String + +@export var creator: String + +@export var date: String + +@export var start_time: Dictionary # TODO: get rid of dictionaries if can + +@export var finish_time: Dictionary + +@export var color: int diff --git a/src/infra/repos/abstract/reservation.gd b/src/infra/repos/abstract/reservation.gd new file mode 100644 index 0000000..3e07fe5 --- /dev/null +++ b/src/infra/repos/abstract/reservation.gd @@ -0,0 +1,25 @@ +extends Node +class_name AbstractReservationRepo + +var _current_reservation = null + +func create_reservation(dto: CreateReservationDTO): + pass + +func cancel_reservation(reservation_id): + pass + +func change_reservation(reservation_id, dto: UpdateReservationDTO): + pass + +func get_reservation(reservation_id): + pass + +func list_reservations(): + pass + +func set_current_reservation(value): + _current_reservation = value + +func get_current_reservation(value): + return _current_reservation diff --git a/src/infra/repos/local/reservation.gd b/src/infra/repos/local/reservation.gd new file mode 100644 index 0000000..e492307 --- /dev/null +++ b/src/infra/repos/local/reservation.gd @@ -0,0 +1,54 @@ +extends AbstractReservationRepo +class_name LocalReservationRepo + +const uuid_util = preload('res://addons/uuid/uuid.gd') + +var _reservations = {} + +func create_reservation(dto: CreateReservationDTO): + var entity = ReservationEntity.new() + + entity.id = uuid_util.v4() + entity.title = dto.title + entity.description = dto.description + entity.room_id = dto.room_id + entity.creator = dto.creator + entity.date = dto.date + entity.start_time = dto.start_time.duplicate(true) + entity.finish_time = dto.finish_time.duplicate(true) + entity.color = dto.color + + _reservations[entity.id] = entity + +func cancel_reservation(reservation_id): + _reservations[reservation_id].queue_free() + _reservations.erase(reservation_id) + +func change_reservation(reservation_id, dto: UpdateReservationDTO): + var entity = _reservations[reservation_id] + + entity.title = dto.title + entity.description = dto.description + entity.room_id = dto.room_id + entity.creator = dto.creator + entity.start_date = dto.start_date.duplicate(true) + entity.finish_date = dto.finish_date.duplicate(true) + +func get_reservation(reservation_id): + return _reservations[reservation_id] + +func list_reservations(): + var reservations = [] + + for key in _reservations: + reservations.append(_reservations[key]) + + reservations.sort_custom(self._compare_reservations_by_start_time) + + return reservations + +func _compare_reservations_by_start_time(a: ReservationEntity, b: ReservationEntity) -> int: + var time_a = a.start_time["hours"] * 60 + a.start_time["minutes"] + var time_b = b.start_time["hours"] * 60 + b.start_time["minutes"] + + return time_a < time_b