@@ -254,7 +254,7 @@ export default class BehaviorGraphEditor extends EditorPlugin {
254
254
protected objectSelected ( node : Node | Scene ) : void {
255
255
if ( ! ( node instanceof Node ) && ! ( node instanceof Scene ) ) {
256
256
this . layout . lockPanel ( 'left' ) ;
257
- this . layout . lockPanel ( 'main' , 'Please Select A Node' ) ;
257
+ this . layout . lockPanel ( 'main' , 'No Node Selected ' ) ;
258
258
return ;
259
259
}
260
260
@@ -303,7 +303,7 @@ export default class BehaviorGraphEditor extends EditorPlugin {
303
303
this . layout . unlockPanel ( 'left' ) ;
304
304
305
305
if ( this . datas . metadatas . length === 0 )
306
- this . layout . lockPanel ( 'main' , 'Please add a graph ' ) ;
306
+ this . layout . lockPanel ( 'main' , 'No Graph Selected ' ) ;
307
307
else
308
308
this . layout . unlockPanel ( 'main' ) ;
309
309
}
@@ -475,11 +475,31 @@ export default class BehaviorGraphEditor extends EditorPlugin {
475
475
// Create tree
476
476
const tree = new Tree ( 'GRAPH-CANVAS-CONTEXT-MENU-TREE' ) ;
477
477
tree . wholerow = true ;
478
+ tree . keyboard = true ;
478
479
tree . build ( 'GRAPH-CANVAS-CONTEXT-MENU-TREE' ) ;
479
480
480
481
// Search div
481
482
const searchDiv = $ ( '#GRAPH-CANVAS-CONTEXT-MENU-SEARCH' ) ;
482
- searchDiv . keyup ( ( ) => tree . search ( < string > searchDiv . val ( ) ) ) ;
483
+ searchDiv . keyup ( ( ) => {
484
+ tree . search ( < string > searchDiv . val ( ) ) ;
485
+
486
+ // Select first match
487
+ const nodes = tree . element . jstree ( ) . get_json ( ) ;
488
+ for ( const n of nodes ) {
489
+ if ( n . state . hidden )
490
+ continue ;
491
+
492
+ for ( const c of n . children ) {
493
+ if ( c . state . hidden )
494
+ continue ;
495
+
496
+ tree . select ( c . id ) ;
497
+ break ;
498
+ }
499
+
500
+ break ;
501
+ }
502
+ } ) ;
483
503
484
504
// Save
485
505
this . _contextMenu = {
@@ -506,9 +526,35 @@ export default class BehaviorGraphEditor extends EditorPlugin {
506
526
this . _contextMenu . search . value = '' ;
507
527
508
528
if ( node ) {
509
- // Draw node's options
529
+ this . _contextMenu . mainDiv . style . height = '120px' ;
530
+
531
+ // Draw ouputs
532
+ if ( node . onGetOutputs ) {
533
+ const outputs = node . onGetOutputs ( ) ;
534
+ const parent = this . _contextMenu . tree . add ( { id : 'graph-outputs' , text : 'Outputs' , img : 'icon-helpers' } ) ;
535
+
536
+ outputs . forEach ( o => {
537
+ this . _contextMenu . tree . add ( { id : 'graph-outputs' + o [ 0 ] , text : o [ 0 ] , data : o , img : 'icon-export' } , parent . id ) ;
538
+ } ) ;
539
+
540
+ this . _contextMenu . mainDiv . style . height = '300px' ;
541
+ }
542
+
543
+ // Draw inputs
544
+ if ( node . onGetInputs ) {
545
+ const inputs = node . onGetInputs ( ) ;
546
+ const parent = this . _contextMenu . tree . add ( { id : 'graph-inputs' , text : 'Inputs' , img : 'icon-helpers' } ) ;
547
+
548
+ inputs . forEach ( i => {
549
+ this . _contextMenu . tree . add ( { id : 'graph-inputs' + i [ 0 ] , text : i [ 0 ] , data : i , img : 'icon-export' } , parent . id ) ;
550
+ } ) ;
551
+
552
+ this . _contextMenu . mainDiv . style . height = '300px' ;
553
+ }
554
+
555
+ // Draw misc
556
+ this . _contextMenu . tree . add ( { id : 'graph-clone' , text : 'Clone' , img : 'icon-export' } ) ;
510
557
this . _contextMenu . tree . add ( { id : 'graph-remove' , text : 'Remove' , img : 'icon-error' } ) ;
511
- this . _contextMenu . mainDiv . style . height = '100px' ;
512
558
}
513
559
else {
514
560
// Add new node
@@ -523,19 +569,40 @@ export default class BehaviorGraphEditor extends EditorPlugin {
523
569
this . _contextMenu . mainDiv . style . height = '300px' ;
524
570
}
525
571
526
- this . _contextMenu . tree . onClick = ( id ) => {
572
+ // On the user clicks on an item
573
+ this . _contextMenu . tree . onClick = ( id , data ) => {
527
574
switch ( id ) {
575
+ case 'graph-clone' :
576
+ const clone = < LiteGraphNode > LiteGraph . createNode ( node . type ) ;
577
+ clone . pos = [ event . offsetX , event . offsetY ] ;
578
+
579
+ Object . assign ( clone . properties , node . properties ) ;
580
+ Object . assign ( clone . outputs , node . outputs ) ;
581
+
582
+ this . graphData . add ( clone ) ;
583
+ break ;
528
584
case 'graph-remove' :
529
585
this . graphData . remove ( node ) ;
530
586
break ;
531
587
532
588
default :
533
- return ;
589
+ // Input
590
+ if ( id . indexOf ( 'graph-inputs' ) === 0 ) {
591
+ node . addInput ( data [ 0 ] , data [ 1 ] ) ;
592
+ }
593
+ // Outputs
594
+ else if ( id . indexOf ( 'graph-outputs' ) === 0 ) {
595
+ node . addOutput ( data [ 0 ] , data [ 1 ] ) ;
596
+ }
597
+ else {
598
+ return ;
599
+ }
534
600
}
535
601
536
602
this . _contextMenu . mainDiv . style . visibility = 'hidden' ;
537
603
} ;
538
604
605
+ // On the user dbl clicks an item
539
606
this . _contextMenu . tree . onDblClick = ( id ) => {
540
607
// Create node
541
608
const node = LiteGraph . createNode ( id ) ;
@@ -549,11 +616,28 @@ export default class BehaviorGraphEditor extends EditorPlugin {
549
616
this . _contextMenu . mainDiv . style . visibility = 'hidden' ;
550
617
} ;
551
618
552
- // Search
619
+ // Focus on search
553
620
setTimeout ( ( ) => this . _contextMenu . search . focus ( ) , 1 ) ;
554
621
555
- // Mouse up
556
- const mouseUpCallbac = ( ev : MouseEvent ) => {
622
+ // Enter (once a node is selected)
623
+ const enterCallback = ( ev : KeyboardEvent ) => {
624
+ if ( ev . keyCode !== 13 )
625
+ return ;
626
+
627
+ const selected = this . _contextMenu . tree . getSelected ( ) ;
628
+ if ( ! selected )
629
+ return ;
630
+
631
+ this . _contextMenu . tree . onDblClick ( selected . id , selected . data ) ;
632
+ this . _contextMenu . tree . onClick ( selected . id , selected . data ) ;
633
+
634
+ window . removeEventListener ( 'keyup' , enterCallback ) ;
635
+ } ;
636
+
637
+ window . addEventListener ( 'keyup' , enterCallback ) ;
638
+
639
+ // Mouse up (close or not the context menu)
640
+ const mouseUpCallback = ( ev : MouseEvent ) => {
557
641
let parent = < HTMLDivElement > ev . target ;
558
642
while ( parent ) {
559
643
if ( parent . id === this . _contextMenu . mainDiv . id )
@@ -564,10 +648,11 @@ export default class BehaviorGraphEditor extends EditorPlugin {
564
648
565
649
if ( ! parent ) {
566
650
this . _contextMenu . mainDiv . style . visibility = 'hidden' ;
567
- window . removeEventListener ( 'mousedown' , mouseUpCallbac ) ;
651
+ window . removeEventListener ( 'mousedown' , mouseUpCallback ) ;
652
+ window . removeEventListener ( 'keyup' , enterCallback ) ;
568
653
}
569
654
} ;
570
655
571
- window . addEventListener ( 'mousedown' , mouseUpCallbac ) ;
656
+ window . addEventListener ( 'mousedown' , mouseUpCallback ) ;
572
657
}
573
658
}
0 commit comments