From 2b3d96cedada3f3c3f91f16129aadee466052b9b Mon Sep 17 00:00:00 2001 From: liujuping Date: Wed, 17 May 2023 18:57:09 +0800 Subject: [PATCH 1/2] feat: canvas.activeTracker add targer prop --- .../designer/src/designer/active-tracker.ts | 6 ++-- .../src/controllers/tree-master.ts | 36 ++++++++++--------- packages/shell/src/model/active-tracker.ts | 10 ++++++ .../types/src/shell/model/active-tracker.ts | 6 ++++ packages/workspace/src/resource.ts | 5 ++- 5 files changed, 42 insertions(+), 21 deletions(-) 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() { From 059ffe0eaac7c82ca3a97789a25a0eed0f57a2c3 Mon Sep 17 00:00:00 2001 From: liujuping Date: Wed, 17 May 2023 17:22:10 +0800 Subject: [PATCH 2/2] feat: improve the workspace sleep scene --- packages/workspace/src/window.ts | 6 ++---- packages/workspace/src/workspace.ts | 12 ++++++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/workspace/src/window.ts b/packages/workspace/src/window.ts index 41b9c53ea..0e37b4986 100644 --- a/packages/workspace/src/window.ts +++ b/packages/workspace/src/window.ts @@ -51,9 +51,6 @@ export class EditorWindow implements IEditorWindow { this.title = config.title; this.icon = resource.icon; this.sleep = config.sleep; - if (!config.sleep) { - this.init(); - } } async importSchema(schema: any) { @@ -155,6 +152,8 @@ export class EditorWindow implements IEditorWindow { return; } + this.editorView.setActivate(true); + if (!ignoreEmit) { this.emitter.emit('window.change.view.type', name); @@ -162,7 +161,6 @@ export class EditorWindow implements IEditorWindow { this.workspace.emitChangeActiveEditorView(); } } - this.editorView.setActivate(true); }; get project() { diff --git a/packages/workspace/src/workspace.ts b/packages/workspace/src/workspace.ts index ba3d91c41..46c8c4a0e 100644 --- a/packages/workspace/src/workspace.ts +++ b/packages/workspace/src/workspace.ts @@ -115,7 +115,7 @@ export class Workspace implements IWorkspace { } } - initWindow() { + async initWindow() { if (!this.defaultResourceType || this.enableAutoOpenFirstWindow === false) { return; } @@ -127,6 +127,7 @@ export class Workspace implements IWorkspace { this.window = new EditorWindow(resource, this, { title: resource.title, }); + await this.window.init(); this.editorWindowMap.set(this.window.id, this.window); this.windows = [...this.windows, this.window]; this.emitChangeWindow(); @@ -196,6 +197,9 @@ export class Workspace implements IWorkspace { this.windows.splice(index, 1); if (this.window === window) { this.window = this.windows[index] || this.windows[index + 1] || this.windows[index - 1]; + if (this.window.sleep) { + this.window.init(); + } this.emitChangeActiveWindow(); } this.emitChangeWindow(); @@ -206,10 +210,13 @@ export class Workspace implements IWorkspace { this.remove(index); } - openEditorWindowById(id: string) { + async openEditorWindowById(id: string) { const window = this.editorWindowMap.get(id); if (window) { this.window = window; + if (window.sleep) { + await window.init(); + } this.emitChangeActiveWindow(); } } @@ -252,6 +259,7 @@ export class Workspace implements IWorkspace { this.editorWindowMap.set(window.id, window); if (!sleep) { this.window = window; + await this.window.init(); } this.emitChangeWindow(); this.emitChangeActiveWindow();