From d4d6ed0bb5c4ef2ab0502e0aa73f38f4172d969b Mon Sep 17 00:00:00 2001 From: Comfy Org PR Bot Date: Mon, 24 Nov 2025 05:58:15 +0900 Subject: [PATCH] [backport core/1.32] Fix: Opening mask editor on context menu (#6869) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backport of #6825 to `core/1.32` Automatically created by backport workflow. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6869-backport-core-1-32-Fix-Opening-mask-editor-on-context-menu-2b46d73d36508196a2bfd8412f468196) by [Unito](https://www.unito.io) Co-authored-by: Terry Jia --- src/composables/maskeditor/useMaskEditor.ts | 48 +++++++++++++++++++++ src/extensions/core/maskeditor.ts | 30 +------------ src/services/litegraphService.ts | 7 +-- 3 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 src/composables/maskeditor/useMaskEditor.ts diff --git a/src/composables/maskeditor/useMaskEditor.ts b/src/composables/maskeditor/useMaskEditor.ts new file mode 100644 index 000000000..ad6a995e9 --- /dev/null +++ b/src/composables/maskeditor/useMaskEditor.ts @@ -0,0 +1,48 @@ +import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode' +import { useDialogStore } from '@/stores/dialogStore' +import TopBarHeader from '@/components/maskeditor/dialog/TopBarHeader.vue' +import MaskEditorContent from '@/components/maskeditor/MaskEditorContent.vue' + +export function useMaskEditor() { + const openMaskEditor = (node: LGraphNode) => { + if (!node) { + console.error('[MaskEditor] No node provided') + return + } + + if (!node.imgs?.length && node.previewMediaType !== 'image') { + console.error('[MaskEditor] Node has no images') + return + } + + useDialogStore().showDialog({ + key: 'global-mask-editor', + headerComponent: TopBarHeader, + component: MaskEditorContent, + props: { + node + }, + dialogComponentProps: { + style: 'width: 90vw; height: 90vh;', + modal: true, + maximizable: true, + closable: true, + pt: { + root: { + class: 'mask-editor-dialog flex flex-col' + }, + content: { + class: 'flex flex-col min-h-0 flex-1 !p-0' + }, + header: { + class: '!p-2' + } + } + } + }) + } + + return { + openMaskEditor + } +} diff --git a/src/extensions/core/maskeditor.ts b/src/extensions/core/maskeditor.ts index 0a3018bf8..5d8dadea9 100644 --- a/src/extensions/core/maskeditor.ts +++ b/src/extensions/core/maskeditor.ts @@ -5,10 +5,9 @@ import { app } from '@/scripts/app' import { ComfyApp } from '@/scripts/app' import { useMaskEditorStore } from '@/stores/maskEditorStore' import { useDialogStore } from '@/stores/dialogStore' -import MaskEditorContent from '@/components/maskeditor/MaskEditorContent.vue' -import TopBarHeader from '@/components/maskeditor/dialog/TopBarHeader.vue' import { MaskEditorDialogOld } from './maskEditorOld' import { ClipspaceDialog } from './clipspace' +import { useMaskEditor } from '@/composables/maskeditor/useMaskEditor' function openMaskEditor(node: LGraphNode): void { if (!node) { @@ -26,32 +25,7 @@ function openMaskEditor(node: LGraphNode): void { ) if (useNewEditor) { - // Use new refactored editor - useDialogStore().showDialog({ - key: 'global-mask-editor', - headerComponent: TopBarHeader, - component: MaskEditorContent, - props: { - node - }, - dialogComponentProps: { - style: 'width: 90vw; height: 90vh;', - modal: true, - maximizable: true, - closable: true, - pt: { - root: { - class: 'mask-editor-dialog flex flex-col' - }, - content: { - class: 'flex flex-col min-h-0 flex-1 !p-0' - }, - header: { - class: '!p-2' - } - } - } - }) + useMaskEditor().openMaskEditor(node) } else { // Use old editor ComfyApp.copyToClipspace(node) diff --git a/src/services/litegraphService.ts b/src/services/litegraphService.ts index 35562533b..dfda18295 100644 --- a/src/services/litegraphService.ts +++ b/src/services/litegraphService.ts @@ -58,6 +58,7 @@ import { import { getOrderedInputSpecs } from '@/workbench/utils/nodeDefOrderingUtil' import { useExtensionService } from './extensionService' +import { useMaskEditor } from '@/composables/maskeditor/useMaskEditor' export const CONFIG = Symbol() export const GET_CONFIG = Symbol() @@ -796,11 +797,7 @@ export const useLitegraphService = () => { options.push({ content: 'Open in MaskEditor | Image Canvas', callback: () => { - ComfyApp.copyToClipspace(this) - // @ts-expect-error fixme ts strict error - ComfyApp.clipspace_return_node = this - // @ts-expect-error fixme ts strict error - ComfyApp.open_maskeditor() + useMaskEditor().openMaskEditor(this) } }) }