mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-27 18:24:11 +00:00
Adds support for entering math inside number widgets in vue mode  Migrates components to simple html elements (div and button) by borrowing styling from the (reverted) reka-ui migration in #6985. The existing (evil) litegraph eval code is extracted as a utility function and reused. This PR means we're entirely writing our own NumberField. Also adds support for scrubbing widgets like in litegraph  ### Known Issue - Scrubbing causes text to be highlighted, ~~starting a scrub from highlighted text will instead drag the text~~. - It seems this can only be prevented with `pointerdown.prevent`, but this requires a manual `input.focus()` which does not place the cursor at location of mouse click. (Obligatory: _It won't do you a bit of good to review math_) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-7759-Implement-vue-math-2d46d73d365081b9acd4d6422669016e) by [Unito](https://www.unito.io) --------- Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: DrJKL <DrJKL0424@gmail.com>
61 lines
1.5 KiB
Vue
61 lines
1.5 KiB
Vue
<script setup lang="ts" generic="T extends WidgetValue">
|
|
import { computed, defineAsyncComponent, ref, watch } from 'vue'
|
|
import type { Component } from 'vue'
|
|
|
|
import Button from '@/components/ui/button/Button.vue'
|
|
import type {
|
|
SimplifiedControlWidget,
|
|
WidgetValue
|
|
} from '@/types/simplifiedWidget'
|
|
|
|
const ValueControlPopover = defineAsyncComponent(
|
|
() => import('./ValueControlPopover.vue')
|
|
)
|
|
|
|
const props = defineProps<{
|
|
widget: SimplifiedControlWidget<T>
|
|
component: Component
|
|
}>()
|
|
|
|
const modelValue = defineModel<T>()
|
|
|
|
const popover = ref()
|
|
|
|
const controlModel = ref(props.widget.controlWidget.value)
|
|
|
|
const controlButtonIcon = computed(() => {
|
|
switch (controlModel.value) {
|
|
case 'increment':
|
|
return 'pi pi-plus'
|
|
case 'decrement':
|
|
return 'pi pi-minus'
|
|
case 'fixed':
|
|
return 'icon-[lucide--pencil-off]'
|
|
default:
|
|
return 'icon-[lucide--shuffle]'
|
|
}
|
|
})
|
|
|
|
watch(controlModel, props.widget.controlWidget.update)
|
|
|
|
const togglePopover = (event: Event) => {
|
|
popover.value.toggle(event)
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div class="relative grid grid-cols-subgrid">
|
|
<component :is="component" v-bind="$attrs" v-model="modelValue" :widget>
|
|
<Button
|
|
variant="textonly"
|
|
size="sm"
|
|
class="h-4 w-7 self-center rounded-xl bg-blue-100/30 p-0"
|
|
@click.stop.prevent="togglePopover"
|
|
>
|
|
<i :class="`${controlButtonIcon} text-blue-100 text-xs size-3.5`" />
|
|
</Button>
|
|
</component>
|
|
<ValueControlPopover ref="popover" v-model="controlModel" />
|
|
</div>
|
|
</template>
|