From 65977e766843c4a6221fbad68287088a26f9a8d2 Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Tue, 23 Jun 2020 19:23:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=201.=20=E4=BF=AE=E5=A4=8Ddialog=E6=8B=96?= =?UTF-8?q?=E5=85=A5=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98=20=202.?= =?UTF-8?q?=20dialog=20=E5=8F=AA=E8=83=BD=E5=9C=A8=E6=A0=B9=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E4=B8=8B=20=203.=20=E5=BC=95=E5=85=A5=20modalNodeMana?= =?UTF-8?q?ger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/src/builtin-simulator/host.ts | 9 ++ .../designer/src/document/document-model.ts | 3 + .../src/document/node/modalNodesManager.ts | 135 ++++++++++++++++++ packages/designer/src/document/node/node.ts | 3 - 4 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 packages/designer/src/document/node/modalNodesManager.ts diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 6e0e4433b..439d93629 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -824,6 +824,15 @@ export class BuiltinSimulatorHost implements ISimulatorHost = T extends undefined ? NodeType extends { @@ -43,6 +44,7 @@ export class DocumentModel { private _simulator?: ISimulatorHost; private emitter: EventEmitter; private rootNodeVisitorMap: { [visitorName: string]: any } = {}; + private modalNodesManager: ModalNodesManager; /** * 模拟器 @@ -97,6 +99,7 @@ export class DocumentModel { (schema) => this.import(schema as RootSchema, true), ); this.setupListenActiveNodes(); + this.modalNodesManager = new ModalNodesManager(this); this.inited = true; } diff --git a/packages/designer/src/document/node/modalNodesManager.ts b/packages/designer/src/document/node/modalNodesManager.ts new file mode 100644 index 000000000..876c03da6 --- /dev/null +++ b/packages/designer/src/document/node/modalNodesManager.ts @@ -0,0 +1,135 @@ +import { EventEmitter } from 'events'; +import { Node } from './node'; +import { DocumentModel } from '../document-model'; + +function getModalNodes(node: Node) { + let nodes: any = []; + const prototype = node.getPrototype(); + if (prototype && prototype.isModal()) { + nodes.push(node); + } + const children = node.getChildren(); + if (children) { + children.forEach((child) => { + nodes = nodes.concat(getModalNodes(child)); + }); + } + return nodes; +} + +export default class ModalNodesManager { + public willDestroy: any; + + private page: DocumentModel; + private modalNodes: [Node]; + private nodeRemoveEvents: any; + private emitter: EventEmitter; + + constructor(page: DocumentModel) { + this.page = page; + this.emitter = new EventEmitter(); + this.nodeRemoveEvents = {}; + this.setNodes(); + this.hideModalNodes(); + this.willDestroy = [ + page.onNodeCreate((node) => this.addNode(node)), + page.onNodeDestroy((node) => this.removeNode(node)), + ]; + } + + public getModalNodes() { + return this.modalNodes; + } + + public getVisibleModalNode() { + const visibleNode = this.modalNodes + ? this.modalNodes.find((node: Node) => { + return !node.getExtraProp('hidden'); + }) + : null; + return visibleNode; + } + + public hideModalNodes() { + if (this.modalNodes) { + this.modalNodes.forEach((node: Node) => { + node.getExtraProp('hidden')?.setValue(true); + }); + } + } + + public setVisible(node: Node) { + this.hideModalNodes(); + node.getExtraProp('hidden')?.setValue(false); + } + + public setInvisible(node: Node) { + node.getExtraProp('hidden')?.setValue(true); + } + + public onVisibleChange(func: () => any) { + this.emitter.on('visibleChange', func); + return () => { + this.emitter.removeListener('visibleChange', func); + }; + } + + public onModalNodesChange(func: () => any) { + this.emitter.on('modalNodesChange', func); + return () => { + this.emitter.removeListener('modalNodesChange', func); + }; + } + + private addNode(node: Node) { + const prototype = node.getPrototype(); + if (prototype && prototype.isModal()) { + this.hideModalNodes(); + this.modalNodes.push(node); + this.addNodeEvent(node); + this.emitter.emit('modalNodesChange'); + this.emitter.emit('visibleChange'); + } + } + + private removeNode(node: Node) { + const prototype = node.getPrototype(); + if (prototype && prototype.isModal()) { + const index = this.modalNodes.indexOf(node); + if (index >= 0) { + this.modalNodes.splice(index, 1); + } + this.removeNodeEvent(node); + this.emitter.emit('modalNodesChange'); + if (!node.getExtraProp('hidden')) { + this.emitter.emit('visibleChange'); + } + } + } + + private addNodeEvent(node: Node) { + // this.nodeRemoveEvents[node.getId()] = + // node.onStatusChange((status: any, field: any) => { + // if (field === 'visibility') { + // this.emitter.emit('visibleChange'); + // } + // }); + } + + private removeNodeEvent(node: Node) { + // if (this.nodeRemoveEvents[node.getId()]) { + // this.nodeRemoveEvents[node.getId()](); + // delete this.nodeRemoveEvents[node.getId()]; + // } + } + + private setNodes() { + const nodes = getModalNodes(this.page.getRoot()); + this.modalNodes = nodes; + this.modalNodes.forEach((node: Node) => { + this.addNodeEvent(node); + }); + + this.emitter.emit('modalNodesChange'); + } +} diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 54fe0c483..2e3ad5cdb 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -161,9 +161,6 @@ export class Node { this.setupAutoruns(); } - if (this.componentMeta.isModal) { - this.getExtraProp('hidden', true)?.setValue(true); - } this.settingEntry = this.document.designer.createSettingEntry([ this ]); }