UNPKG

olympus-r-egret

Version:

Olympus的Egret表现层库

80 lines (79 loc) 2.86 kB
import MediatorStatus from "olympus-r/engine/mediator/MediatorStatus"; import SceneMediator from "olympus-r/engine/scene/SceneMediator"; import { listenApply } from 'olympus-r/utils/ConstructUtil'; /** * @author Raykid * @email initial_r@qq.com * @create date 2017-10-09 * @modify date 2017-10-09 * * Egret皮肤工具集 */ export function wrapSkin(mediator, skin) { var result; var comp = getComponent(skin); if (!comp && !(skin instanceof egret.DisplayObject)) { var compCls = ((mediator.skin instanceof eui.Component && mediator.skin.constructor) || eui.Component); comp = new compCls(); comp.skinName = skin; result = comp; } else { result = skin; } // 判断中介者当前状态 if (mediator.status < MediatorStatus.OPENING) { listenApply(mediator, "__beforeOnOpen", doWrapSkin); } else { // 直接执行要执行的 doWrapSkin(); } return result; function doWrapSkin() { // 场景需要拉伸到与stage同宽高 if (mediator instanceof SceneMediator) { comp.percentWidth = 100; comp.percentHeight = 100; } // 启动引用转发 if (result instanceof egret.DisplayObjectContainer && comp && comp.skin) { // 转发ui引用,如果传入的是显示对象,则需要判断目标是否属于该对象的后裔 var needJudgeDescendant = (skin instanceof egret.DisplayObjectContainer); for (var _i = 0, _a = comp.skin.skinParts; _i < _a.length; _i++) { var name = _a[_i]; var target = comp[name]; if (!needJudgeDescendant || isDescendant(target, skin)) { var desc = Object.getOwnPropertyDescriptor(mediator, name); if (desc && desc.hasOwnProperty("value") && !desc.writable) { desc.writable = true; } try { if (desc) Object.defineProperty(mediator, name, desc); mediator[name] = target; } catch (err) { } } } } } } function getComponent(skin) { if (!(skin instanceof egret.DisplayObject)) return null; if (skin instanceof eui.Component && skin.skin) return skin; return getComponent(skin.parent); } function isDescendant(descendant, ascendant) { return (descendant !== ascendant && contains(descendant, ascendant)); } function contains(target, parent) { if (!target || !parent) return false; if (target === parent) return true; return contains(target.parent, parent); }