olympus-r-17plugins
Version:
A plugin of Olympus for 17zuoye.
260 lines (221 loc) • 9 kB
text/typescript
import { moduleManager } from 'olympus-r/engine/module/ModuleManager';
import { core } from 'olympus-r/Olympus';
import SceneMessage from 'olympus-r/engine/scene/SceneMessage';
import { sceneManager } from 'olympus-r/engine/scene/SceneManager';
import { EgretMediatorClass } from 'olympus-r-egret/egret/injector/Injector';
import { MessageHandler, BindOn } from 'olympus-r/engine/injector/Injector';
import { DOMMediatorClass } from 'olympus-r-dom/dom/injector/Injector';
import Mediator from 'olympus-r/engine/mediator/Mediator';
import IScene from 'olympus-r/engine/scene/IScene';
import IMediator from 'olympus-r/engine/mediator/IMediator';
/**
* @author Raykid
* @email initial_r@qq.com
* @create date 2017-10-20
* @modify date 2017-10-20
*
* 顶部栏组件中介者
*/
export interface ITopBarScene extends IScene {
/**
* 获取显示在TopBar上的文字
*
* @type {string}
* @memberof ITopBarModule
*/
readonly topBarText?: string;
/**
* 文字颜色,RGB,默认为0xffffff
*
* @type {number}
* @memberof ITopBarScene
*/
readonly topBarTextColor?: number;
/**
* 获取顶部栏背景色,ARGB,默认为0x1a000000,即透明度为10%的黑色
*
* @type {number}
* @memberof ITopBarScene
*/
readonly topBarBgColor?: number;
/**
* 返回回调
*
* @type {Function}
* @memberof ITopBarScene
*/
readonly backHandler?:Function;
}
/** 更新TopBar属性事件,参数可以有三个,分别是title、titleColor、bgColor */
export const UPDATE_TOPBAR_MESSAGE:string = "updateTopbarMessage";
/** 向TopBar中添加一个对象的事件 */
export const ADD_TOPBAR_ITEM_MESSAGE:string = "addTopbarItemMessage";
/** 插入一个后退回调,可以阻止后退操作 */
export const REGISTER_BACK_HANDLER_MESSAGE:string = "registerBackHandlerMessage";
export abstract class BaseTopBar extends Mediator {
private _topBarText: string;
private _topBarTextColor: number;
private _topBarBgColor: number;
protected get topBarText(): string {
if (this._topBarText != null) return this._topBarText;
let scene: ITopBarScene = sceneManager.currentScene as ITopBarScene;
if (scene) {
let text:string = scene.topBarText;
if(text) return text;
}
return "";
}
protected get topBarTextColor(): number {
if (this._topBarTextColor != null) return this._topBarTextColor;
let scene: ITopBarScene = sceneManager.currentScene as ITopBarScene;
if (scene) {
let color:number = scene.topBarTextColor;
if(color !== undefined && color !== null) return color;
}
return 0xffffff;
}
protected get topBarBGColor(): number {
if (this._topBarBgColor != null) return this._topBarBgColor;
let scene: ITopBarScene = sceneManager.currentScene as ITopBarScene;
if (scene) {
let color:number = scene.topBarBgColor;
if(color !== undefined && color !== null) return color;
}
return 0x00000000;
}
protected get backButtonVisible(): boolean {
return (sceneManager.activeCount > 1);
}
protected abstract updateView(): void;
protected abstract updateButton(): void;
private _backHandler:(callback:()=>void)=>void;
protected onBack(): void {
let scene: ITopBarScene = sceneManager.currentScene as ITopBarScene;
if (scene && scene.backHandler) {
scene.backHandler();
return;
}
if (this._backHandler == null) {
this.doBack();
} else {
this._backHandler(()=>{
this.doBack();
});
}
}
protected doBack():void
{
// 如果模块数大于1个,则关闭当前模块
if (moduleManager.activeCount > 1) {
// 首先将模块关闭到所依赖的模块
moduleManager.open(this.root);
// 然后关闭当前模块
moduleManager.close(this.root);
}
}
private onChangeScene(to: IMediator): void {
if (this.root.containsMediator(to)) {
this.bridge.addChild(this.bridge.frameLayer, this.skin);
this.updateView();
this.updateButton();
}
else {
this.bridge.removeChild(this.bridge.frameLayer, this.skin);
}
}
private onSceneStackChange(): void {
this.updateButton();
}
private onUpdateTopbar(title?: string, titleColor?: number, bgColor?: number): void {
this._topBarText = title;
this._topBarTextColor = titleColor;
this._topBarBgColor = bgColor;
this.updateView();
}
private onAddTopbarItem(item:any):void
{
this.bridge.addChild(this.skin, item);
}
private onRegisterBackHandler(backHandler:(callback:()=>void)=>void):void
{
this._backHandler = backHandler;
}
public onOpen(data?: any): void {
super.onOpen(data);
core.listen(SceneMessage.SCENE_BEFORE_CHANGE, this.onChangeScene, this);
core.listen(SceneMessage.SCENE_STACK_CHANGE, this.onSceneStackChange, this);
this.root.listen(UPDATE_TOPBAR_MESSAGE, this.onUpdateTopbar, this);
this.root.listen(ADD_TOPBAR_ITEM_MESSAGE, this.onAddTopbarItem, this);
this.root.listen(REGISTER_BACK_HANDLER_MESSAGE, this.onRegisterBackHandler, this);
}
public dispose(): void {
this._backHandler = null;
core.unlisten(SceneMessage.SCENE_BEFORE_CHANGE, this.onChangeScene, this);
core.unlisten(SceneMessage.SCENE_STACK_CHANGE, this.onSceneStackChange, this);
this.root.unlisten(UPDATE_TOPBAR_MESSAGE, this.onUpdateTopbar, this);
this.root.unlisten(ADD_TOPBAR_ITEM_MESSAGE, this.onAddTopbarItem, this);
this.root.unlisten(REGISTER_BACK_HANDLER_MESSAGE, this.onRegisterBackHandler, this);
super.dispose();
}
}
export class EgretTopBar extends BaseTopBar {
public itm_bg: eui.Rect;
public btn_back: eui.Button;
public txt_name: eui.Label;
public listAssets(): string[] {
return ["common"];
}
public onOpen(data?: any): void {
super.onOpen(data);
this.skin.touchEnabled=false;
// 拉伸宽度
this.skin.width = this.bridge.root.stage.stageWidth;
// 回退按钮初始不显示
this.btn_back.visible = false;
}
protected updateView(): void {
// 更新文字
this.txt_name.text = this.topBarText;
this.txt_name.x = (this.txt_name.stage.stageWidth - this.txt_name.width) * 0.5;
// 更新文字颜色
this.txt_name.textColor = this.topBarTextColor;
// 更新背景色
let argb: number = this.topBarBGColor;
this.itm_bg.fillAlpha = (argb >>> 24) / 255;
this.itm_bg.fillColor = argb & 0xffffff;
}
protected updateButton(): void {
// 更新按钮
this.btn_back.visible = this.backButtonVisible;
}
}
export class DOMTopBar extends BaseTopBar {
public itm_bg: HTMLDivElement;
public btn_back: HTMLDivElement;
public txt_name: HTMLDivElement;
public listAssets(): string[] {
return ["./assets/TopBar.html"];
}
protected updateView(): void {// 更新文字
this.txt_name.textContent = this.topBarText;
// 更新文字颜色
this.txt_name.style.color = "#" + this.topBarTextColor.toString(16);
// 更新背景色
var argb:number = this.topBarBGColor;
// 这里位运算要注意,如果把*256换成<<8会造成溢出。
// 因为移位时会自动将类型转换为int,且移位之后不会再将int自动换为double类型,但是乘法会自动转换类型。
// 当使用rgba或者argb时,32位全部被占用,一旦移位,如果第一位是1,则在toString()时会输出负数而不是预想的正数
// 这是js运行时实现上的机制,因此这里使用*256,后面也没有用|而是用了+
// 就是为了绕开js位运算造成的溢出问题
this.itm_bg.style.backgroundColor = `rgb(${argb >>> 16 & 0xff}, ${argb >>> 8 & 0xff}, ${argb & 0xff})`;
this.itm_bg.style.opacity = (argb >>> 24) / 255 + "";
}
protected updateButton(): void {
// 更新按钮
this.btn_back.style.display = this.backButtonVisible ? "block" : "none";
}
}