From d8d0dcbf71a97384273118b01ea6251047c2d5a0 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Sun, 15 Feb 2026 00:55:04 -0800 Subject: [PATCH] feat: add reset-to-default for widget parameters in right side panel (#8861) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Add per-widget and reset-all-parameters functionality to the right side panel, allowing users to quickly revert widget values to their defaults. ## Changes - **What**: Per-widget "Reset to default" option in the WidgetActions overflow menu, plus a "Reset all parameters" button in each SectionWidgets header. Defaults are derived from the InputSpec (explicit default, then type-specific fallbacks: 0 for INT/FLOAT, false for BOOLEAN, empty string for STRING, first option for COMBO). - **Dependencies**: Builds on #8594 (WidgetValueStore) for reactive UI updates after reset. ## Review Focus - `getWidgetDefaultValue` fallback logic in `src/utils/widgetUtil.ts` — are the type-specific defaults appropriate? - Deep equality check (`isEqual`) for disabling the reset button when the value already matches the default. - Event flow: WidgetActions emits `resetToDefault` → WidgetItem forwards → SectionWidgets handles via `writeWidgetValue` (sets value, triggers callback, marks canvas dirty). ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8861-feat-add-reset-to-default-for-widget-parameters-in-right-side-panel-3076d73d365081d1aa08d5b965a16cf4) by [Unito](https://www.unito.io) Co-authored-by: Terry Jia --- .../parameters/SectionWidgets.vue | 44 +++- .../parameters/WidgetActions.test.ts | 209 ++++++++++++++++++ .../parameters/WidgetActions.vue | 42 ++++ .../rightSidePanel/parameters/WidgetItem.vue | 7 +- src/locales/en/main.json | 4 +- src/utils/widgetUtil.test.ts | 46 ++++ src/utils/widgetUtil.ts | 26 +++ 7 files changed, 369 insertions(+), 9 deletions(-) create mode 100644 src/components/rightSidePanel/parameters/WidgetActions.test.ts create mode 100644 src/utils/widgetUtil.test.ts diff --git a/src/components/rightSidePanel/parameters/SectionWidgets.vue b/src/components/rightSidePanel/parameters/SectionWidgets.vue index 6d87cab6d1..1ecac869f3 100644 --- a/src/components/rightSidePanel/parameters/SectionWidgets.vue +++ b/src/components/rightSidePanel/parameters/SectionWidgets.vue @@ -12,6 +12,9 @@ import type { } from '@/lib/litegraph/src/litegraph' import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' +import { useNodeDefStore } from '@/stores/nodeDefStore' +import { getWidgetDefaultValue } from '@/utils/widgetUtil' +import type { WidgetValue } from '@/utils/widgetUtil' import PropertiesAccordionItem from '../layout/PropertiesAccordionItem.vue' import { HideLayoutFieldKey } from '@/types/widgetTypes' @@ -57,6 +60,7 @@ watchEffect(() => (widgets.value = widgetsProp)) provide(HideLayoutFieldKey, true) const canvasStore = useCanvasStore() +const nodeDefStore = useNodeDefStore() const { t } = useI18n() const getNodeParentGroup = inject(GetNodeParentGroupKey, null) @@ -118,15 +122,31 @@ function handleLocateNode() { } } -function handleWidgetValueUpdate( - widget: IBaseWidget, - newValue: string | number | boolean | object -) { - widget.value = newValue - widget.callback?.(newValue) +function writeWidgetValue(widget: IBaseWidget, value: WidgetValue) { + widget.value = value + widget.callback?.(value) canvasStore.canvas?.setDirty(true, true) } +function handleResetAllWidgets() { + for (const { widget, node: widgetNode } of widgetsProp) { + const spec = nodeDefStore.getInputSpecForWidget(widgetNode, widget.name) + const defaultValue = getWidgetDefaultValue(spec) + if (defaultValue !== undefined) { + writeWidgetValue(widget, defaultValue) + } + } +} + +function handleWidgetValueUpdate(widget: IBaseWidget, newValue: WidgetValue) { + if (newValue === undefined) return + writeWidgetValue(widget, newValue) +} + +function handleWidgetReset(widget: IBaseWidget, newValue: WidgetValue) { + writeWidgetValue(widget, newValue) +} + defineExpose({ widgetsContainer, rootElement @@ -157,6 +177,17 @@ defineExpose({ {{ parentGroup.title }} +