dragonbones-runtime
Version:
the tools to build dragonbones file for diffrent framework
745 lines (675 loc) • 22.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 {
let UIImpl = sys.UIComponentImpl;
/**
* Label is an UIComponent that can render one or more lines of text.
* The text to be displayed is determined by the <code>text</code> property.
* The formatting of the text is specified by the styles,
* such as <code>fontFamily</code> and <code>size</code>.
*
* <p>Because Label is fast and lightweight, it is especially suitable
* for use cases that involve rendering many small pieces of non-interactive
* text, such as item renderers and labels in Button skins.</p>
*
* <p>In Label, three character sequences are recognized
* as explicit line breaks: CR (<code>"\r"</code>), LF (<code>"\n"</code>),
* and CR+LF (<code>"\r\n"</code>).</p>
*
* <p>If you don't specify any kind of width for a Label,
* then the longest line, as determined by these explicit line breaks,
* determines the width of the Label.</p>
*
* <p>If you do specify some kind of width, then the specified text is
* word-wrapped at the right edge of the component's bounds.
* If the text extends below the bottom of the component,
* it is clipped.</p>
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @includeExample extension/eui/components/LabelExample.ts
* @language en_US
*/
/**
* Label 是可以呈示一行或多行统一格式文本的UI组件。要显示的文本由 text 属性确定。文本格式由样式属性指定,例如 fontFamily 和 size。
* 因为 Label 运行速度快且占用内存少,所以它特别适合用于显示多个小型非交互式文本的情况,例如,项呈示器和 Button 外观中的标签。
* 在 Label 中,将以下三个字符序列识别为显式换行符:CR(“\r”)、LF(“\n”)和 CR+LF(“\r\n”)。
* 如果没有为 Label 指定宽度,则由这些显式换行符确定的最长行确定 Label 的宽度。
* 如果指定了宽度,则指定文本将在组件边界的右边缘换行,如果文本扩展到低于组件底部,则将被剪切。
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @includeExample extension/eui/components/LabelExample.ts
* @language zh_CN
*/
export class Label extends egret.TextField implements UIComponent,IDisplayText {
/**
* Constructor.
*
* @param text The text displayed by this text component.
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language en_US
*/
/**
* 构造函数。
*
* @param text 此文本组件所显示的文本。
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
* @language zh_CN
*/
public constructor(text?:string) {
super();
this.initializeUIValues();
this.text = text;
}
/**
* style中属性是否允许被赋值,当主动赋值过属性之后将不允许被赋值
*/
private $styleSetMap = {
"fontFamily": true,
"size": true,
"bold": true,
"italic": true,
"textAlign": true,
"verticalAlign": true,
"lineSpacing": true,
"textColor": true,
"wordWrap": true,
"displayAsPassword": true,
"strokeColor": true,
"stroke": true,
"maxChars": true,
"multiline": true,
"border": true,
"borderColor": true,
"background": true,
"backgroundColor": true
};
private $revertStyle = {};
private $style: string = null;
private $changeFromStyle:boolean = false;
/**
* The style of text.
* @version Egret 3.2.1
* @platform Web,Native
* @language en_US
*/
/**
* 文本样式。
* @version Egret 3.2.1
* @platform Web,Native
* @language zh_CN
*/
public get style(): string {
return this.$style;
}
public set style(value: string) {
this.$setStyle(value);
}
$setStyle(value: string) {
if (this.$style == value) {
return;
}
this.$style = value;
let theme: Theme = egret.getImplementation("eui.Theme");
if (theme) {
this.$changeFromStyle = true;
for (let key in this.$revertStyle) {
this[key] = this.$revertStyle[key];
}
this.$revertStyle = {};
if (value == null) {
this.$changeFromStyle = false;
return;
}
let styleList = value.split(",");
for (let i = 0; i < styleList.length; i++) {
let config = theme.$getStyleConfig(styleList[i]);
if (config) {
for (let key in config) {
if (this.$styleSetMap[key]) {
let revertValue = this[key];
this[key] = config[key];
this.$revertStyle[key] = revertValue;
}
}
}
}
this.$changeFromStyle = false;
}
}
$setFontFamily(value: string): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["fontFanily"];
this.$styleSetMap["fontFanily"] = false;
}
return super.$setFontFamily(value);
}
$setSize(value: number): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["size"];
this.$styleSetMap["size"] = false;
}
return super.$setSize(value);
}
$setBold(value: boolean): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["bold"];
this.$styleSetMap["bold"] = false;
}
return super.$setBold(value);
}
$setItalic(value: boolean): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["italic"];
this.$styleSetMap["italic"] = false;
}
return super.$setItalic(value);
}
$setTextAlign(value: string): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["textAlign"];
this.$styleSetMap["textAlign"] = false;
}
return super.$setTextAlign(value);
}
$setVerticalAlign(value: string): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["verticalAlign"];
this.$styleSetMap["verticalAlign"] = false;
}
return super.$setVerticalAlign(value);
}
$setLineSpacing(value: number): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["lineSpacing"];
this.$styleSetMap["lineSpacing"] = false;
}
return super.$setLineSpacing(value);
}
$setTextColor(value: number): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["textColor"];
this.$styleSetMap["textColor"] = false;
}
return super.$setTextColor(value);
}
$setWordWrap(value: boolean): void {
if (!this.$changeFromStyle) {
delete this.$revertStyle["wordWrap"];
this.$styleSetMap["wordWrap"] = false;
}
super.$setWordWrap(value);
}
$setDisplayAsPassword(value: boolean): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["displayAsPassword"];
this.$styleSetMap["displayAsPassword"] = false;
}
return super.$setDisplayAsPassword(value);
}
$setStrokeColor(value: number): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["strokeColor"];
this.$styleSetMap["strokeColor"] = false;
}
return super.$setStrokeColor(value);
}
$setStroke(value: number): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["stroke"];
this.$styleSetMap["stroke"] = false;
}
return super.$setStroke(value);
}
$setMaxChars(value: number): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["maxChars"];
this.$styleSetMap["maxChars"] = false;
}
return super.$setMaxChars(value);
}
$setMultiline(value: boolean): boolean {
if (!this.$changeFromStyle) {
delete this.$revertStyle["multiline"];
this.$styleSetMap["multiline"] = false;
}
return super.$setMultiline(value);
}
$setBorder(value: boolean): void {
if (!this.$changeFromStyle) {
delete this.$revertStyle["border"];
this.$styleSetMap["border"] = false;
}
super.$setBorder(value);
}
$setBorderColor(value: number): void {
if (!this.$changeFromStyle) {
delete this.$revertStyle["borderColor"];
this.$styleSetMap["borderColor"] = false;
}
super.$setBorderColor(value);
}
$setBackground(value: boolean): void {
if (!this.$changeFromStyle) {
delete this.$revertStyle["background"];
this.$styleSetMap["background"] = false;
}
super.$setBackground(value);
}
$setBackgroundColor(value: number): void {
if (!this.$changeFromStyle) {
delete this.$revertStyle["backgroundColor"];
this.$styleSetMap["backgroundColor"] = false;
}
super.$setBackgroundColor(value);
}
/**
* @private
*
*/
$invalidateTextField():void {
super.$invalidateTextField();
this.invalidateSize();
}
/**
* @private
*
* @param value
*/
$setWidth(value:number):boolean {
let result1:boolean = super.$setWidth(value);
let result2:boolean = UIImpl.prototype.$setWidth.call(this, value);
return result1 && result2;
}
/**
* @private
*
* @param value
*/
$setHeight(value:number):boolean {
let result1:boolean = super.$setHeight(value);
let result2:boolean = UIImpl.prototype.$setHeight.call(this, value);
return result1 && result2;
}
/**
* @private
*
* @param value
*/
$setText(value:string):boolean {
let result:boolean = super.$setText(value);
PropertyEvent.dispatchPropertyEvent(this, PropertyEvent.PROPERTY_CHANGE, "text");
return result;
}
/**
* @private
*/
private _widthConstraint:number = NaN;
//=======================UIComponent接口实现===========================
/**
* @private
* UIComponentImpl 定义的所有变量请不要添加任何初始值,必须统一在此处初始化。
*/
private initializeUIValues:()=>void;
/**
* @copy eui.UIComponent#createChildren
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
protected createChildren():void {
}
/**
* @copy eui.UIComponent#childrenCreated
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
protected childrenCreated():void {
}
/**
* @copy eui.UIComponent#commitProperties
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
protected commitProperties():void {
}
/**
* @copy eui.UIComponent#measure
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
protected measure():void {
let values = this.$UIComponent;
let textValues = this.$TextField;
let oldWidth = textValues[egret.sys.TextKeys.textFieldWidth];
let availableWidth = NaN;
if (!isNaN(this._widthConstraint)) {
availableWidth = this._widthConstraint;
this._widthConstraint = NaN;
}
else if (!isNaN(values[sys.UIKeys.explicitWidth])) {
availableWidth = values[sys.UIKeys.explicitWidth];
}
else if (values[sys.UIKeys.maxWidth] != 100000) {
availableWidth = values[sys.UIKeys.maxWidth];
}
super.$setWidth(availableWidth);
this.setMeasuredSize(this.textWidth, this.textHeight);
super.$setWidth(oldWidth);
}
/**
* @copy eui.UIComponent#updateDisplayList
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
protected updateDisplayList(unscaledWidth:number, unscaledHeight:number):void {
super.$setWidth(unscaledWidth);
super.$setHeight(unscaledHeight);
}
/**
* @copy eui.UIComponent#invalidateParentLayout
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
protected invalidateParentLayout():void {
}
/**
* @private
*/
$UIComponent:Object;
/**
* @private
*/
$includeInLayout:boolean;
/**
* @copy eui.UIComponent#includeInLayout
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public includeInLayout:boolean;
/**
* @copy eui.UIComponent#left
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public left:any;
/**
* @copy eui.UIComponent#right
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public right:any;
/**
* @copy eui.UIComponent#top
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public top:any;
/**
* @copy eui.UIComponent#bottom
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public bottom:any;
/**
* @copy eui.UIComponent#horizontalCenter
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public horizontalCenter:any;
/**
* @copy eui.UIComponent#verticalCenter
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public verticalCenter:any;
/**
* @copy eui.UIComponent#percentWidth
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public percentWidth:number;
/**
* @copy eui.UIComponent#percentHeight
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public percentHeight:number;
/**
* @copy eui.UIComponent#explicitWidth
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public explicitWidth:number;
/**
* @copy eui.UIComponent#explicitHeight
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public explicitHeight:number;
/**
* @copy eui.UIComponent#minWidth
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public minWidth:number;
/**
* @copy eui.UIComponent#maxWidth
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public maxWidth:number;
/**
* @copy eui.UIComponent#minHeight
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public minHeight:number;
/**
* @copy eui.UIComponent#maxHeight
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public maxHeight:number;
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public setMeasuredSize(width:number, height:number):void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public invalidateProperties():void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public validateProperties():void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public invalidateSize():void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public validateSize(recursive?:boolean):void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public invalidateDisplayList():void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public validateDisplayList():void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public validateNow():void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public setLayoutBoundsSize(layoutWidth:number, layoutHeight:number):void {
UIImpl.prototype.setLayoutBoundsSize.call(this, layoutWidth, layoutHeight);
if (isNaN(layoutWidth) || layoutWidth === this._widthConstraint || layoutWidth == 0) {
this._widthConstraint = layoutWidth;
return;
}
this._widthConstraint = layoutWidth;
let values = this.$UIComponent;
if (!isNaN(values[sys.UIKeys.explicitHeight])) {
return;
}
if (layoutWidth == values[sys.UIKeys.measuredWidth]) {
return;
}
this.invalidateSize();
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public setLayoutBoundsPosition(x:number, y:number):void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public getLayoutBounds(bounds:egret.Rectangle):void {
}
/**
* @inheritDoc
*
* @version Egret 2.4
* @version eui 1.0
* @platform Web,Native
*/
public getPreferredBounds(bounds:egret.Rectangle):void {
}
}
sys.implementUIComponent(Label, egret.TextField);
registerBindable(Label.prototype, "text");
}