feat: ModularPanel add message channel

This commit is contained in:
pengfei.zhou
2021-05-13 16:57:21 +08:00
committed by osborn
parent 546af79534
commit eb7fc6c137
10 changed files with 375 additions and 20 deletions

View File

@@ -2,16 +2,51 @@ import { Panel } from "../ui/panel"
import { Group } from "../ui/view"
import { ClassType } from "../util/types"
export abstract class ModularPanel extends Panel {
export abstract class Module extends Panel {
superPanel?: ModularPanel
dispatchMessage(message: any) {
this.superPanel?.dispatchMessage(message)
}
onMessage(message: any) { }
}
export abstract class ModularPanel extends Module {
private modules: Panel[]
constructor() {
super()
this.modules = this.setupModules().map(e => new e)
this.modules = this.setupModules().map(e => {
const instance = new e
if (instance instanceof Module) {
instance.superPanel = this
}
return instance
})
}
abstract setupModules(): ClassType<Panel>[]
abstract setupShelf(root: Group): Group
dispatchMessage(message: any) {
if (this.superPanel) {
this.superPanel.dispatchMessage(message)
} else {
this.onMessage(message)
}
}
onMessage(message: any) {
this.modules.forEach(e => {
if (e instanceof Module) {
e.onMessage(message)
}
})
}
build(root: Group) {
const groupView = this.setupShelf(root)
this.modules.forEach(e => {