From f5a6ad745e77bbabb374639e6a01d8e9fd665b1c Mon Sep 17 00:00:00 2001 From: Daniel Ledda Date: Wed, 4 Jan 2023 12:56:05 +0100 Subject: [PATCH] fix: added untracked files: --- assets/svgs/LF.png | Bin 0 -> 4239 bytes assets/svgs/LH.png | Bin 0 -> 3358 bytes assets/svgs/RF.png | Bin 0 -> 3844 bytes assets/svgs/RH.png | Bin 0 -> 3472 bytes src/AppState.ts | 37 ++++++++++++++++++ src/ui/Root/Toolbox.css | 46 ++++++++++++++++++++++ src/ui/Root/ToolboxView.tsx | 75 ++++++++++++++++++++++++++++++++++++ 7 files changed, 158 insertions(+) create mode 100644 assets/svgs/LF.png create mode 100644 assets/svgs/LH.png create mode 100644 assets/svgs/RF.png create mode 100644 assets/svgs/RH.png create mode 100644 src/AppState.ts create mode 100644 src/ui/Root/Toolbox.css create mode 100644 src/ui/Root/ToolboxView.tsx diff --git a/assets/svgs/LF.png b/assets/svgs/LF.png new file mode 100644 index 0000000000000000000000000000000000000000..88a0415c690e4554fdfd0afdbeabd21a95a30102 GIT binary patch literal 4239 zcma(#`#;nF_p@PJVN7nhjW(70tx35o#M~2#B668~2$@?p6f!Jw8AWgR&_#l}PQiBCDkD`u+uZ*iJO2mb*~ zkcaQPJt*T5cm&=(ibwhW9~?2gGduc~}s1B3^JTI9{R;1QHdqwm9KJy#3|Qd5Y)RxPj!5F^{nkVq&)Z@l4-z=@sb# zrD7CJ3WK{wl-18?AmP)4hG??OI1=FhLOT)63)0w@k&j1NEAuvkn6s|3 zPP)x7WD0*CxR&HKSte7JTU$Q8vR#0yU)2W=9g)!vGY8)*7VTCw$!c^7%i?;XsrsMz zax2}@hX1(bvc{HErBE_|o?rv<7%@z647SOEnrU1;3r7o|A?5SzBb#3u=i?^5;l#$^ z12$%Q8PX+s4D)HfSCoupMB2HX2T1&WqrE$~ON2_qv=h5rOE>&^XXBrQWLC>q2syxB zxINq(1Zft9;!%g2C@I&5l*m=)igm8zb+@B|8O!Fn7e%DJSRTFrVs4Uyvj); z@jiG|P}82BGxr1`fyhUagi_)I-*Zbs|q4-?B5Rm4xBJ>OSBjd1h; zs`|SQN#BQ(mMz!b)NaGuiS_sD6f7tf==_NKPfk%g zSpzMO&)-&}bDdr}yUKp!xm|18V|2P%OkhetvqErK9ga4hM^S^krH({w+wg?ow_ZG< z9z3*0kfjv|IX|cyp*6agYIiEXEgFv2@lmf@tF?b!L(k;TQwa-FE;2&mOByG3vg7|{ zScTZB2|kdid z29K&6`34%W6}TEw*rC@J@BJiN9|j-T;|DH=d~|kL(bj^wuhoe1z=|2|^g2ryC7z^fO zAAHy(Cj_?OB=LztDq$X_b8RspB6Mom5uw3_OHgAHp^j;wEd>Y#ZMj ztRwNi)F(a2e)f$R(VM03#eZ3PBg;=b=|w)9vy2kZ&7Mu;B`C%Buq~t>_gFlfr<4Wq zaOe)%6oV6m{OB~yVV-3thcY90Cx4vbXs4t5_v`4?YxcV^24x2_U3fFP#eyjl)LQ!_7)>C)F? zWVH}(vsOHpMhgR9;y01~JDn7PSp2|UdpdMirpltCJXsN#Wk7)!ulkJ#=8B;gZp@|| zxio2vE0J$mc%1JN+;(|K>HIB~H;P)Q$NC*;v;GjN20SGurFU*GVVIHBy(6I}X^-5R zPu!JtJxXX%cWXLFQ;!C$+_ zE&oYCBcWPA5iyhnT1-9Dew5xS&N9;boF=LoKCeNh$ml(n;Hu3G`)|o392i~n0}M~D zA*Z0C)Ieoq!_q_AibFd4ZIz9ADY>(J8H&XJ(V>@;w?XL~-8pwO#i_W5rL^iA2E(JC zWn8m2fUv+v=q(7gV>%!7Z_6MpId&^e)V&Qk z^|mN2)JMB7f{UJtnB)j0;bS8eYp&x1n)gtvA7 zAh}1%ypLvSWoh<7YT{^&)a$I0OJcI z8MMte&RqIn3s6#KS$f}p8a`}-Yav?s;Z;Xh`V$m8Z?#Dxz6Hq?l>0NKfg{ZGN@)Yw z-CEioaPGyOy$W_oYQST;Sz3?5x>SzO#v%Q4s3x6mlf<^xoq=nVpD#Vt)Y}~0i zv+EOGNcs!e{T{mV1`oS9I-=0iH~nHk_6wo)L#WiYpC^eOV^ggI&iv{0oU_I~!dL)e z0PwsQCEuTUfyqUg%9(vCony7)uYeVOT8)?FI%}W7;C@7(TB;{kihG8MP5kj{w?g_1 zfSC#xOfug$bbxV|qnQ`(12h$BQ38RZgwzvCKSMOw!3@7yyH-n^a|j(E6lN92OJUf|(x z`>y83f*gh7MsL<-<0`a2MmP?7f!G$^btyqUX{CJIN-|3PdUPxDLrC%<^N7B?%O4*b zN&Ghrtp_CrvZh$FHWW`o6oCg+{1xbwge;miC#Lw5+yY&{P%ApviX!WXp1b z&I!*>Rzi2AzDBl*Yvr7yJPaULe`*;uhvtR|$B!Q;l8ClrpFdO}$;ES9#L}^liJPE% zm-ldWfn1`_^pH+b#~Aa{!ilJl;LeeG0^z(F?BGD)FuOXMr~f>HJ?*rUNu^Zcj0O%f zZHbqcwaj2@0v^76;WsAaSB#yBQJ>{;bbcR#GvhZvV_kkyWm6#W_RlZj8{$yzPs%LQ zzd2QRs10XhouqXV)%1SrPAg7i*|{2@uScBe=2Y~G9e3?4S#CH^w|G72(5>Nt(isAd zCA!Cmz7DE#KyY;;+87}lg1h^cA`tW&gUajG@_3g|zf3=#_PkMx^}04TQU?iP_;OE& zY!uIlFdYFIzc>9$;#^3}llvzoq}Erw`eW)gn;qCCAR_gl1N1+AV9uU*~Av$v>2%!FA)J$}C;>&R)G~^ESD_UuzKIvlWjYnzuyjS?coQoRn;3WYXaZ)jXyaV) zdWX6VDvC0b@9JVJrT9ji;h^_C|IO`V!yPw#ihGMD&vVe-cev&pZQz&(%G!^z>c7!H zpmj-dsdzm5_xF=Q(UG}RV$5_#G9wb2`G zPY!=}gpNPC>X_&s#BOLM)wd4N@HYR|t%VmT$!2Aq6Ro@A>dk$l`bGOrlbTMAML9#y z%=Syl!Tq_*9pv;dx1!RDntDw8dMI=EzL^kXPua(^rz5d}H;{ve+jZU~1>VE-TOqg- zm@9Ew7AVf${O9E3K(B$4Wgl>Q32FvI6vj++xAQ5bi4(1Qj{}$@(Mmx7YU2W8xIJ*< z>*D~DBgl)dth*d+CNwOwW7o@GX;!UvA~O8VnE-*w267Uca~|9{ZI~T<=BG07P@oW0 zUNEVgN5J;P8#AD8;a3~=iILb}MBiuOtlG6jakE3C9i>jcnEG@>qu5mmu8i0$E9^@M zZ3Ig=6It8uOjHkgYhQAlDB(4;<9&S1|NJ(ooMnaoE52CwmG(Fwhw`#)kucMj75I3n zLS%XE6_k^5=gxG%;T9pIOvJ{?w}&~uD>_0rf2CLnIS>TXN=<9IbN9$)xhO2?VoyVA za@Q2`$JU7*lZ}2wZ@N*JKU)$e%8AJsqOZFRql!YN98sbQx#w^)*~w z&Ao;$G>H6pBz>vQa7QJy8!-8Lv&6EGz%;_Ix8bn3yJc}FqN;;YfEpd2cLOm-z z66ejG(n$DgPE;F%vbwYe#@D013V{~@J++A%%-z`cgEx1Zdb0h9iI*{NFJp_wl3g*fhY(Yi zv6G@k)}|T???i*LOcdYoJ->f`-}61+d(Lw|_qoq~?!C|FKIb{-#@pLkNkA2$002M& zkHb0$uzy!Xgav)I%aZ~Dhz8;=1PM^+-(siHJti2a-*IvYwz%bWIrzpc06-)=$a=tz za4yhV2e0c8XhS60=xGT9%&$Y@3;P|kv+4Z!gfo!CF9&3l}Z5|C6U zN`jE=LFbpBRp)Jw!d_)FHd;2?=15l-c^WUb7%}3G^8Uo0 zeBDc6nbHDOi}sE9(^m7?r~aCB!MSR34N;j_UP{nZ3bw9u)4&YSYX4>CXT^JUpykZD zvwm%))PZozqMH|Ke;{%p@>hZC)xx2+$JkfYt8vFNUw44BlOPgp4)}8hxm`tUp(z~8 z+(Tkn(?fR@-;x`n6qBnq!`mN6Iz1&>9H)*L^l3(p;9Q|CibjYDu*>n!(UT%6JE-PisT-|zaVaYlZqoPrLI2h7`yhQF6`Yu^QTm(!*SNsc_f*BGUf&_MR~?c zC+27js!#f*>!S_u{f6U#dbPhr^e+MPw7qK@%6qL?z;ol2pSXz=w_(5Z0rc&L@|Y!j%9Psxf=d}C~=Z3ynX1w8&~}3tm-NJAv8aZuI%#>J&3@v)bJ48 z=5NGj|IAf)`~vIuw@`~uVRg@nP4eEq)6Ti^cki?eGu+AQ%h!W|0x{Bof$LvOxe;d1 zR3b|bjq6W$mrWgsf*K|4w8MS%-UH`xcUZS+8Kp~LymvScFtRAoa=Ck4PuNt?8{c`N z=aw1Edt~5+Az)CkW!sxPk7`D`H(GU#>)ReWgKkECXgJcbuTm!I>HGvjezfB zhxr@auzZrJ!TrhnQO;|FG6kN%okKK46Tv zDY863ZT6+WtN%)v=uuoW&livU8=}`2Oe`m?9~h)lk`(?uurG!Gy{k-xe8qq^Ccnps`u6-OcB~K4(|{%oed^XVe(EqDx= zcyR!Kxz)+sEN99f44`vf6wGLvUYL)JeK_ey(8P%!QrHhL z%o7>3kys9e{`u&(vfz4zaHzAEvA>9hEM4{^CD>jRyn?RZJ%sS~vCQ9zL6CnEq@fNk z)mypRt6eSz?+w*;0nT=Zh@}i9*ZRBlW=_u1w=-+>OT>qFDd|N4O$Tt8_~>loDd5MKW&CGG5jri%R;{n62&`4Md{W!Cp9O9J1Z%4<^(`!$arNM+?!&&8$ z>%}I&*xiFNU-n%POMfRWH#PY=}cRgdA8`_FA0>|dYE*}nHp*V_`y&Ona6*>sR9 zJMb!Q4)zvh2U*7-8*}B1$M-4{E``?lQH00uwxXv~cL+vf_9Q8#xW2T2g`1E-$D+E} zIm(1lOMFg*b8PU`lGkw! zY0#SetvPSmoiEy_o$ z*O2WVCp5Af7*-Xi^GY!z(#fMZLB3si_+EdF{h4qi-?*^+F2!X_+2T0^!W@7f9ti2Z zHcN3q{Z&a%!5Mu?W^PE|8>fnS+9(ruSCsot-XV*5O5j|PCpT0eiZlCI`YdMLEIJ$L?0TFtEj;yI9t7;(h6$I<+ ztugNh{ZVowr-N=M-^8_jSdo$1^74Et2+BcY?)Ow{9T z3)V9xMy9=Qe(G7#Rr)@z$gEt*Rg)QY{5=}o=7hZ>0;5(0lxihlSK#m)-* z3~iZQu?AK^z@NQ6U>NlPL94$o=EbeJ+DFwX z)S?@=bxM#*%U(+*Kcldud<@pnQdV7!C;VhEziZBhIUf{6HBWzlL={DMXA+=+!g*w`S;pI{P zS%sXtnYOA$%LKH8$L5AujypvrRa+0(X1(S8x*~p)33<3RsXMtXlA)~#`(?R3r&&ih z5PEcI!RVI8a#9Dp$5!V#5(4VwR_ zEFz}K3j5ZVlw2h9!o^YD->T7tsUq0mRW@@0<>|;nrj3Ys3jE{A z5(qe3%{!Wd@bKat)D0C5492q4FgUm1KjnQBseFTFb507QzTusMQ`)TuS8_i3nLWn2 zN<=D5sJdhs+bXd|5unJD)wmBy7E4f|8}Cfy(Pg-Y_neXO?}V@7;Wd)8V_YwR%hX<@ zY#(11It)|_T3XjT*LqQY&oe(87|2w-YAE-bS`-i=_NyULXaD1|EsFL12Iy`5W$ot| z(v`?EWn*>U!ykp;GP{<#s>!KlE|B+Tf2Id2jgl6ssLi@zS*&Jc{k|%pNTX4?Sy5(D zOML7t{n1WnDd>9G?9D%nn~_1O4e36k>Ei&%TVDN26G-0SL;Fflp~Q_LumXiX>txje z0~ClXiuh$5W<`^g%AG?Pviy7V^4<(2N-^E*y2m9>HnV`4bGZH6NvE`LmE{4@7l`Jz z;SJxUTrpZIeJ|6*Bg{kI1LLtm?eYg20LC3NW~QhUscNPF@g?}T+St7Va5^{yl1Ig_ Q3jQ_#yrnJniMa>mUm*`C?EnA( literal 0 HcmV?d00001 diff --git a/assets/svgs/RF.png b/assets/svgs/RF.png new file mode 100644 index 0000000000000000000000000000000000000000..f0461bded93acfa38343c5107bb5203ee869a12e GIT binary patch literal 3844 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 literal 0 HcmV?d00001 diff --git a/assets/svgs/RH.png b/assets/svgs/RH.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0e3b32412e942d2e878b2def84cbe8a9118ad9 GIT binary patch literal 3472 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 literal 0 HcmV?d00001 diff --git a/src/AppState.ts b/src/AppState.ts new file mode 100644 index 0000000..43b6831 --- /dev/null +++ b/src/AppState.ts @@ -0,0 +1,37 @@ +import { ISubscriber, Publisher } from "@djledda/ladder"; +import { TrackUnitStickingType, TrackUnitType } from "./TrackUnit"; + +export type UITool = + | "track-unit-type" + | "eraser" + | "sticking"; + +export type AppStateEvent = "appstate-tool-select"; + +export default class AppState { + private publisher = new Publisher(this); + selectedTool: UITool = "track-unit-type"; + activeTrackUnitType: TrackUnitType = "Normal"; + activeStickingType: TrackUnitStickingType = "lh"; + + constructor() {} + + addSubscriber(subscriber: ISubscriber, subscribeTo: Parameters["addSubscriber"]>[1]) { + this.publisher.addSubscriber(subscriber, subscribeTo); + } + + selectStickingTypePaint(stickingType: TrackUnitStickingType) { + this.activeStickingType = stickingType; + this.publisher.notifySubs("appstate-tool-select"); + } + + selectTrackUnitTypePaint(trackUnitType: TrackUnitType) { + this.activeTrackUnitType = trackUnitType; + this.publisher.notifySubs("appstate-tool-select"); + } + + selectTool(tool: UITool) { + this.selectedTool = tool; + this.publisher.notifySubs("appstate-tool-select"); + } +} diff --git a/src/ui/Root/Toolbox.css b/src/ui/Root/Toolbox.css new file mode 100644 index 0000000..5e88d38 --- /dev/null +++ b/src/ui/Root/Toolbox.css @@ -0,0 +1,46 @@ +.root-toolbox { + position: relative; +} + +.root-toolbox .main-row { + height: 2.5em; + margin: auto; + display: flex; + background-color: var(--color-ui-neutral-dark); + justify-content: center; + width: 100%; +} + +.root-toolbox .details { + position: absolute; + top: 2.5em; + left: 0; + right: 0; + margin: auto; + width: min-content; + border-radius: 0 0 1em 1em; + padding: 0.5em; + background-color: var(--color-ui-neutral-dark-active); + display: flex; + justify-content: center; +} + +.root-toolbox .track-unit { + margin: 0; + padding: 0; +} + +.root-toolbox .toolbox-button { + padding: 0.5em; + cursor: pointer; + color: black; + background-color: var(--color-ui-neutral-dark); +} +.root-toolbox .toolbox-button:hover { + background-color: var(--color-ui-neutral-dark-hover); +} +.root-toolbox .toolbox-button.active { + background-color: var(--color-ui-neutral-dark-active); +} + + diff --git a/src/ui/Root/ToolboxView.tsx b/src/ui/Root/ToolboxView.tsx new file mode 100644 index 0000000..6284d36 --- /dev/null +++ b/src/ui/Root/ToolboxView.tsx @@ -0,0 +1,75 @@ +import AppState, { AppStateEvent } from "@/AppState"; +import { TrackUnitStickingTypeList, TrackUnitTypeList } from "@/TrackUnit"; +import { Capsule, h, frag, Rung, RungOptions, ISubscriber } from "@djledda/ladder"; +import TrackUnitView, { StickingTypeIconMap } from "../TrackUnit/TrackUnitView"; +import IconView from "../Widgets/Icon/IconView"; +import "./Toolbox.css"; + +type ToolboxOptions = RungOptions & { + state: AppState, +}; + +export default class ToolboxView extends Rung implements ISubscriber { + private state: AppState; + + constructor(options: ToolboxOptions) { + super(options); + this.state = options.state; + this.state.addSubscriber(this, 'appstate-tool-select'); + } + + notify(publisher: unknown, event: AppStateEvent): void { + if (event === 'appstate-tool-select') { + this.redraw(); + } + } + + private SubMenuButtons = () => { + switch (this.state.selectedTool) { + case "track-unit-type": + return
{...TrackUnitTypeList.map(type => ( + + ))}
; + case "sticking": + return
{...TrackUnitStickingTypeList.reduce((prev, stickingType) => { + if (stickingType !== "none") { + prev.push( as HTMLButtonElement); + } + return prev; + }, [] as HTMLElement[])}
; + case "eraser": + return <>; + } + } + + protected build() { + return
+
+
this.state.selectTool("track-unit-type")}> + Track Type +
+
this.state.selectTool("sticking")}> + Sticking +
+
this.state.selectTool("eraser")}> + Eraser +
+
+ +
as HTMLDivElement; + } +}