From 5b440a76797f5a082db608a0f55454fa18032a51 Mon Sep 17 00:00:00 2001 From: Elias Meire Date: Thu, 18 Jul 2024 13:00:54 +0200 Subject: [PATCH] feat(editor): Add context menu to canvas v2 (no-changelog) (#10088) --- .../components/ContextMenu/ContextMenu.vue | 15 +- packages/editor-ui/src/components/Node.vue | 10 +- packages/editor-ui/src/components/Sticky.vue | 19 ++- .../src/components/canvas/Canvas.spec.ts | 16 +- .../src/components/canvas/Canvas.vue | 152 +++++++++++++++--- .../canvas/elements/nodes/CanvasNode.vue | 35 +++- .../elements/nodes/CanvasNodeToolbar.spec.ts | 40 ++--- .../elements/nodes/CanvasNodeToolbar.vue | 8 +- .../nodes/render-types/CanvasNodeDefault.vue | 10 +- .../__tests__/useContextMenu.test.ts | 55 ++++--- .../__tests__/useKeybindings.test.ts | 44 +++++ .../src/composables/useCanvasOperations.ts | 93 +++++++---- .../src/composables/useContextMenu.ts | 46 +++--- .../src/composables/useKeybindings.ts | 77 +++++++++ packages/editor-ui/src/views/NodeView.v2.vue | 106 +++++++++++- packages/editor-ui/src/views/NodeView.vue | 15 +- 16 files changed, 573 insertions(+), 168 deletions(-) create mode 100644 packages/editor-ui/src/composables/__tests__/useKeybindings.test.ts create mode 100644 packages/editor-ui/src/composables/useKeybindings.ts diff --git a/packages/editor-ui/src/components/ContextMenu/ContextMenu.vue b/packages/editor-ui/src/components/ContextMenu/ContextMenu.vue index f8c8ed7a8..13bfcf9c7 100644 --- a/packages/editor-ui/src/components/ContextMenu/ContextMenu.vue +++ b/packages/editor-ui/src/components/ContextMenu/ContextMenu.vue @@ -1,13 +1,12 @@ @@ -230,6 +338,7 @@ onUnmounted(() => { @connect="onConnect" @connect-end="onConnectEnd" @pane-click="onClickPane" + @contextmenu="onOpenContextMenu" > diff --git a/packages/editor-ui/src/components/canvas/elements/nodes/CanvasNode.vue b/packages/editor-ui/src/components/canvas/elements/nodes/CanvasNode.vue index e3cf9829b..fc201c281 100644 --- a/packages/editor-ui/src/components/canvas/elements/nodes/CanvasNode.vue +++ b/packages/editor-ui/src/components/canvas/elements/nodes/CanvasNode.vue @@ -8,6 +8,7 @@ import CanvasNodeRenderer from '@/components/canvas/elements/nodes/CanvasNodeRen import HandleRenderer from '@/components/canvas/elements/handles/HandleRenderer.vue'; import { useNodeConnections } from '@/composables/useNodeConnections'; import { CanvasNodeKey } from '@/constants'; +import { useContextMenu } from '@/composables/useContextMenu'; import { Position } from '@vue-flow/core'; import type { XYPosition, NodeProps } from '@vue-flow/core'; @@ -17,12 +18,14 @@ const emit = defineEmits<{ select: [id: string, selected: boolean]; toggle: [id: string]; activate: [id: string]; + 'open:contextmenu': [id: string, event: MouseEvent, source: 'node-button' | 'node-right-click']; update: [id: string, parameters: Record]; move: [id: string, position: XYPosition]; }>(); const props = defineProps>(); const nodeTypesStore = useNodeTypesStore(); +const contextMenu = useContextMenu(); const inputs = computed(() => props.data.inputs); const outputs = computed(() => props.data.outputs); @@ -110,6 +113,13 @@ function onActivate() { emit('activate', props.id); } +function onOpenContextMenuFromToolbar(event: MouseEvent) { + emit('open:contextmenu', props.id, event, 'node-button'); +} + +function onOpenContextMenuFromNode(event: MouseEvent) { + emit('open:contextmenu', props.id, event, 'node-right-click'); +} function onUpdate(parameters: Record) { emit('update', props.id, parameters); } @@ -135,6 +145,11 @@ provide(CanvasNodeKey, { nodeType, }); +const showToolbar = computed(() => { + const target = contextMenu.target.value; + return contextMenu.isOpen && target?.source === 'node-button' && target.nodeId === id.value; +}); + /** * Lifecycle */ @@ -148,7 +163,10 @@ watch(