From 6e990fa92627ff4d2ad483cb13cc6d27e6e5bd29 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Sat, 22 Feb 2025 20:59:52 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20cursor=20=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/render/item.ts | 8 ++++++++ src/core/render/render.ts | 20 +++++++++++++++++++- src/core/render/renderer/props.ts | 1 + src/module/render/components/page.tsx | 17 ++++++++++++++--- src/module/render/ui/statusBar.tsx | 9 ++++++++- 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/core/render/item.ts b/src/core/render/item.ts index f1b341c..434f617 100644 --- a/src/core/render/item.ts +++ b/src/core/render/item.ts @@ -271,6 +271,9 @@ export abstract class RenderItem /** 不透明度 */ alpha: number = 1; + /** 鼠标覆盖在此元素上时的光标样式 */ + cursor: string = 'auto'; + get x() { return this._transform.x; } @@ -1149,6 +1152,11 @@ export abstract class RenderItem this.setAnchor(nextValue[0] as number, nextValue[1] as number); return; } + case 'cursor': { + if (!this.assertType(nextValue, 'string', key)) return; + this.cursor = nextValue; + return; + } case 'scale': { if (!this.assertType(nextValue, Array, key)) return; this._transform.setScale( diff --git a/src/core/render/render.ts b/src/core/render/render.ts index 5da9e78..f1259b8 100644 --- a/src/core/render/render.ts +++ b/src/core/render/render.ts @@ -2,6 +2,7 @@ import { logger } from '../common/logger'; import { MotaOffscreenCanvas2D } from '../fx/canvas2d'; import { Container } from './container'; import { + ActionEventMap, ActionType, IActionEvent, IWheelEvent, @@ -46,6 +47,8 @@ export class MotaRenderer extends Container implements IRenderTreeRoot { /** 用于终止 document 上的监听 */ private abort?: AbortController; + /** 根据捕获行为判断光标样式 */ + private targetCursor: string = 'auto'; target!: MotaOffscreenCanvas2D; @@ -108,6 +111,7 @@ export class MotaRenderer extends Container implements IRenderTreeRoot { ActionType.Move, this.lastMouse ); + this.targetCursor = 'auto'; this.captureEvent(ActionType.Move, event); }); canvas.addEventListener('mouseenter', ev => { @@ -381,6 +385,16 @@ export class MotaRenderer extends Container implements IRenderTreeRoot { return list; } + bubbleEvent( + type: T, + event: ActionEventMap[T] + ): ActionEventMap[T] | null { + if (this.targetCursor !== this.target.canvas.style.cursor) { + this.target.canvas.style.cursor = this.targetCursor; + } + return super.bubbleEvent(type, event); + } + update(_item: RenderItem = this) { this.cacheDirty = true; } @@ -450,7 +464,11 @@ export class MotaRenderer extends Container implements IRenderTreeRoot { return this.target.canvas; } - hoverElement(_element: RenderItem): void {} + hoverElement(element: RenderItem): void { + if (element.cursor !== 'auto') { + this.targetCursor = element.cursor; + } + } destroy() { super.destroy(); diff --git a/src/core/render/renderer/props.ts b/src/core/render/renderer/props.ts index 6fa05cb..6ffb631 100644 --- a/src/core/render/renderer/props.ts +++ b/src/core/render/renderer/props.ts @@ -45,6 +45,7 @@ export interface BaseProps { id?: string; alpha?: number; composite?: GlobalCompositeOperation; + cursor?: string; /** * 定位属性,可以填 `[横坐标,纵坐标,宽度,高度,x锚点,y锚点]`, * 对于横坐标与纵坐标、宽度与高度、x锚点与y锚点,两两一组要么都填,要么都不填 diff --git a/src/module/render/components/page.tsx b/src/module/render/components/page.tsx index a8cb664..0903736 100644 --- a/src/module/render/components/page.tsx +++ b/src/module/render/components/page.tsx @@ -70,6 +70,7 @@ export const Page = defineComponent( const height = computed(() => props.loc[3] ?? 200); const round = computed(() => pageSize.value / 4); const pageFont = computed(() => `${pageSize.value}px normal`); + const nowPageFont = computed(() => `bold ${pageSize.value}px normal`); // 左右箭头的颜色 const leftColor = computed(() => (isFirst.value ? '#666' : '#ddd')); @@ -161,7 +162,11 @@ export const Page = defineComponent( {slots.default?.(nowPage.value)} - + ( ( loc={textLoc.value} text={nowPage.value.toString()} fillStyle="#222" - font={pageFont.value} + font={nowPageFont.value} > {!isLast.value && ( ( > )} - + >( text={floorName} loc={central(24)} font={font1} + cursor="pointer" > @@ -144,11 +145,17 @@ export const LeftStatusBar = defineComponent>( font={font2} fillStyle="#f88" > - + );