web:add shader command

This commit is contained in:
pengfei.zhou
2021-04-15 15:51:24 +08:00
committed by osborn
parent 365f415ead
commit e26ab7e1a5
6 changed files with 277 additions and 41 deletions

View File

@@ -1,23 +1,49 @@
import { DoricPlugin } from "../DoricPlugin";
import { DVModel } from "../shader/DoricViewNode";
import { DoricSuperNode, DoricViewNode, DVModel } from "../shader/DoricViewNode";
export class ShaderPlugin extends DoricPlugin {
render(ret: DVModel) {
if (this.context.rootNode.viewId?.length > 0) {
if (this.context.rootNode.viewId === ret.id) {
this.context.rootNode.blend(ret.props)
this.context.rootNode.onBlended()
} else {
for (let map of this.context.headNodes.values()) {
const viewNode = map.get(ret.id)
viewNode?.blend(ret.props)
viewNode?.onBlended()
}
}
const viewNode = this.context.targetViewNode(ret.id)
viewNode?.blend(ret.props)
viewNode?.onBlended()
} else {
this.context.rootNode.viewId = ret.id
this.context.rootNode.blend(ret.props)
this.context.rootNode.onBlended()
}
}
command(options: {
viewIds: string[],
args: any,
name: string
}) {
let viewNode: DoricViewNode | undefined = undefined
for (let viewId of options.viewIds) {
if (!viewNode) {
viewNode = this.context.targetViewNode(viewId)
} else {
if (viewNode instanceof DoricSuperNode) {
viewNode = viewNode.getSubNodeById(viewId)
}
}
}
if (!viewNode) {
return Promise.reject("Cannot find opposite view")
} else {
const target = viewNode
return new Promise((resolve, reject) => {
try {
const method = Reflect.get(target, options.name)
if (!method) {
reject(`"Cannot find plugin method in class:${target},method:${options.name}"`)
}
resolve(Reflect.apply(method, target, [options.args]))
} catch (err) {
reject(err)
}
})
}
}
}