diff --git a/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-hidden-links-chromium-linux.png b/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-hidden-links-chromium-linux.png index c1411d5f9..2b1678631 100644 Binary files a/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-hidden-links-chromium-linux.png and b/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-hidden-links-chromium-linux.png differ diff --git a/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-visible-links-chromium-linux.png b/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-visible-links-chromium-linux.png index 46b645fc1..fb46d991f 100644 Binary files a/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-visible-links-chromium-linux.png and b/browser_tests/tests/graphCanvasMenu.spec.ts-snapshots/canvas-with-visible-links-chromium-linux.png differ diff --git a/browser_tests/tests/interaction.spec.ts b/browser_tests/tests/interaction.spec.ts index 31d6316db..94c2f1632 100644 --- a/browser_tests/tests/interaction.spec.ts +++ b/browser_tests/tests/interaction.spec.ts @@ -768,6 +768,11 @@ test.describe('Viewport settings', () => { comfyMouse }) => { // Screenshot the canvas element + await comfyPage.setSetting('Comfy.Graph.CanvasMenu', true) + const toggleButton = comfyPage.page.getByTestId('toggle-minimap-button') + + await toggleButton.click() + await comfyPage.menu.topbar.saveWorkflow('Workflow A') await comfyPage.nextFrame() const screenshotA = (await comfyPage.canvas.screenshot()).toString('base64') diff --git a/browser_tests/tests/minimap.spec.ts b/browser_tests/tests/minimap.spec.ts new file mode 100644 index 000000000..9275107cb --- /dev/null +++ b/browser_tests/tests/minimap.spec.ts @@ -0,0 +1,77 @@ +import { expect } from '@playwright/test' + +import { comfyPageFixture as test } from '../fixtures/ComfyPage' + +test.describe('Minimap', () => { + test.beforeEach(async ({ comfyPage }) => { + await comfyPage.setSetting('Comfy.UseNewMenu', 'Top') + await comfyPage.setSetting('Comfy.Minimap.Visible', true) + await comfyPage.setSetting('Comfy.Graph.CanvasMenu', true) + await comfyPage.loadWorkflow('default') + await comfyPage.page.waitForFunction( + () => window['app'] && window['app'].canvas + ) + }) + + test('Validate minimap is visible by default', async ({ comfyPage }) => { + const minimapContainer = comfyPage.page.locator('.litegraph-minimap') + + await expect(minimapContainer).toBeVisible() + + const minimapCanvas = minimapContainer.locator('.minimap-canvas') + await expect(minimapCanvas).toBeVisible() + + const minimapViewport = minimapContainer.locator('.minimap-viewport') + await expect(minimapViewport).toBeVisible() + + await expect(minimapContainer).toHaveCSS('position', 'absolute') + await expect(minimapContainer).toHaveCSS('z-index', '1000') + }) + + test('Validate minimap toggle button state', async ({ comfyPage }) => { + const toggleButton = comfyPage.page.getByTestId('toggle-minimap-button') + + await expect(toggleButton).toBeVisible() + + await expect(toggleButton).toHaveClass(/minimap-active/) + + const minimapContainer = comfyPage.page.locator('.litegraph-minimap') + await expect(minimapContainer).toBeVisible() + }) + + test('Validate minimap can be toggled off and on', async ({ comfyPage }) => { + const minimapContainer = comfyPage.page.locator('.litegraph-minimap') + const toggleButton = comfyPage.page.getByTestId('toggle-minimap-button') + + await expect(minimapContainer).toBeVisible() + await expect(toggleButton).toHaveClass(/minimap-active/) + + await toggleButton.click() + await comfyPage.nextFrame() + + await expect(minimapContainer).not.toBeVisible() + await expect(toggleButton).not.toHaveClass(/minimap-active/) + + await toggleButton.click() + await comfyPage.nextFrame() + + await expect(minimapContainer).toBeVisible() + await expect(toggleButton).toHaveClass(/minimap-active/) + }) + + test('Validate minimap keyboard shortcut Alt+M', async ({ comfyPage }) => { + const minimapContainer = comfyPage.page.locator('.litegraph-minimap') + + await expect(minimapContainer).toBeVisible() + + await comfyPage.page.keyboard.press('Alt+KeyM') + await comfyPage.nextFrame() + + await expect(minimapContainer).not.toBeVisible() + + await comfyPage.page.keyboard.press('Alt+KeyM') + await comfyPage.nextFrame() + + await expect(minimapContainer).toBeVisible() + }) +}) diff --git a/src/components/graph/GraphCanvas.vue b/src/components/graph/GraphCanvas.vue index fbb9500ae..a019f583e 100644 --- a/src/components/graph/GraphCanvas.vue +++ b/src/components/graph/GraphCanvas.vue @@ -18,6 +18,12 @@ /> + + @@ -51,6 +57,7 @@ import LiteGraphCanvasSplitterOverlay from '@/components/LiteGraphCanvasSplitter import BottomPanel from '@/components/bottomPanel/BottomPanel.vue' import DomWidgets from '@/components/graph/DomWidgets.vue' import GraphCanvasMenu from '@/components/graph/GraphCanvasMenu.vue' +import MiniMap from '@/components/graph/MiniMap.vue' import NodeTooltip from '@/components/graph/NodeTooltip.vue' import SelectionOverlay from '@/components/graph/SelectionOverlay.vue' import SelectionToolbox from '@/components/graph/SelectionToolbox.vue' @@ -65,6 +72,7 @@ import { useContextMenuTranslation } from '@/composables/useContextMenuTranslati import { useCopy } from '@/composables/useCopy' import { useGlobalLitegraph } from '@/composables/useGlobalLitegraph' import { useLitegraphSettings } from '@/composables/useLitegraphSettings' +import { useMinimap } from '@/composables/useMinimap' import { usePaste } from '@/composables/usePaste' import { useWorkflowAutoSave } from '@/composables/useWorkflowAutoSave' import { useWorkflowPersistence } from '@/composables/useWorkflowPersistence' @@ -111,6 +119,10 @@ const selectionToolboxEnabled = computed(() => settingStore.get('Comfy.Canvas.SelectionToolbox') ) +const minimapRef = ref>() +const minimapEnabled = computed(() => settingStore.get('Comfy.Minimap.Visible')) +const minimap = useMinimap() + watchEffect(() => { nodeDefStore.showDeprecated = settingStore.get('Comfy.Node.ShowDeprecated') }) @@ -346,6 +358,13 @@ onMounted(async () => { } ) + whenever( + () => minimapRef.value, + (ref) => { + minimap.setMinimapRef(ref) + } + ) + whenever( () => useCanvasStore().canvas, (canvas) => { diff --git a/src/components/graph/GraphCanvasMenu.vue b/src/components/graph/GraphCanvasMenu.vue index 8f5d036cb..f0b208ce4 100644 --- a/src/components/graph/GraphCanvasMenu.vue +++ b/src/components/graph/GraphCanvasMenu.vue @@ -56,6 +56,15 @@ data-testid="toggle-link-visibility-button" @click="() => commandStore.execute('Comfy.Canvas.ToggleLinkVisibility')" /> +