From 5bf8ea01d5db3ffe37e3f79b3c16fa7fe6d2d432 Mon Sep 17 00:00:00 2001 From: Glary-Bot Date: Wed, 13 May 2026 02:09:16 +0000 Subject: [PATCH] fix: address PR review - Guard node.properties before writing overrides (??= initialization). - Resolve override key via widget.slotName ?? widget.name so promoted (subgraph input) widgets match the same key used at write time. buildWidgetMenuItem writes under the LiteGraph widget.name, which for promoted widgets is the subgraph input slot name; SafeWidgetData.name is the interior widget name and slotName is the subgraph slot name, so the read side has to prefer slotName when present. - i18n: route all new menu/prompt strings through t() and add widgetGridOverrides entries in locales/en/main.json. --- src/extensions/core/widgetGridOverrides.ts | 21 ++++++++++--------- src/locales/en/main.json | 8 +++++++ .../composables/useProcessedWidgets.ts | 4 +++- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/extensions/core/widgetGridOverrides.ts b/src/extensions/core/widgetGridOverrides.ts index 4cdd16e70d..d29d17530f 100644 --- a/src/extensions/core/widgetGridOverrides.ts +++ b/src/extensions/core/widgetGridOverrides.ts @@ -1,3 +1,4 @@ +import { t } from '@/i18n' import type { IContextMenuValue } from '@/lib/litegraph/src/interfaces' import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode' import { useVueNodeLifecycle } from '@/composables/graph/useVueNodeLifecycle' @@ -5,8 +6,7 @@ import { app } from '@/scripts/app' import { useExtensionService } from '@/services/extensionService' const PROPERTY_KEY = 'gridOverrides' -const PROMPT_LABEL = - 'Grid row size (e.g. 200px, minmax(150px, 300px), 1fr, auto)' +const DEFAULT_PROMPT_VALUE = '200px' type GridOverrides = Record @@ -17,6 +17,7 @@ function readOverrides(node: LGraphNode): GridOverrides { } function writeOverrides(node: LGraphNode, next: GridOverrides): void { + node.properties ??= {} if (Object.keys(next).length === 0) { delete node.properties[PROPERTY_KEY] } else { @@ -35,7 +36,7 @@ function promptForRowSize( current: string, onSubmit: (value: string) => void ): void { - const input = window.prompt(PROMPT_LABEL, current) + const input = window.prompt(t('widgetGridOverrides.prompt'), current) if (input == null) return const trimmed = input.trim() if (trimmed.length === 0) return @@ -66,28 +67,28 @@ function buildWidgetMenuItem( const current = overrides[widgetName] const label = current ? `${widgetName} → ${current}` - : `${widgetName} → (auto)` + : `${widgetName} → ${t('widgetGridOverrides.auto')}` return { content: label, has_submenu: true, callback: () => { - promptForRowSize(current ?? '200px', (value) => + promptForRowSize(current ?? DEFAULT_PROMPT_VALUE, (value) => setOverride(node, widgetName, value) ) }, submenu: { options: [ { - content: 'Set size…', + content: t('widgetGridOverrides.setSize'), callback: () => { - promptForRowSize(current ?? '200px', (value) => + promptForRowSize(current ?? DEFAULT_PROMPT_VALUE, (value) => setOverride(node, widgetName, value) ) } }, { - content: 'Clear override', + content: t('widgetGridOverrides.clearOverride'), disabled: !current, callback: () => clearOverride(node, widgetName) } @@ -111,7 +112,7 @@ useExtensionService().registerExtension({ if (hasAny) { widgetItems.push(null, { - content: 'Clear all overrides', + content: t('widgetGridOverrides.clearAll'), callback: () => writeOverrides(node, {}) }) } @@ -119,7 +120,7 @@ useExtensionService().registerExtension({ return [ null, { - content: 'Widget Grid Sizes', + content: t('widgetGridOverrides.menuLabel'), has_submenu: true, callback: () => {}, submenu: { diff --git a/src/locales/en/main.json b/src/locales/en/main.json index 6450f09142..44d72e2401 100644 --- a/src/locales/en/main.json +++ b/src/locales/en/main.json @@ -3816,5 +3816,13 @@ "training": "Training…", "processingVideo": "Processing video…", "running": "Running…" + }, + "widgetGridOverrides": { + "menuLabel": "Widget Grid Sizes", + "setSize": "Set size…", + "clearOverride": "Clear override", + "clearAll": "Clear all overrides", + "auto": "(auto)", + "prompt": "Grid row size (e.g. 200px, minmax(150px, 300px), 1fr, auto)" } } diff --git a/src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts b/src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts index 3eb52baa62..aa06c1e1cd 100644 --- a/src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts +++ b/src/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts @@ -51,6 +51,7 @@ interface ProcessedWidget { hidden: boolean id: string name: string + slotName?: string renderKey: string simplified: SimplifiedWidget tooltipConfig: TooltipOptions @@ -346,6 +347,7 @@ export function computeProcessedWidgets({ hidden: mergedOptions.hidden ?? false, id: String(bareWidgetId), name: widget.name, + slotName: widget.slotName, renderKey, type: widget.type, vueComponent, @@ -416,7 +418,7 @@ export function useProcessedWidgets( const overrides = nodeDataGetter()?.gridOverrides return visibleWidgets.value .map((w) => { - const override = overrides?.[w.name] + const override = overrides?.[w.slotName ?? w.name] if (override) return override return shouldExpand(w.type) || w.hasLayoutSize ? 'auto' : 'min-content' })