import { AbleRegistry, Entity, EntityDataRegistry, TransformData, TransformSchema } from '../../common'; import { Adsorbable, Selectable, SelectControlKey, SelectState } from '../able'; import { Disposable } from '@gedit/utils'; /** * 画布中可被选中的节点 */ export class SelectableEntity extends Entity { static type = 'SelectableEntity'; getDefaultAbleRegistries(): AbleRegistry[] { return [Selectable, Adsorbable]; } getDefaultDataRegistries(): EntityDataRegistry[] { return [TransformData]; } get transform(): TransformData { return this.getData(TransformData)!; } /** * 是否被选中 */ get selected(): boolean { return this.selectState.selected; } set selected(selected: boolean) { this.selectState.selected = selected; } get hovered(): boolean { return this.selectState.hovered; } set hovered(hovered: boolean) { this.selectState.hovered = hovered; } get mouseSelect(): boolean { return this.selectState.mouseSelect; } set mouseSelect(mouseSelect: boolean) { this.selectState.mouseSelect = mouseSelect; } /** * 节点的深度 */ get zIndex(): number { return this.selectState.zIndex; } set zIndex(zIndex: number) { this.selectState.zIndex = zIndex; } get selectState(): SelectState { return this.getData(SelectState)!; } /** * 是否能被选中 */ get selectable(): boolean { return this.ables.has(Selectable); } set selectable(selectable: boolean) { if (selectable) { this.ables.add(Selectable); } else { this.ables.remove(Selectable); } } get adsorbable(): boolean { return this.ables.has(Adsorbable); } set adsorbable(adsorbable: boolean) { if (adsorbable) { this.ables.add(Adsorbable); } else { this.ables.remove(Adsorbable); } } setControlKeys(controlKeys: SelectControlKey[]): void { const state = this.getData(SelectState)!; state.update({ controlKeys, }); } /** * 选中状态改变触发 * @param fn */ onToggleSelect(fn: (selected: boolean) => void): Disposable { let preSelected = this.selected; return this.getData(SelectState)!.onDataChanged(() => { const newSelected = this.selected; if (newSelected !== preSelected) { preSelected = newSelected; fn(newSelected); } }); } onTransformChanged(fn: (transformData: TransformSchema) => void): Disposable { return this.transform.onDataChanged(transform => { fn(transform.data); }); } }