1+ import { NodeTypes } from "../EditorNodes" ;
2+ import { WinNode } from "../nodes/WinNode" ;
3+ import styles from "./NodeSelectionModal.module.css" ;
4+
5+ type NodeHandler = ( node :WinNode ) => void
6+
7+ class NodeSelector {
8+ private div :HTMLDivElement ;
9+ private input :HTMLInputElement ;
10+ private _onCreated ?:NodeHandler ;
11+
12+ constructor ( ) {
13+ this . div = document . createElement ( "div" ) ;
14+ this . div . classList . add ( styles . root , styles . hide ) ;
15+ document . body . appendChild ( this . div ) ;
16+
17+ this . input = document . createElement ( "input" ) ;
18+ this . input . type = "text" ;
19+ this . input . placeholder = "Find node by name..." ;
20+
21+ this . div . appendChild ( this . input ) ;
22+
23+ window . addEventListener ( "mousedown" , ev => {
24+
25+ if ( this . visible ) this . hide ( )
26+
27+ } ) ;
28+
29+ this . div . addEventListener ( "mousedown" , ev => {
30+ ev . stopImmediatePropagation ( )
31+ } )
32+
33+ // render types!
34+ //#region Node Types
35+ NodeTypes . forEach ( groupType => {
36+
37+ const ul = document . createElement ( "ul" ) ;
38+ const groupDiv = this . div . appendChild ( document . createElement ( "div" ) ) ;
39+ const title = groupDiv . appendChild ( document . createElement ( "div" ) ) ;
40+
41+ title . innerText = groupType . group ;
42+ title . style . backgroundColor = groupType . color ;
43+ title . classList . add ( styles . groupTitle )
44+
45+ groupType . nodes . forEach ( node => {
46+
47+ const li = ul . appendChild ( document . createElement ( "li" ) ) ;
48+
49+ li . innerText = "→" + node . name ;
50+ li . addEventListener ( "click" , ev => this . addNewNode ( new node . TypeClass ) )
51+
52+ } ) ;
53+
54+ groupDiv . classList . add ( styles . group ) ;
55+ groupDiv . appendChild ( ul )
56+
57+
58+
59+ } ) ;
60+ //#endregion
61+ }
62+
63+ get visible ( ) {
64+ return ! this . div . classList . contains ( styles . hide )
65+ }
66+
67+ private addNewNode ( node :WinNode )
68+ {
69+ this . _onCreated ?.( node ) ;
70+ this . hide ( ) ;
71+
72+ }
73+
74+ hide ( ) {
75+ this . div . classList . add ( styles . hide ) ;
76+ this . _onCreated = undefined ;
77+ }
78+
79+ show ( posX :number , porY :number , onCreated :NodeHandler ) {
80+ this . div . classList . remove ( styles . hide ) ;
81+ this . div . style . left = `${ posX - 20 } px` ;
82+ this . div . style . top = `${ porY - 20 } px` ;
83+
84+ this . input . value = "" ;
85+ this . input . focus ( )
86+
87+ this . _onCreated = onCreated ;
88+ }
89+ }
90+
91+ let modal :NodeSelector ;
92+
93+ export function createNewNode ( showModalAtX :number , showModalAtY :number , onCreated :NodeHandler )
94+ {
95+ if ( ! modal ) modal = new NodeSelector ( ) ;
96+
97+ modal . show ( showModalAtX , showModalAtY , onCreated ) ;
98+ }
0 commit comments