Compare commits

..

1 Commits

Author SHA1 Message Date
CodeRabbit Fixer
333a3ca2bd fix: Optimize CurveEditor drag performance with requestAnimationFrame batching (#9114)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 18:29:46 +01:00
2 changed files with 20 additions and 60 deletions

View File

@@ -113,62 +113,4 @@ describe('DomWidget disabled style', () => {
expect(root.style.pointerEvents).toBe('none')
expect(root.style.opacity).toBe('0.5')
})
it('uses enabled style when promoted override widget is not computedDisabled', async () => {
const widgetState = createWidgetState(false)
const wrapper = mount(DomWidget, {
props: {
widgetState
}
})
widgetState.zIndex = 3
await wrapper.vm.$nextTick()
const root = wrapper.get('.dom-widget').element as HTMLElement
expect(root.style.pointerEvents).toBe('auto')
expect(root.style.opacity).toBe('1')
})
it('falls back to widget.computedDisabled when no position override exists', async () => {
const domWidgetStore = useDomWidgetStore()
const node = createMockLGraphNode({
id: 3,
constructor: {
nodeData: {}
}
})
const widget = {
id: 'dom-widget-no-override',
name: 'test_widget',
type: 'custom',
value: '',
options: {},
node,
computedDisabled: true
} as unknown as BaseDOMWidget<object | string>
domWidgetStore.registerWidget(widget)
const state = domWidgetStore.widgetStates.get(widget.id)
if (!state) throw new Error('Expected registered DomWidgetState')
state.zIndex = 2
state.size = [100, 40]
const widgetState = reactive(state)
const wrapper = mount(DomWidget, {
props: {
widgetState
}
})
widgetState.zIndex = 3
await wrapper.vm.$nextTick()
const root = wrapper.get('.dom-widget').element as HTMLElement
expect(root.style.pointerEvents).toBe('none')
expect(root.style.opacity).toBe('0.5')
})
})

View File

@@ -102,8 +102,13 @@ export function useCurveEditor({ svgRef, modelValue }: UseCurveEditorOptions) {
svg.setPointerCapture(e.pointerId)
const onMove = (ev: PointerEvent) => {
if (dragIndex.value < 0) return
let rafId: number | null = null
let latestPointerEvent: PointerEvent | null = null
const applyMove = () => {
rafId = null
const ev = latestPointerEvent
if (!ev || dragIndex.value < 0) return
const [x, y] = svgCoords(ev)
const movedPoint: CurvePoint = [x, y]
const newPoints = [...modelValue.value]
@@ -113,7 +118,20 @@ export function useCurveEditor({ svgRef, modelValue }: UseCurveEditorOptions) {
dragIndex.value = newPoints.indexOf(movedPoint)
}
const onMove = (ev: PointerEvent) => {
if (dragIndex.value < 0) return
latestPointerEvent = ev
if (rafId === null) {
rafId = requestAnimationFrame(applyMove)
}
}
const endDrag = () => {
if (rafId !== null) {
cancelAnimationFrame(rafId)
rafId = null
applyMove()
}
if (dragIndex.value < 0) return
dragIndex.value = -1
svg.removeEventListener('pointermove', onMove)