Skip to content

Commit d83dd11

Browse files
authored
Merge pull request #410 from WebAV-Tech/feat/sprite-drag-optz
fix: sprites beyond canvas boundaries cannot interact
2 parents 9a7fd1a + 2d5a60a commit d83dd11

22 files changed

+471
-476
lines changed

.changeset/pre.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"mode": "exit",
3+
"tag": "snapshot",
4+
"initialVersions": {
5+
"@webav/av-canvas": "1.1.2",
6+
"@webav/av-cliper": "1.1.2",
7+
"@webav/av-recorder": "1.1.2",
8+
"@webav/internal-utils": "1.1.2"
9+
},
10+
"changesets": ["thirty-mangos-bathe"]
11+
}

.changeset/thirty-mangos-bathe.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@webav/av-canvas': patch
3+
---
4+
5+
fix: sprites beyond canvas boundaries cannot interact

README.md

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -193,15 +193,12 @@ If this project has been helpful to you, please sponsor the author to a milk tea
193193

194194
[Paypal.me](https://paypal.me/hughfenghen)
195195

196-
<!--
197-
ChatGPT:
196+
## Sponsors
198197

199-
你是一位精通中英文的资深翻译,长时间从事计算机领域的技术文章翻译工作。
198+
We would like to thank our GitHub sponsors who support the development of WebAV:
200199

201-
我正在为一个音视频开源项目撰写 README 中文文档,需要你帮忙将中文翻译为英文。
200+
<div>
201+
<a href="https://github.com/425776024"><img src="https://github.com/425776024.png" width="50" height="50" alt="425776024" /></a>
202+
</div>
202203

203-
翻译过程有以下要求:
204-
- 翻译结果需符合英语母语者的习惯,符合技术文章规范,可以进行适当润色
205-
- 翻译的内容为 Markdown 文本,翻译结果应该保持 Markdown 格式
206-
- 不需要翻译 html、js 代码,但需要翻译代码中中文注释
207-
- 不需要翻译 URL 链接 -->
204+
Your support helps us continue to improve and maintain this project!

README_CN.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,13 @@ recorder.start(); // => ReadableStream
197197
---
198198

199199
加微信 `liujun_fenghen` 备注 WebAV,邀请进入 WebAV 音视频技术交流 微信群
200+
201+
## 赞助者
202+
203+
我们要感谢以下 GitHub 赞助者对 WebAV 开发的支持:
204+
205+
<div>
206+
<a href="https://github.com/425776024"><img src="https://github.com/425776024.png" width="50" height="50" alt="425776024" /></a>
207+
</div>
208+
209+
您的支持帮助我们持续改进和维护这个项目!

packages/av-canvas/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# @webav/av-canvas
22

3+
## 1.1.3-snapshot.0
4+
5+
### Patch Changes
6+
7+
- fix: sprites beyond canvas boundaries cannot interact
8+
- @webav/av-cliper@1.1.3-snapshot.0
9+
- @webav/internal-utils@1.1.3-snapshot.0
10+
311
## 1.1.2
412

513
### Patch Changes

packages/av-canvas/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@webav/av-canvas",
3-
"version": "1.1.2",
3+
"version": "1.1.3-snapshot.0",
44
"private": false,
55
"repository": "https://github.com/WebAV-Tech/WebAV",
66
"keywords": [

packages/av-canvas/src/__tests__/av-canvas.test.ts

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import { afterEach, beforeEach, expect, test, vi } from 'vitest';
22
import { AVCanvas } from '../av-canvas';
3-
import { createCtrlsGetter, createEl } from '../utils';
3+
import { createEl, getRectCtrls } from '../utils';
44
import { crtMSEvt4Offset } from './test-utils';
55
import { IClip, VisibleSprite } from '@webav/av-cliper';
66

77
let container: HTMLDivElement;
88
let avCvs: AVCanvas;
9-
let rectCtrlsGetter: ReturnType<typeof createCtrlsGetter>['rectCtrlsGetter'];
10-
let ctrlGetterDestroy: () => void;
119
beforeEach(() => {
1210
container = createEl('div') as HTMLDivElement;
1311
container.style.cssText = `
@@ -20,12 +18,9 @@ beforeEach(() => {
2018
height: 720,
2119
bgColor: '#333',
2220
});
23-
const cvsEl = container.querySelector('canvas') as HTMLCanvasElement;
24-
({ rectCtrlsGetter, destroy: ctrlGetterDestroy } = createCtrlsGetter(cvsEl));
2521
});
2622

2723
afterEach(() => {
28-
ctrlGetterDestroy();
2924
container.remove();
3025
avCvs.destroy();
3126
});
@@ -48,40 +43,50 @@ test('captureStream', () => {
4843
expect(ms).toBeInstanceOf(MediaStream);
4944
});
5045

51-
test('dynamicCusor', async () => {
46+
test('dynamic ctrl elements cusor', async () => {
5247
const vs = new VisibleSprite(new MockClip());
5348
vs.rect.x = 100;
5449
vs.rect.y = 100;
5550
vs.rect.w = 100;
5651
vs.rect.h = 100;
5752
await avCvs.addSprite(vs);
5853
const cvsEl = container.querySelector('canvas') as HTMLCanvasElement;
54+
55+
vi.useFakeTimers();
56+
// 点击激活 sprite
5957
cvsEl.dispatchEvent(crtMSEvt4Offset('pointerdown', 110, 110));
6058
window.dispatchEvent(crtMSEvt4Offset('pointerup', 110, 110));
6159

62-
expect(cvsEl.style.cursor).toBe('move');
63-
64-
const { center } = vs.rect;
65-
const { lt, rotate } = rectCtrlsGetter(vs.rect);
66-
cvsEl.dispatchEvent(
67-
crtMSEvt4Offset('pointermove', lt.x + center.x, lt.y + center.y),
68-
);
69-
expect(cvsEl.style.cursor).toBe('nwse-resize');
70-
71-
cvsEl.dispatchEvent(
72-
crtMSEvt4Offset(
73-
'pointermove',
74-
rotate.x + center.x + 1,
75-
rotate.y + center.y + 1,
76-
),
77-
);
78-
expect(cvsEl.style.cursor).toBe('crosshair');
79-
80-
cvsEl.dispatchEvent(crtMSEvt4Offset('pointermove', 0, 0));
81-
expect(cvsEl.style.cursor).toBe('');
82-
83-
cvsEl.dispatchEvent(crtMSEvt4Offset('pointermove', 110, 110));
84-
expect(cvsEl.style.cursor).toBe('move');
60+
// 等待防抖处理完成
61+
vi.advanceTimersByTime(500);
62+
63+
// 获取控制点元素
64+
const rectEl = container.querySelector('.sprite-rect') as HTMLElement;
65+
// 检查矩形区域的鼠标样式
66+
expect(rectEl.style.cursor).toBe('move');
67+
68+
// 检查左上角控制点的鼠标样式
69+
const ltCtrl = rectEl.querySelector('.ctrl-key-lt') as HTMLElement;
70+
expect(ltCtrl.style.cursor).toBe('nwse-resize');
71+
72+
// 检查右上角控制点的鼠标样式
73+
const rtCtrl = rectEl.querySelector('.ctrl-key-rt') as HTMLElement;
74+
expect(rtCtrl.style.cursor).toBe('nesw-resize');
75+
76+
// 检查旋转控制点的鼠标样式
77+
const rotateCtrl = rectEl.querySelector('.ctrl-key-rotate') as HTMLElement;
78+
expect(rotateCtrl.style.cursor).toBe('crosshair');
79+
80+
// 旋转 sprite 并检查控制点鼠标样式是否相应变化
81+
vs.rect.angle = Math.PI / 4; // 旋转45度
82+
83+
vi.advanceTimersByTime(500);
84+
85+
// 旋转45度后,控制点的鼠标样式应该变化
86+
expect(ltCtrl.style.cursor).toBe('ns-resize');
87+
expect(rtCtrl.style.cursor).toBe('ew-resize');
88+
89+
vi.useRealTimers();
8590
});
8691

8792
test('AVCanvas events', async () => {

packages/av-canvas/src/__tests__/utils.test.ts

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
11
import { Rect } from '@webav/av-cliper';
2-
import { afterAll, beforeAll, expect, test } from 'vitest';
3-
import { createCtrlsGetter } from '../utils';
2+
import { expect, test } from 'vitest';
3+
import { getRectCtrls } from '../utils';
44

5-
let rectCtrlsGetter: ReturnType<typeof createCtrlsGetter>['rectCtrlsGetter'];
6-
let ctrlGetterDestroy: () => void;
7-
beforeAll(() => {
8-
const cvsEl = document.createElement('canvas');
9-
({ rectCtrlsGetter, destroy: ctrlGetterDestroy } = createCtrlsGetter(cvsEl));
10-
});
11-
12-
afterAll(() => {
13-
ctrlGetterDestroy();
14-
});
5+
const cvsEl = document.createElement('canvas');
156

167
test('ctrls', () => {
178
const rect = new Rect(0, 0, 100, 100);
189

19-
const ctrls = rectCtrlsGetter(rect);
10+
const ctrls = getRectCtrls(cvsEl, rect);
2011
expect(
2112
Object.fromEntries(
2213
Object.entries(ctrls).map(([key, ctrl]) => [key, stringifyRect(ctrl)]),
@@ -27,7 +18,7 @@ test('ctrls', () => {
2718
// 固定比例后,ctrls 将移除 t,b,l,r 控制点
2819
test('fixedAspectRatio', () => {
2920
const rect = new Rect(0, 0, 100, 100);
30-
expect(Object.keys(rectCtrlsGetter(rect))).toEqual([
21+
expect(Object.keys(getRectCtrls(cvsEl, rect))).toEqual([
3122
't',
3223
'b',
3324
'l',
@@ -39,7 +30,7 @@ test('fixedAspectRatio', () => {
3930
'rotate',
4031
]);
4132
rect.fixedAspectRatio = true;
42-
expect(Object.keys(rectCtrlsGetter(rect))).toEqual([
33+
expect(Object.keys(getRectCtrls(cvsEl, rect))).toEqual([
4334
'lt',
4435
'lb',
4536
'rt',

packages/av-canvas/src/av-canvas.ts

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,9 @@ import {
88
} from '@webav/av-cliper';
99
import { renderCtrls } from './sprites/render-ctrl';
1010
import { ESpriteManagerEvt, SpriteManager } from './sprites/sprite-manager';
11-
import {
12-
activeSprite,
13-
draggabelSprite,
14-
dynamicCusor,
15-
} from './sprites/sprite-op';
11+
import { activeSprite, draggabelSprite } from './sprites/sprite-op';
1612
import { IResolution } from './types';
17-
import { createCtrlsGetter, createEl } from './utils';
13+
import { createEl } from './utils';
1814
import { workerTimer, EventTool } from '@webav/internal-utils';
1915

2016
/**
@@ -107,31 +103,20 @@ export class AVCanvas {
107103
if (ctx == null) throw Error('canvas context is null');
108104
this.#cvsCtx = ctx;
109105
const container = createEl('div');
110-
container.style.cssText =
111-
'width: 100%; height: 100%; position: relative; overflow: hidden;';
106+
container.style.cssText = 'width: 100%; height: 100%; position: relative;';
112107
container.appendChild(this.#cvsEl);
113108
attchEl.appendChild(container);
114109

115110
createEmptyOscillatorNode(this.#audioCtx).connect(this.#captureAudioDest);
116111

117112
this.#spriteManager = new SpriteManager();
118113

119-
const { rectCtrlsGetter, destroy: ctrlGetterDestroy } = createCtrlsGetter(
120-
this.#cvsEl,
121-
);
122114
this.#clears.push(
123-
ctrlGetterDestroy,
124115
// 鼠标样式、控制 sprite 依赖 activeSprite,
125116
// activeSprite 需要在他们之前监听到 mousedown 事件 (代码顺序需要靠前)
126-
activeSprite(this.#cvsEl, this.#spriteManager, rectCtrlsGetter),
127-
dynamicCusor(this.#cvsEl, this.#spriteManager, rectCtrlsGetter),
128-
draggabelSprite(
129-
this.#cvsEl,
130-
this.#spriteManager,
131-
container,
132-
rectCtrlsGetter,
133-
),
134-
renderCtrls(container, this.#cvsEl, this.#spriteManager, rectCtrlsGetter),
117+
activeSprite(this.#cvsEl, this.#spriteManager),
118+
renderCtrls(container, this.#cvsEl, this.#spriteManager),
119+
draggabelSprite(this.#cvsEl, this.#spriteManager, container),
135120
this.#spriteManager.on(ESpriteManagerEvt.AddSprite, (s) => {
136121
const { rect } = s;
137122
// 默认居中

0 commit comments

Comments
 (0)