UNPKG

olympus-r

Version:

一个力求简单易用的前端开发框架 #### 开发语言 TypeScript #### 核心架构 MVC #### 模块间通讯和解耦 采用事件机制,利用一个全局唯一的事件派发器进行模块间通讯,解耦模块间依赖 #### 表现层结构 使用桥接模式拆分接口与实现,达到一套核心驱动多套表现层的目的(目前支持DOM、Egret、PixiJS三种表现层),同时支持表现层的未来可扩展性 #### TypeScript装饰器注入 框架提供TypeScript装饰器注入功能,便捷获取托管对象。例如:

285 lines (284 loc) 10.7 kB
import * as tslib_1 from "tslib"; import { core } from "../../core/Core"; import { Injectable } from "../../core/injector/Injector"; import Dictionary from "../../utils/Dictionary"; import { bridgeManager } from "../bridge/BridgeManager"; import { maskManager } from "../mask/MaskManager"; import { ButtonType } from "./IPromptPanel"; import none from "./NonePanelPolicy"; import PanelMessage from "./PanelMessage"; /** * @author Raykid * @email initial_r@qq.com * @create date 2017-09-06 * @modify date 2017-09-06 * * 弹窗管理器,包含弹出弹窗、关闭弹窗、弹窗管理等功能 */ var PanelManager = /** @class */ (function () { function PanelManager() { this._panels = []; this._priorities = new Dictionary(); this._modalDict = new Dictionary(); /************************ 下面是通用弹窗的逻辑 ************************/ this._promptDict = {}; } PanelManager_1 = PanelManager; /** * 获取当前显示的弹窗数组(副本) * * @param {IConstructor} [cls] 弹窗类型,如果传递该参数则只返回该类型的已打开弹窗,否则将返回所有已打开的弹窗 * @returns {IPanel[]} 已打开弹窗数组 * @memberof PanelManager */ PanelManager.prototype.getOpened = function (cls) { if (!cls) return this._panels.concat(); else return this._panels.filter(function (panel) { return panel.constructor == cls; }); }; /** * 获取弹窗是否已开启 * * @param {IPanel} panel 弹窗对象 * @returns {boolean} 是否已经开启 * @memberof PanelManager */ PanelManager.prototype.isOpened = function (panel) { return (this._panels.indexOf(panel) >= 0); }; PanelManager.prototype.updateModalMask = function (panel) { // 首先将传入的panel的模态遮罩去除 maskManager.hideModalMask(panel); // 然后为最上层的模态弹窗添加遮罩 for (var i = this._panels.length - 1; i >= 0; i--) { panel = this._panels[i]; if (this._modalDict.get(panel)) { // 如果已经有遮罩了,先移除之 if (maskManager.isShowingModalMask(panel)) maskManager.hideModalMask(panel); // 添加遮罩 maskManager.showModalMask(panel, panel.maskAlpha); break; } } }; /** * 打开一个弹窗 * * @param {IPanel} panel 要打开的弹窗 * @param {*} [data] 数据 * @param {boolean} [isModal=true] 是否模态弹出 * @param {{x:number, y:number}} [from] 弹出起点位置 * @returns {IPanel} 返回弹窗对象 * @memberof PanelManager */ PanelManager.prototype.pop = function (panel, data, isModal, from) { var _this = this; if (isModal === void 0) { isModal = true; } if (this._panels.indexOf(panel) < 0) { // 添加遮罩 maskManager.showMask(0); // 数据先行 this._panels.push(panel); // 弹窗所在的表现层必须要显示 panel.bridge.htmlWrapper.style.display = ""; // 获取策略 var policy = panel.policy || panel.bridge.defaultPanelPolicy || none; // 调用回调 panel.onBeforePop(data, isModal, from); // 派发消息 core.dispatch(PanelMessage.PANEL_BEFORE_POP, panel, isModal, from); // 调用准备接口 policy.prepare && policy.prepare(panel); // 添加显示 var bridge = panel.bridge; bridge.addChild(panel.bridge.panelLayer, panel.skin); // 根据优先级进行排序 this._panels.sort(function (a, b) { var priA = _this._priorities.get(a) || 0; var priB = _this._priorities.get(b) || 0; return priA - priB; }); // 根据排序后的顺序调整显示顺序 for (var _i = 0, _a = this._panels; _i < _a.length; _i++) { var temp = _a[_i]; temp.bridge.addChild(temp.bridge.panelLayer, temp.skin); } // 调用策略接口 policy.pop(panel, from).then(function () { // 调用回调 panel.onAfterPop(data, isModal, from); // 派发消息 core.dispatch(PanelMessage.PANEL_AFTER_POP, panel, isModal, from); // 移除遮罩 maskManager.hideMask(); }); // 记录模态数据 this._modalDict.set(panel, isModal); // 更新模态遮罩 this.updateModalMask(panel); } return panel; }; /** * 关闭一个弹窗 * * @param {IPanel} panel 要关闭的弹窗 * @param {*} [data] 数据 * @param {{x:number, y:number}} [to] 关闭终点位置 * @returns {IPanel} 返回弹窗对象 * @memberof PanelManager */ PanelManager.prototype.drop = function (panel, data, to) { var index = this._panels.indexOf(panel); if (index >= 0) { // 添加遮罩 maskManager.showMask(0); // 数据先行 this._panels.splice(index, 1); // 获取策略 var policy = panel.policy || panel.bridge.defaultPanelPolicy || none; // 调用回调 panel.onBeforeDrop(data, to); // 派发消息 core.dispatch(PanelMessage.PANEL_BEFORE_DROP, panel, to); // 调用策略接口 policy.drop(panel, to).then(function () { // 调用回调 panel.onAfterDrop(data, to); // 派发消息 core.dispatch(PanelMessage.PANEL_AFTER_DROP, panel, to); // 移除遮罩 maskManager.hideMask(); }); // 移除优先级数据 this._priorities.delete(panel); // 移除模态数据 this._modalDict.delete(panel); // 更新模态遮罩 this.updateModalMask(panel); } return panel; }; /** * 注册通用弹窗 * * @param {string} type 通用弹窗要注册到的表现层类型 * @param {IPromptPanelConstructor} prompt 通用弹窗类型 * @memberof PanelManager */ PanelManager.prototype.registerPrompt = function (type, prompt) { this._promptDict[type] = prompt; }; /** * 取消注册通用弹窗 * * @param {string} type 要取消注册通用弹窗的表现层类型 * @memberof PanelManager */ PanelManager.prototype.unregisterPrompt = function (type) { delete this._promptDict[type]; }; /** * @private */ PanelManager.prototype.prompt = function (msgOrParams) { var handlers = []; for (var _i = 1; _i < arguments.length; _i++) { handlers[_i - 1] = arguments[_i]; } var params; if (typeof msgOrParams == "string") { params = { msg: msgOrParams, handlers: handlers }; } else { params = msgOrParams; } // 取到当前场景的类型 var curBridge = bridgeManager.currentBridge; var type = curBridge && curBridge.type; // 用场景类型取到弹窗对象 var promptCls = this._promptDict[type]; if (promptCls == null) { // 没有找到当前模块类型关联的通用弹窗类型,改用系统弹窗凑合一下 alert(params.msg); return; } // 增加默认值 for (var i in params.handlers) { var handler = params.handlers[i]; if (handler.text == null) handler.text = handler.data; if (handler.buttonType == null) handler.buttonType = ButtonType.normal; } // 实例化 var prompt = new promptCls(); // 设置优先级 this._priorities.set(prompt, PanelManager_1.PRIORITY_PROMPT); // 显示弹窗 prompt.open(params); // 更新弹窗 prompt.update(params); // 返回弹窗 return prompt; }; /** * 显示警告窗口(只有一个确定按钮) * * @param {(string|IPromptParams)} msgOrParams 要显示的文本,或者弹窗数据 * @param {()=>void} [okHandler] 确定按钮点击回调 * @returns {IPromptPanel} 返回弹窗实体 * @memberof PanelManager */ PanelManager.prototype.alert = function (msgOrParams, okHandler) { var params; if (typeof msgOrParams == "string") { params = { msg: msgOrParams }; } else { params = msgOrParams; } params.handlers = [ { data: "确定", handler: okHandler, buttonType: ButtonType.important } ]; return this.prompt(params); }; /** * 显示确认窗口(有一个确定按钮和一个取消按钮) * * @param {(string|IPromptParams)} msgOrParams 要显示的文本,或者弹窗数据 * @param {()=>void} [okHandler] 确定按钮点击回调 * @param {()=>void} [cancelHandler] 取消按钮点击回调 * @returns {IPromptPanel} 返回弹窗实体 * @memberof PanelManager */ PanelManager.prototype.confirm = function (msgOrParams, okHandler, cancelHandler) { var params; if (typeof msgOrParams == "string") { params = { msg: msgOrParams }; } else { params = msgOrParams; } params.handlers = [ { data: "取消", handler: cancelHandler, buttonType: ButtonType.normal }, { data: "确定", handler: okHandler, buttonType: ButtonType.important } ]; return this.prompt(params); }; var PanelManager_1; PanelManager.PRIORITY_NORMAL = 0; PanelManager.PRIORITY_PROMPT = 1; PanelManager = PanelManager_1 = tslib_1.__decorate([ Injectable ], PanelManager); return PanelManager; }()); export default PanelManager; /** 再额外导出一个单例 */ export var panelManager = core.getInject(PanelManager);