From c6988d296464e1c611847366f8e44f6aa47be58f Mon Sep 17 00:00:00 2001 From: Austin Mroz Date: Thu, 27 Nov 2025 12:33:14 -0800 Subject: [PATCH 1/9] Wip control widget state migration --- src/composables/graph/useGraphNodeManager.ts | 23 +++--- .../components/NumberControlPopover.vue | 32 ++++----- .../widgets/components/WidgetInputNumber.vue | 25 +++++-- .../WidgetInputNumberWithControl.vue | 72 ------------------- .../components/WidgetSelectDropdown.vue | 6 +- .../widgets/components/WidgetWithControl.vue | 58 +++++++++++++++ src/types/simplifiedWidget.ts | 11 +-- 7 files changed, 115 insertions(+), 112 deletions(-) delete mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberWithControl.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetWithControl.vue diff --git a/src/composables/graph/useGraphNodeManager.ts b/src/composables/graph/useGraphNodeManager.ts index d207d8bcc5..13f92e983b 100644 --- a/src/composables/graph/useGraphNodeManager.ts +++ b/src/composables/graph/useGraphNodeManager.ts @@ -3,7 +3,8 @@ * Provides event-driven reactivity with performance optimizations */ import { reactiveComputed } from '@vueuse/core' -import { reactive, shallowReactive } from 'vue' +import { reactive, ref, shallowReactive, watch } from 'vue' +import type { Ref } from 'vue' import { useChainCallback } from '@/composables/functional/useChainCallback' import type { @@ -19,7 +20,6 @@ import { isDOMWidget } from '@/scripts/domWidget' import { useNodeDefStore } from '@/stores/nodeDefStore' import type { WidgetValue, - SafeControlWidget, ControlWidgetOptions } from '@/types/simplifiedWidget' @@ -48,7 +48,7 @@ export interface SafeWidgetData { spec?: InputSpec slotMetadata?: WidgetSlotMetadata isDOMWidget?: boolean - controlWidget?: SafeControlWidget + controlWidget?: () => Ref } export interface VueNodeData { @@ -86,6 +86,7 @@ export interface GraphNodeManager { function validateControlWidgetValue(val: unknown): ControlWidgetOptions { //TODO: Is there a way to do this without repeating? + //NOTE: global is not currently allowed switch (val) { case 'fixed': return 'fixed' @@ -96,15 +97,21 @@ function validateControlWidgetValue(val: unknown): ControlWidgetOptions { } return 'randomize' } -function getControlWidget(widget: IBaseWidget): SafeControlWidget | undefined { +function getControlWidget( + widget: IBaseWidget +): (() => Ref) | undefined { const cagWidget = widget.linkedWidgets?.find( (w) => w.name == 'control_after_generate' ) if (!cagWidget) return - return { - value: validateControlWidgetValue(cagWidget.value), - update: (value) => (cagWidget.value = validateControlWidgetValue(value)) - } + const cagRef = ref( + validateControlWidgetValue(cagWidget.value) + ) + watch(cagRef, (value) => { + cagWidget.value = value + cagWidget.callback?.(value) + }) + return () => cagRef } export function safeWidgetMapper( diff --git a/src/renderer/extensions/vueNodes/widgets/components/NumberControlPopover.vue b/src/renderer/extensions/vueNodes/widgets/components/NumberControlPopover.vue index 5228365317..3423785d2c 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/NumberControlPopover.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/NumberControlPopover.vue @@ -3,14 +3,14 @@ import Button from 'primevue/button' import Popover from 'primevue/popover' import ToggleSwitch from 'primevue/toggleswitch' import { computed, ref } from 'vue' +import type { Ref } from 'vue' import { useSettingStore } from '@/platform/settings/settingStore' import { useDialogService } from '@/services/dialogService' - -import { NumberControlMode } from '../composables/useStepperControl' +import type { ControlWidgetOptions } from '@/types/simplifiedWidget' type ControlOption = { - mode: NumberControlMode + mode: ControlWidgetOptions icon?: string title: string description: string @@ -32,7 +32,7 @@ const controlOptions: ControlOption[] = [ ...(ENABLE_LINK_TO_GLOBAL ? ([ { - mode: NumberControlMode.LINK_TO_GLOBAL, + mode: 'global', icon: 'pi pi-link', title: 'linkToGlobal', description: 'linkToGlobalDesc' @@ -40,19 +40,19 @@ const controlOptions: ControlOption[] = [ ] as ControlOption[]) : []), { - mode: NumberControlMode.RANDOMIZE, + mode: 'randomize', icon: 'icon-[lucide--shuffle]', title: 'randomize', description: 'randomizeDesc' }, { - mode: NumberControlMode.INCREMENT, + mode: 'increment', text: '+1', title: 'increment', description: 'incrementDesc' }, { - mode: NumberControlMode.DECREMENT, + mode: 'decrement', text: '-1', title: 'decrement', description: 'decrementDesc' @@ -64,20 +64,16 @@ const widgetControlMode = computed(() => ) const props = defineProps<{ - controlMode: NumberControlMode -}>() - -const emit = defineEmits<{ - 'update:controlMode': [mode: NumberControlMode] + controlWidget: () => Ref }>() -const handleToggle = (mode: NumberControlMode) => { - if (props.controlMode === mode) return - emit('update:controlMode', mode) +const handleToggle = (mode: ControlWidgetOptions) => { + if (props.controlWidget().value === mode) return + props.controlWidget().value = mode } -const isActive = (mode: NumberControlMode) => { - return props.controlMode === mode +const isActive = (mode: ControlWidgetOptions) => { + return props.controlWidget().value === mode } const handleEditSettings = () => { @@ -136,7 +132,7 @@ const handleEditSettings = () => {
- + {{ $t('widgets.numberControl.linkToGlobal') }} {{ $t('widgets.numberControl.linkToGlobalSeed') }} diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue index 0894114134..06b1c14645 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue @@ -1,11 +1,14 @@