diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/components/Inspector/Transform/TransformEditor.tsx b/apps/ai-game-creator-shell/src/view/ui-editor/components/Inspector/Transform/TransformEditor.tsx index 62e68347c..a1e8e5cd9 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/components/Inspector/Transform/TransformEditor.tsx +++ b/apps/ai-game-creator-shell/src/view/ui-editor/components/Inspector/Transform/TransformEditor.tsx @@ -477,8 +477,14 @@ function DirectionButton({ startRepeating(event.shiftKey ? 10 : 1); }} onPointerUp={stopRepeating} - onPointerCancel={stopRepeating} - onPointerLeave={stopRepeating} + onPointerCancel={() => { + repeated.current = false; + stopRepeating(); + }} + onPointerLeave={() => { + repeated.current = false; + stopRepeating(); + }} onClick={(event) => { if (!repeated.current) { onAdjust(event.shiftKey ? 10 : 1); diff --git a/apps/ai-game-creator-shell/tests/TransformEditor.test.tsx b/apps/ai-game-creator-shell/tests/TransformEditor.test.tsx index 62683bea3..f672a9068 100644 --- a/apps/ai-game-creator-shell/tests/TransformEditor.test.tsx +++ b/apps/ai-game-creator-shell/tests/TransformEditor.test.tsx @@ -1,7 +1,7 @@ // @vitest-environment jsdom -import { fireEvent, render, screen } from '@testing-library/react'; -import { describe, expect, it, vi } from 'vitest'; +import { act, fireEvent, render, screen } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; import type { Transform } from '../src/features/ui-editor/types/Transform'; import { TransformEditor } from '../src/view/ui-editor/components/Inspector/Transform/TransformEditor'; @@ -21,6 +21,10 @@ function renderEditor(onChange = vi.fn()) { } describe('TransformEditor corner offset controls', () => { + afterEach(() => { + vi.useRealTimers(); + }); + it('uses one X/Y input pair for the selected corner', () => { renderEditor(); @@ -74,4 +78,19 @@ describe('TransformEditor corner offset controls', () => { offset_max: [30, 30], }); }); + + it('allows a click adjustment after a cancelled long press', () => { + vi.useFakeTimers(); + const { onChange } = renderEditor(); + const button = screen.getByRole('button', { name: '左上角向右' }); + + fireEvent.pointerDown(button, { button: 0 }); + act(() => { + vi.advanceTimersByTime(350); + }); + fireEvent.pointerCancel(button); + fireEvent.click(button); + + expect(onChange).toHaveBeenCalledTimes(2); + }); });