UNPKG

dragonbones-runtime

Version:

the tools to build dragonbones file for diffrent framework

340 lines (311 loc) 11.4 kB
////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2014-present, Egret Technology. // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of the Egret nor the // names of its contributors may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ////////////////////////////////////////////////////////////////////////////////////// namespace eui { /** * The State class defines a view state, a particular view of a component. * * For example, a product thumbnail could have two view states; * a base view state with minimal information, and a rich view state with * additional information. * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * State 类定义视图状态,即组件的特定视图。 * * 例如,产品缩略图可以有两个视图状态,包含最少信息的基本视图状态和包含附加信息的丰富视图状态。 * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ export class State extends egret.HashObject { /** * Constructor. * * @param name The name of the view state. * State names must be unique for a given component. * This property must be set. * @param overrides The overrides for this view state, as an Array of objects that implement * the IOverride interface. These overrides are applied in order when the * state is entered, and removed in reverse order when the state is exited. * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 创建一个State实例。 * * @param name 视图状态的名称。给定组件的状态名称必须唯一。必须设置此属性。 * @param overrides 该视图状态的覆盖,表现为实现 IOverride 接口的对象的数组。 * 这些覆盖在进入状态时按顺序应用,在退出状态时按相反的顺序删除。 * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public constructor(name:string, overrides:IOverride[]=[]) { super(); this.name = name; this.overrides = overrides; } /** * The name of the view state. * State names must be unique for a given component. * This property must be set. * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 视图状态的名称。给定组件的状态名称必须唯一。必须设置此属性。 * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public name:string; /** * The overrides for this view state, as an Array of objects that implement * the IOverride interface. These overrides are applied in order when the * state is entered, and removed in reverse order when the state is exited. * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 该视图状态的覆盖,表现为实现 IOverride 接口的对象的数组。 * 这些覆盖在进入状态时按顺序应用,在退出状态时按相反的顺序删除。 * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public overrides:IOverride[]; /** * The state groups that this view state belongs to as an array of String. * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 此视图状态作为 string 数组所属的状态组。 * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public stateGroups:string[]; /** * Initialize this state and all of its overrides. * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 初始化视图状态 * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public initialize(host:any, stage:egret.Stage):void { let overrides = this.overrides; let length = overrides.length; for (let i = 0; i < length; i++) { let addItems:AddItems = <AddItems>overrides[i]; if (addItems instanceof eui.AddItems) { let target:egret.DisplayObject = host[addItems.target]; if (target&&target instanceof eui.Image&&!target.$parent) { stage.addChild(target); stage.removeChild(target); } } } } } } namespace eui.sys { /** * @private */ export class StateClient { /** * @private */ $stateValues:StateValues; /** * @private * 为此组件定义的视图状态。 */ public get states():eui.State[] { return this.$stateValues.states; } public set states(value:eui.State[]) { if (!value) value = []; let values = this.$stateValues; values.states = value; let statesMap = {}; let length = value.length; for (let i = 0; i < length; i++) { let state = value[i]; statesMap[state.name] = state; } values.statesMap = statesMap; if (values.parent) { this.commitCurrentState(); } } /** * @private * 组件的当前视图状态。将其设置为 "" 或 null 可将组件重置回其基本状态。 */ public get currentState():string { return this.$stateValues.currentState; } public set currentState(value:string) { let values = this.$stateValues; values.explicitState = value; values.currentState = value; this.commitCurrentState(); } /** * @private * 应用当前的视图状态。子类覆盖此方法在视图状态发生改变时执行相应更新操作。 */ private commitCurrentState():void { let values = this.$stateValues; if (!values.parent) { return; } let destination:eui.State = values.statesMap[values.currentState]; if (!destination) { if (values.states.length > 0) { values.currentState = values.states[0].name; } else { return; } } if (values.oldState == values.currentState) { return; } let parent = values.parent; let state = values.statesMap[values.oldState]; if (state) { let overrides = state.overrides; let length = overrides.length; for (let i = 0; i < length; i++) { overrides[i].remove(this, parent); } } values.oldState = values.currentState; state = values.statesMap[values.currentState]; if (state) { let overrides = state.overrides; let length = overrides.length; for (let i = 0; i < length; i++) { overrides[i].apply(this, parent); } } } /** * @private * 返回是否含有指定名称的视图状态 * @param stateName 要检查的视图状态名称 */ public hasState(stateName:string):boolean { return !!this.$stateValues.statesMap[stateName]; } /** * @private * 初始化所有视图状态 */ private initializeStates(stage:egret.Stage):void { this.$stateValues.intialized = true; let states = this.states; let length = states.length; for (let i = 0; i < length; i++) { states[i].initialize(this,stage); } } } /** * @private */ export class StateValues { /** * @private */ public intialized:boolean = false; /** * @private */ public statesMap:any = {}; /** * @private */ public states:eui.State[] = []; /** * @private */ public oldState:string = null; /** * @private */ public explicitState:string = null; /** * @private */ public currentState:string = null; /** * @private */ public parent:egret.DisplayObjectContainer = null; /** * @private */ public stateIsDirty:boolean = false; } }