Files
ccc-devtools/packages/cccdev-template-3x/src/models/ComponentModels.ts

120 lines
2.8 KiB
TypeScript
Raw Normal View History

2026-03-15 19:21:04 +08:00
import type { PropDef } from './NodeModel';
export interface ComponentViewModel {
props: PropDef[];
[key: string]: any;
}
export function getComponentViewModel(
name: string,
componentGetter: () => any,
): ComponentViewModel | null {
switch (name) {
case 'cc.UITransform':
return new CCUITransformModel(componentGetter);
case 'cc.Label':
return new CCLabelModel(componentGetter);
case 'cc.Sprite':
return new CCSpriteModel(componentGetter);
default:
return null;
}
}
class CCUITransformModel implements ComponentViewModel {
props: PropDef[] = [
{ name: 'Width', key: 'width' },
{ name: 'Height', key: 'height' },
{ name: 'Anchor X', key: 'anchorX' },
{ name: 'Anchor Y', key: 'anchorY' },
];
constructor(private getter: () => any) {}
get width(): number {
return this.getter()?.contentSize.width ?? 0;
}
set width(v: number) {
const c = this.getter();
if (!c) return;
c.setContentSize(v, c.contentSize.height);
}
get height(): number {
return this.getter()?.contentSize.height ?? 0;
}
set height(v: number) {
const c = this.getter();
if (!c) return;
c.setContentSize(c.contentSize.width, v);
}
get anchorX(): number {
return this.getter()?.anchorPoint.x ?? 0;
}
set anchorX(v: number) {
const c = this.getter();
if (!c) return;
c.setAnchorPoint(v, c.anchorPoint.y);
}
get anchorY(): number {
return this.getter()?.anchorPoint.y ?? 0;
}
set anchorY(v: number) {
const c = this.getter();
if (!c) return;
c.setAnchorPoint(c.anchorPoint.x, v);
}
}
class CCLabelModel implements ComponentViewModel {
props: PropDef[] = [
{ name: 'String', key: 'string' },
{ name: 'Color', key: 'color' },
{ name: 'Font Size', key: 'fontSize' },
{ name: 'Line Height', key: 'lineHeight' },
];
constructor(private getter: () => any) {}
get string(): string {
return this.getter()?.string ?? '';
}
set string(v: string) {
const c = this.getter();
if (c) c.string = v;
}
get color(): any {
return this.getter()?.color;
}
set color(v: any) {
const c = this.getter();
if (c) c.color = v;
}
get fontSize(): number {
return this.getter()?.fontSize ?? 0;
}
set fontSize(v: number) {
const c = this.getter();
if (c) c.fontSize = v;
}
get lineHeight(): number {
return this.getter()?.lineHeight ?? 0;
}
set lineHeight(v: number) {
const c = this.getter();
if (c) c.lineHeight = v;
}
}
class CCSpriteModel implements ComponentViewModel {
props: PropDef[] = [{ name: 'Color', key: 'color' }];
constructor(private getter: () => any) {}
get color(): any {
return this.getter()?.color;
}
set color(v: any) {
const c = this.getter();
if (c) c.color = v;
}
}