diff --git a/packages/designer/src/designer/active-tracker.ts b/packages/designer/src/designer/active-tracker.ts index 27a7090f8..74d865673 100644 --- a/packages/designer/src/designer/active-tracker.ts +++ b/packages/designer/src/designer/active-tracker.ts @@ -7,6 +7,8 @@ import { import { isNode } from '@alilc/lowcode-utils'; export interface IActiveTracker extends Omit< IPublicModelActiveTracker, 'track' | 'onChange' > { + _target: ActiveTarget | INode; + track(originalTarget: ActiveTarget | INode): void; onChange(fn: (target: ActiveTarget) => void): () => void; @@ -17,10 +19,10 @@ export interface ActiveTarget extends Omit< IPublicTypeActiveTarget, 'node' > { } export class ActiveTracker implements IActiveTracker { - private emitter: IEventBus = createModuleEventBus('ActiveTracker'); - @obx.ref private _target?: ActiveTarget | INode; + private emitter: IEventBus = createModuleEventBus('ActiveTracker'); + track(originalTarget: ActiveTarget | INode) { let target = originalTarget; if (isNode(originalTarget)) { diff --git a/packages/plugin-outline-pane/src/controllers/tree-master.ts b/packages/plugin-outline-pane/src/controllers/tree-master.ts index cb6298048..40162d808 100644 --- a/packages/plugin-outline-pane/src/controllers/tree-master.ts +++ b/packages/plugin-outline-pane/src/controllers/tree-master.ts @@ -90,28 +90,29 @@ export class TreeMaster { private initEvent() { let startTime: any; const { event, project, canvas } = this.pluginContext; + const setExpandByActiveTracker = (target: IPublicTypeActiveTarget) => { + const { node, detail } = target; + const tree = this.currentTree; + if (!tree/* || node.document !== tree.document */) { + return; + } + const treeNode = tree.getTreeNode(node); + if (detail && isLocationChildrenDetail(detail)) { + treeNode.expand(true); + } else { + treeNode.expandParents(); + } + this.boards.forEach((board) => { + board.scrollToNode(treeNode, detail); + }); + }; this.disposeEvents = [ canvas.dragon?.onDragstart(() => { startTime = Date.now() / 1000; // needs? this.toVision(); }), - canvas.activeTracker?.onChange((target: IPublicTypeActiveTarget) => { - const { node, detail } = target; - const tree = this.currentTree; - if (!tree/* || node.document !== tree.document */) { - return; - } - const treeNode = tree.getTreeNode(node); - if (detail && isLocationChildrenDetail(detail)) { - treeNode.expand(true); - } else { - treeNode.expandParents(); - } - this.boards.forEach((board) => { - board.scrollToNode(treeNode, detail); - }); - }), + canvas.activeTracker?.onChange(setExpandByActiveTracker), canvas.dragon?.onDragend(() => { const endTime: any = Date.now() / 1000; const nodes = project.currentDocument?.selection?.getNodes(); @@ -135,6 +136,9 @@ export class TreeMaster { this.treeMap.delete(id); }), ]; + if (canvas.activeTracker?.target) { + setExpandByActiveTracker(canvas.activeTracker?.target); + } } private toVision() { diff --git a/packages/shell/src/model/active-tracker.ts b/packages/shell/src/model/active-tracker.ts index 41871aacb..e6170b7a6 100644 --- a/packages/shell/src/model/active-tracker.ts +++ b/packages/shell/src/model/active-tracker.ts @@ -12,6 +12,16 @@ export class ActiveTracker implements IPublicModelActiveTracker { this[activeTrackerSymbol] = innerTracker; } + get target() { + const { node: innerNode, detail, instance } = this[activeTrackerSymbol]._target; + const publicNode = ShellNode.create(innerNode); + return { + node: publicNode!, + detail, + instance, + }; + } + onChange(fn: (target: IPublicTypeActiveTarget) => void): () => void { if (!fn) { return () => {}; diff --git a/packages/types/src/shell/model/active-tracker.ts b/packages/types/src/shell/model/active-tracker.ts index b0ceec11f..2538a2601 100644 --- a/packages/types/src/shell/model/active-tracker.ts +++ b/packages/types/src/shell/model/active-tracker.ts @@ -2,6 +2,12 @@ import { IPublicTypeActiveTarget } from '../type'; import { IPublicModelNode } from './node'; export interface IPublicModelActiveTracker { + + /** + * @since 1.1.7 + */ + target: IPublicTypeActiveTarget; + onChange(fn: (target: IPublicTypeActiveTarget) => void): () => void; track(node: IPublicModelNode): void; diff --git a/packages/workspace/src/resource.ts b/packages/workspace/src/resource.ts index 8c59aed1e..4b695d036 100644 --- a/packages/workspace/src/resource.ts +++ b/packages/workspace/src/resource.ts @@ -70,9 +70,7 @@ export class Resource implements IResource { return this.context.innerSkeleton; } - get children(): IResource[] { - return this.resourceData?.children?.map(d => new Resource(d, this.workspace.getResourceType(d.resourceName || this.resourceType.name), this.workspace)) || []; - } + children: IResource[]; get config() { return this.resourceData.config; @@ -92,6 +90,7 @@ export class Resource implements IResource { if (!resourceType) { logger.error(`resourceType[${resourceType}] is unValid.`); } + this.children = this.resourceData?.children?.map(d => new Resource(d, this.workspace.getResourceType(d.resourceName || this.resourceType.name), this.workspace)) || []; } async init() {