dragonbones-runtime
Version:
the tools to build dragonbones file for diffrent framework
347 lines (327 loc) • 12.6 kB
text/typescript
//////////////////////////////////////////////////////////////////////////////////////
//
// 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 {
/**
* An ViewStack navigator container consists of a collection of child
* containers stacked on top of each other, where only one child
* at a time is visible.
* When a different child container is selected, it seems to replace
* the old one because it appears in the same location.
* However, the old child container still exists; it is just invisible.
*
* @event eui.CollectionEvent.COLLECTION_CHANGE Dispatched when the ICollection has been updated in some way.
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @includeExample extension/eui/components/ViewStackExample.ts
* @language en_US
*/
/**
* ViewStack 导航器容器由一组彼此上下堆叠的子容器组成,其中一次只可以显示一个子容器。
* 选择另一个子容器后,它将显示在原来子容器的位置处,所以看起来好像此子容器替换了原来的子容器。
* 但是,原来的子容器仍然存在,只不过它现在处于不可见状态。
*
* @event eui.CollectionEvent.COLLECTION_CHANGE 以某种方式更新 ICollection 后分派。
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @includeExample extension/eui/components/ViewStackExample.ts
* @language zh_CN
*/
export class ViewStack extends Group implements ICollection {
/**
* Constructor.
*
* @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 constructor() {
super();
}
/**
* The layout object for this container.
* This object is responsible for the measurement and layout of
* the visual elements in the container.
*
* @default eui.BasicLayout
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language en_US
*/
/**
* 此容器的 layout 对象。此对象负责容器中可视元素的测量和布局。
*
* @default eui.BasicLayout
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language zh_CN
*/
public get layout():LayoutBase {
return this.$layout;
}
/**
* @private
*/
private _selectedChild:egret.DisplayObject = null;
/**
* A reference to the currently visible child container.
* The default is a reference to the first child.
* If there are no children, this property is <code>null</code>.
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language en_US
*/
/**
* 对当前可见子容器的引用。默认设置为对第一个子容器的引用。如果没有子项,则此属性为 <code>null</code>。
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language zh_CN
*/
public get selectedChild():egret.DisplayObject {
let index = this.selectedIndex;
if (index >= 0 && index < this.numChildren)
return this.getChildAt(index);
return null;
}
public set selectedChild(value:egret.DisplayObject) {
let index = this.getChildIndex(value);
if (index >= 0 && index < this.numChildren)
this.setSelectedIndex(index);
}
/**
* @private
* 在属性提交前缓存选中项索引
*/
private proposedSelectedIndex:number = ListBase.NO_PROPOSED_SELECTION;
/**
* @private
*/
public _selectedIndex:number = -1;
/**
* The zero-based index of the currently visible child container.
* Child indexes are in the range 0, 1, 2, ..., n - 1,
* where <code>n</code> is the number of children.
* The default value is 0, corresponding to the first child.
* If there are no children, the value of this property is <code>-1</code>.
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language en_US
*/
/**
* 当前可见子容器的从零开始的索引。子索引的范围是 0、1、2、...、n - 1,其中 <code>n</code> 是子项的数目。
* 默认值是 0,对应于第一个子项。如果不存在子容器,则此属性的值为 -1。
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language zh_CN
*/
public get selectedIndex():number {
return this.proposedSelectedIndex != ListBase.NO_PROPOSED_SELECTION ? this.proposedSelectedIndex : this._selectedIndex;
}
public set selectedIndex(value:number) {
value = +value|0;
this.setSelectedIndex(value);
}
/**
* @private
* 设置选中项索引
*/
private setSelectedIndex(value:number):void {
if (value == this.selectedIndex) {
return;
}
this.proposedSelectedIndex = value;
this.invalidateProperties();
PropertyEvent.dispatchPropertyEvent(this,PropertyEvent.PROPERTY_CHANGE,"selectedIndex");
}
/**
* @private
* 一个子项被添加到容器内,此方法不仅在操作addChild()时会被回调,在操作setChildIndex()或swapChildren时也会回调。
* 当子项索引发生改变时,会先触发$childRemoved()方法,然后触发$childAdded()方法。
*/
$childAdded(child:egret.DisplayObject, index:number):void {
super.$childAdded(child, index);
this.showOrHide(child, false);
let selectedIndex = this.selectedIndex;
if (selectedIndex == -1) {
this.setSelectedIndex(index);
}
else if (index <= this.selectedIndex && this.$stage) {
this.setSelectedIndex(selectedIndex + 1);
}
CollectionEvent.dispatchCollectionEvent(this, CollectionEvent.COLLECTION_CHANGE,
CollectionEventKind.ADD, index, -1, [child.name]);
}
/**
* @private
* 一个子项从容器内移除,此方法不仅在操作removeChild()时会被回调,在操作setChildIndex()或swapChildren时也会回调。
* 当子项索引发生改变时,会先触发$childRemoved()方法,然后触发$childAdded()方法。
*/
$childRemoved(child:egret.DisplayObject, index:number):void {
super.$childRemoved(child, index);
this.showOrHide(child, true);
let selectedIndex = this.selectedIndex;
if (index == selectedIndex) {
if (this.numChildren > 0) {
if (index == 0) {
this.proposedSelectedIndex = 0;
this.invalidateProperties();
}
else
this.setSelectedIndex(0);
}
else
this.setSelectedIndex(-1);
}
else if (index < selectedIndex) {
this.setSelectedIndex(selectedIndex - 1);
}
CollectionEvent.dispatchCollectionEvent(this, CollectionEvent.COLLECTION_CHANGE,
CollectionEventKind.REMOVE, index, -1, [child.name]);
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
protected commitProperties():void {
super.commitProperties();
if (this.proposedSelectedIndex != ListBase.NO_PROPOSED_SELECTION) {
this.commitSelection(this.proposedSelectedIndex);
this.proposedSelectedIndex = ListBase.NO_PROPOSED_SELECTION;
}
}
/**
* @private
*
* @param newIndex
*/
private commitSelection(newIndex:number):void {
if (newIndex >= 0 && newIndex < this.numChildren) {
this._selectedIndex = newIndex;
if (this._selectedChild) {
this.showOrHide(this._selectedChild, false);
}
this._selectedChild = this.getElementAt(this._selectedIndex);
this.showOrHide(this._selectedChild, true);
}
else {
this._selectedChild = null;
this._selectedIndex = -1;
}
this.invalidateSize();
this.invalidateDisplayList();
}
/**
* @private
*
* @param child
* @param visible
*/
private showOrHide(child:egret.DisplayObject, visible:boolean):void {
if (egret.is(child, "eui.UIComponent")) {
(<eui.UIComponent><any>child).includeInLayout = visible;
}
child.visible = visible;
}
/**
* number of children
*
* @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 get length():number {
return this.$children.length;
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public getItemAt(index:number):any {
let element:egret.DisplayObject = this.$children[index];
return element ? element.name : "";
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public getItemIndex(item:any):number {
let list = this.$children;
let length = list.length;
for (let i = 0; i < length; i++) {
if (list[i].name == item) {
return i;
}
}
return -1;
}
}
registerBindable(ViewStack.prototype,"selectedIndex");
}