@@ -21,7 +21,7 @@ import { keyboardBusy, keyboardBusyExceptIn, useEvent } from '@/composables/even
21
21
import { useStackNavigator } from ' @/composables/stackNavigator'
22
22
import { provideGraphNavigator } from ' @/providers/graphNavigator'
23
23
import { provideGraphSelection } from ' @/providers/graphSelection'
24
- import { provideInteractionHandler , type Interaction } from ' @/providers/interactionHandler'
24
+ import { provideInteractionHandler } from ' @/providers/interactionHandler'
25
25
import { provideWidgetRegistry } from ' @/providers/widgetRegistry'
26
26
import { useGraphStore , type NodeId } from ' @/stores/graph'
27
27
import type { RequiredImport } from ' @/stores/graph/imports'
@@ -110,7 +110,7 @@ const nodeSelection = provideGraphSelection(graphNavigator, graphStore.nodeRects
110
110
111
111
const interactionBindingsHandler = interactionBindings .handler ({
112
112
cancel : () => interaction .handleCancel (),
113
- click : (e ) => (e instanceof MouseEvent ? interaction .handleClick (e , graphNavigator ) : false ),
113
+ click : (e ) => (e instanceof PointerEvent ? interaction .handleClick (e , graphNavigator ) : false ),
114
114
})
115
115
116
116
// Return the environment for the placement of a new node. The passed nodes should be the nodes that are
@@ -162,7 +162,8 @@ function sourcePortForSelection() {
162
162
}
163
163
164
164
useEvent (window , ' keydown' , (event ) => {
165
- ;(! keyboardBusy () && (interactionBindingsHandler (event ) || graphBindingsHandler (event ))) ||
165
+ interactionBindingsHandler (event ) ||
166
+ (! keyboardBusy () && graphBindingsHandler (event )) ||
166
167
(! keyboardBusyExceptIn (codeEditorArea .value ) && codeEditorHandler (event ))
167
168
})
168
169
useEvent (window , ' pointerdown' , interactionBindingsHandler , { capture: true })
@@ -208,7 +209,7 @@ const graphBindingsHandler = graphBindings.handler({
208
209
openComponentBrowser() {
209
210
if (keyboardBusy ()) return false
210
211
if (graphNavigator .sceneMousePos != null && ! componentBrowserVisible .value ) {
211
- interaction . setCurrent ( creatingNode )
212
+ showComponentBrowser ( )
212
213
}
213
214
},
214
215
newNode() {
@@ -331,7 +332,6 @@ const { handleClick } = useDoubleClick(
331
332
}
332
333
},
333
334
() => {
334
- if (keyboardBusy ()) return false
335
335
stackNavigator .exitNode ()
336
336
},
337
337
)
@@ -370,62 +370,25 @@ const groupColors = computed(() => {
370
370
return styles
371
371
})
372
372
373
- const editingNode: Interaction = {
374
- init : () => {
375
- // component browser usage is set in `graphStore.editedNodeInfo` watch
376
- componentBrowserNodePosition .value = targetComponentBrowserNodePosition ()
377
- },
378
- cancel : () => {
379
- hideComponentBrowser ()
380
- graphStore .editedNodeInfo = undefined
381
- },
382
- }
383
- const nodeIsBeingEdited = computed (() => graphStore .editedNodeInfo != null )
384
- interaction .setWhen (nodeIsBeingEdited , editingNode )
385
-
386
- const creatingNode: Interaction = {
387
- init : () => {
388
- componentBrowserUsage .value = { type: ' newNode' , sourcePort: sourcePortForSelection () }
389
- componentBrowserNodePosition .value = targetComponentBrowserNodePosition ()
390
- componentBrowserVisible .value = true
391
- },
392
- cancel: hideComponentBrowser ,
393
- }
394
-
395
- const creatingNodeFromButton: Interaction = {
396
- init : () => {
397
- componentBrowserUsage .value = { type: ' newNode' , sourcePort: sourcePortForSelection () }
398
- let targetPos = placementPositionForSelection ()
399
- if (targetPos == undefined ) {
400
- targetPos = nonDictatedPlacement (DEFAULT_NODE_SIZE , placementEnvironment .value ).position
401
- }
402
- componentBrowserNodePosition .value = targetPos
403
- componentBrowserVisible .value = true
404
- },
405
- cancel: hideComponentBrowser ,
406
- }
407
-
408
- const creatingNodeFromPortDoubleClick: Interaction = {
409
- init : () => {
410
- // component browser usage is set in event handler
411
- componentBrowserVisible .value = true
412
- },
413
- cancel: hideComponentBrowser ,
373
+ function showComponentBrowser(nodePosition ? : Vec2 , usage ? : Usage ) {
374
+ componentBrowserUsage .value = usage ?? { type: ' newNode' , sourcePort: sourcePortForSelection () }
375
+ componentBrowserNodePosition .value = nodePosition ?? targetComponentBrowserNodePosition ()
376
+ componentBrowserVisible .value = true
414
377
}
415
378
416
- const creatingNodeFromEdgeDrop: Interaction = {
417
- init : () => {
418
- // component browser usage is set in event handler
419
- componentBrowserVisible .value = true
420
- },
421
- cancel: hideComponentBrowser ,
379
+ function startCreatingNodeFromButton() {
380
+ const targetPos =
381
+ placementPositionForSelection () ??
382
+ nonDictatedPlacement (DEFAULT_NODE_SIZE , placementEnvironment .value ).position
383
+ showComponentBrowser (targetPos )
422
384
}
423
385
424
386
function hideComponentBrowser() {
387
+ graphStore .editedNodeInfo = undefined
425
388
componentBrowserVisible .value = false
426
389
}
427
390
428
- function onComponentBrowserCommit (content : string , requiredImports : RequiredImport []) {
391
+ function commitComponentBrowser (content : string , requiredImports : RequiredImport []) {
429
392
if (content != null ) {
430
393
if (graphStore .editedNodeInfo ) {
431
394
// We finish editing a node.
@@ -442,29 +405,21 @@ function onComponentBrowserCommit(content: string, requiredImports: RequiredImpo
442
405
if (createdNode ) nodeSelection .setSelection (new Set ([createdNode ]))
443
406
}
444
407
}
445
- // Finish interaction. This should also hide component browser.
446
- interaction .setCurrent (undefined )
447
- }
448
-
449
- function onComponentBrowserCancel() {
450
- // Finish interaction. This should also hide component browser.
451
- interaction .setCurrent (undefined )
408
+ hideComponentBrowser ()
452
409
}
453
410
454
411
// Watch the `editedNode` in the graph store
455
412
watch (
456
413
() => graphStore .editedNodeInfo ,
457
414
(editedInfo ) => {
458
415
if (editedInfo ) {
459
- componentBrowserNodePosition .value = targetComponentBrowserNodePosition ()
460
- componentBrowserUsage .value = {
416
+ showComponentBrowser (undefined , {
461
417
type: ' editNode' ,
462
418
node: editedInfo .id ,
463
419
cursorPos: editedInfo .initialCursorPos ,
464
- }
465
- componentBrowserVisible .value = true
420
+ })
466
421
} else {
467
- componentBrowserVisible . value = false
422
+ hideComponentBrowser ()
468
423
}
469
424
},
470
425
)
@@ -609,30 +564,23 @@ async function readNodeFromExcelClipboard(
609
564
}
610
565
611
566
function handleNodeOutputPortDoubleClick(id : AstId ) {
612
- componentBrowserUsage .value = { type: ' newNode' , sourcePort: id }
613
567
const srcNode = graphStore .db .getPatternExpressionNodeId (id )
614
568
if (srcNode == null ) {
615
569
console .error (' Impossible happened: Double click on port not belonging to any node: ' , id )
616
570
return
617
571
}
618
572
const placementEnvironment = environmentForNodes ([srcNode ].values ())
619
- componentBrowserNodePosition .value = previousNodeDictatedPlacement (
620
- DEFAULT_NODE_SIZE ,
621
- placementEnvironment ,
622
- {
623
- horizontalGap: gapBetweenNodes ,
624
- verticalGap: gapBetweenNodes ,
625
- },
626
- ).position
627
- interaction .setCurrent (creatingNodeFromPortDoubleClick )
573
+ const position = previousNodeDictatedPlacement (DEFAULT_NODE_SIZE , placementEnvironment , {
574
+ horizontalGap: gapBetweenNodes ,
575
+ verticalGap: gapBetweenNodes ,
576
+ }).position
577
+ showComponentBrowser (position , { type: ' newNode' , sourcePort: id })
628
578
}
629
579
630
580
const stackNavigator = useStackNavigator ()
631
581
632
582
function handleEdgeDrop(source : AstId , position : Vec2 ) {
633
- componentBrowserUsage .value = { type: ' newNode' , sourcePort: source }
634
- componentBrowserNodePosition .value = position
635
- interaction .setCurrent (creatingNodeFromEdgeDrop )
583
+ showComponentBrowser (position , { type: ' newNode' , sourcePort: source })
636
584
}
637
585
</script >
638
586
@@ -662,8 +610,8 @@ function handleEdgeDrop(source: AstId, position: Vec2) {
662
610
:navigator =" graphNavigator"
663
611
:nodePosition =" componentBrowserNodePosition"
664
612
:usage =" componentBrowserUsage"
665
- @accepted =" onComponentBrowserCommit "
666
- @canceled =" onComponentBrowserCancel "
613
+ @accepted =" commitComponentBrowser "
614
+ @canceled =" hideComponentBrowser "
667
615
/>
668
616
<TopBar
669
617
v-model:recordMode =" projectStore.recordMode"
@@ -679,11 +627,7 @@ function handleEdgeDrop(source: AstId, position: Vec2) {
679
627
@zoomIn =" graphNavigator.scale *= 1.1"
680
628
@zoomOut =" graphNavigator.scale *= 0.9"
681
629
/>
682
- <PlusButton
683
- @click.stop =" interaction.setCurrent(creatingNodeFromButton)"
684
- @pointerdown.stop
685
- @pointerup.stop
686
- />
630
+ <PlusButton @pointerdown.stop @click.stop =" startCreatingNodeFromButton()" @pointerup.stop />
687
631
<Transition >
688
632
<Suspense ref =" codeEditorArea" >
689
633
<CodeEditor v-if =" showCodeEditor" />
@@ -698,6 +642,7 @@ function handleEdgeDrop(source: AstId, position: Vec2) {
698
642
position : relative ;
699
643
contain : layout;
700
644
overflow : clip ;
645
+ user-select : none ;
701
646
--group-color-fallback : #006b8a ;
702
647
--node-color-no-type : #596b81 ;
703
648
}
0 commit comments