3333800e-410e-433b-bb40-a18733be8b29.js 15.8 KB
"use strict";
cc._RF.push(module, '33338AOQQ5DO7tAoYczvosp', 'UIManager');
// script/common/gameplay/managers/UIManager.ts

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UIManager = void 0;
const simba_cc_resutils_1 = require("simba-cc-resutils");
const ToastManager_1 = require("./ToastManager");
const PresenterBase_1 = require("../../classbase/PresenterBase");
const CCViewBase_1 = require("../../classbase/CCViewBase");
const AlertManager_1 = require("./AlertManager");
var UIManager;
(function (UIManager) {
    const MODAL_Z = 1000;
    const ALERT_Z = 2000;
    const TOAST_Z = 3000;
    let rootNode;
    let rootView;
    let modalPresenter;
    let toastRoot;
    let alertRoot;
    let modalRoot;
    let modalRootView;
    let loadingContainer;
    let loadingView;
    /**场景最上层如提示父节点 */
    let toastParentNode;
    const presenterStack = [];
    const viewMap = {};
    const viewCache = {};
    const loadingViews = [];
    async function init(uiRoot, toastParentNode_) {
        let promise = ToastManager_1.ToastManager.init();
        rootNode = uiRoot;
        rootView = rootNode.addComponent(CCViewBase_1.CCView);
        toastParentNode = toastParentNode_;
        if (!modalRoot) {
            modalRoot = new cc.Node();
            modalRoot.name = "modalRoot";
            modalRoot.zIndex = MODAL_Z;
            rootNode.addChild(modalRoot);
            modalRootView = modalRoot.addComponent(CCViewBase_1.CCView);
        }
        if (!alertRoot) {
            alertRoot = new cc.Node();
            alertRoot.name = "alertRoot";
            alertRoot.zIndex = ALERT_Z;
            rootNode.addChild(alertRoot);
        }
        if (!toastRoot) {
            toastRoot = new cc.Node();
            toastRoot.name = "toastRoot";
            toastRoot.zIndex = TOAST_Z;
            rootNode.addChild(toastRoot);
        }
        if (!loadingContainer) {
            loadingContainer = new cc.Node();
            loadingContainer.name = "loadingContainer";
            loadingContainer.zIndex = 99;
            loadingContainer.active = false;
            rootNode.addChild(loadingContainer);
            let widget = loadingContainer.addComponent(cc.Widget);
            widget.top = widget.bottom = widget.left = widget.right = 0;
            widget.isAlignTop = widget.isAlignBottom = widget.isAlignLeft = widget.isAlignRight = true;
            loadingContainer.addComponent(cc.BlockInputEvents);
        }
        if (!loadingView) {
            let ret = await simba_cc_resutils_1.ResUtils.loadRes("prefab/ui/ViewLoading", cc.Prefab);
            loadingView = cc.instantiate(ret);
            loadingContainer.addChild(loadingView);
            loadingView.active = false;
        }
        await promise;
    }
    UIManager.init = init;
    let viewInstanceId = 0;
    function pushPresenter(presentCls, param, hideOthers = false) {
        return new Promise(async (resolve, reject) => {
            try {
                if (presenterStack.length > 0)
                    presenterStack[presenterStack.length - 1].onEnterBackground();
                let nodeName = presentCls.allowMultiInstances ? presentCls.uuid + (viewInstanceId++) : presentCls.uuid;
                if (viewMap[nodeName]) {
                    if (presenterStack[presenterStack.length - 1].view.name == nodeName) {
                        console.log(presentCls.uuid + "视图已经在最顶层");
                        presenterStack[presenterStack.length - 1].onOpen(param);
                        resolve(presenterStack[presenterStack.length - 1]);
                        return;
                    }
                    // move view to top
                    let index = presenterStack.findIndex(v => v.view.name === nodeName);
                    let presenter = presenterStack[index];
                    presenterStack.push(presenter);
                    presenterStack.splice(index, 1);
                    presenter.view.node.setSiblingIndex(presenterStack.length);
                    presenter.onOpen(param);
                    if (presenter.hideViews) {
                        let len = presenterStack.length - 1;
                        if (hideOthers) {
                            for (let i = index; i < len; i++) {
                                if (!presenterStack[i].view.isHidden) {
                                    presenterStack[i].view.hide();
                                    presenter.hideViews.push(presenterStack[i].view.name);
                                }
                            }
                        }
                        else {
                            let hideNode;
                            for (let i = index; i < len; i++) {
                                if (presenterStack[i].hideViews) {
                                    hideNode = presenterStack[i];
                                    break;
                                }
                            }
                            if (hideNode) {
                                for (let str of presenter.hideViews) {
                                    hideNode.hideViews.push(str);
                                }
                            }
                            else {
                                for (let str of presenter.hideViews) {
                                    viewMap[str].view.show();
                                }
                            }
                            delete presenter.hideViews;
                        }
                    }
                    else if (hideOthers) {
                        let len = presenterStack.length - 1;
                        presenter.hideViews = [];
                        for (let i = 0; i < len; i++) {
                            if (!presenterStack[i].view.isHidden) {
                                presenterStack[i].view.hide();
                                presenter.hideViews.push(presenterStack[i].view.name);
                            }
                        }
                    }
                    resolve(presenter);
                }
                else {
                    if (!loadingContainer.active) {
                        loadingViews.push(presentCls.uuid);
                        loadingContainer.active = true;
                        loadingView.active = false;
                        loadingView.timer = setTimeout(() => {
                            loadingView.timer = undefined;
                            loadingView.active = true;
                        }, 1000);
                    }
                    else {
                        let index = loadingViews.findIndex(v => v === presentCls.uuid);
                        if (index >= 0) {
                            reject("View is already loading.");
                            return;
                        }
                    }
                    let error;
                    let presenter = viewCache[presentCls.uuid];
                    if (!presenter) {
                        // create a view
                        try {
                            presenter = await PresenterBase_1.createPresenter(presentCls);
                            presenter.view.name = nodeName;
                            viewCache[presentCls.uuid] = presenter;
                        }
                        catch (e) {
                            error = e;
                        }
                    }
                    if (presenter) {
                        presenter.open(rootView, param);
                        presenter.view.onClose.once((destroy) => {
                            onPresenterInStackClose(presenter, destroy);
                        });
                        if (hideOthers) {
                            presenter.hideViews = [];
                            let len = presenterStack.length;
                            for (let i = 0; i < len; i++) {
                                if (!presenterStack[i].view.isHidden) {
                                    presenterStack[i].view.hide();
                                    presenter.hideViews.push(presenterStack[i].view.name);
                                }
                            }
                        }
                        presenterStack.push(presenter);
                        viewMap[nodeName] = presenter;
                    }
                    let index = loadingViews.findIndex(v => v === presentCls.uuid);
                    loadingViews.splice(index, 1);
                    if (loadingViews.length == 0) {
                        if (loadingView.timer) {
                            clearTimeout(loadingView.timer);
                            loadingView.timer = undefined;
                        }
                        loadingContainer.active = false;
                    }
                    if (!presenter)
                        reject(error ? error : new Error());
                    else
                        resolve(presenter);
                }
            }
            catch (error) {
                console.log("pushPresenter error, ", error);
            }
        });
    }
    UIManager.pushPresenter = pushPresenter;
    function getTopPresenter() {
        return presenterStack[presenterStack.length - 1];
    }
    UIManager.getTopPresenter = getTopPresenter;
    function popPresenter(destroy = false) {
        let presenter = presenterStack.pop();
        if (presenter) {
            delete viewMap[presenter.view.name];
            if (destroy)
                delete viewCache[presenter.view.name];
            presenter.view.close(destroy);
            if (presenter.hideViews) {
                for (let v of presenter.hideViews) {
                    viewMap[v].view.show();
                }
            }
            if (presenterStack.length > 0)
                presenterStack[presenterStack.length - 1].onEnterForeground();
        }
    }
    UIManager.popPresenter = popPresenter;
    /**弹出到具体某个presenter */
    function popToPresenter(presenter) {
        while (presenterStack && presenterStack[presenterStack.length - 1] !== presenter) {
            popPresenter();
        }
    }
    UIManager.popToPresenter = popToPresenter;
    /**
     * 弹出所有presenter
     * @param destroy 是否销毁
     */
    function popAll(destroy) {
        while (presenterStack.length) {
            let presenter = presenterStack.pop();
            delete viewMap[presenter.view.name];
            presenter.view.close(destroy);
        }
    }
    UIManager.popAll = popAll;
    function onPresenterInStackClose(presenter, destroy) {
        let view = presenter.view.name;
        if (!viewMap[view])
            return;
        let presenterExt = presenter;
        let index = presenterStack.findIndex(v => v === presenter);
        presenterStack.splice(index, 1);
        if (index === presenterStack.length) {
            presenterStack[presenterStack.length - 1].onEnterForeground();
        }
        delete viewMap[view];
        if (destroy) {
            delete viewCache[view];
        }
        if (presenterExt.hideViews && presenterExt.hideViews.length) {
            let len = presenterStack.length;
            let node1;
            for (let i = index; i < len; i++) {
                if (presenterStack[i].hideViews) {
                    node1 = presenterStack[i];
                    break;
                }
            }
            if (node1) {
                presenterExt.hideViews.push(...presenterExt.hideViews);
            }
            else {
                for (let i of presenterExt.hideViews) {
                    if (viewMap[i] && viewMap[i].view) {
                        viewMap[i].view.show();
                    }
                }
            }
        }
    }
    function closePresenterInStack(presenter, destroy) {
        let view = presenter.constructor.uuid;
        if (!viewMap[view])
            return;
        if (presenterStack[presenterStack.length - 1] === presenter) {
            popPresenter();
        }
        else {
            presenter.view.close(destroy);
        }
    }
    UIManager.closePresenterInStack = closePresenterInStack;
    function showModalPresenter(presentCls, param) {
        return new Promise(async (resolve, reject) => {
            if (modalPresenter instanceof presentCls) {
                resolve(modalPresenter);
            }
            else {
                let nodeName = presentCls.uuid;
                if (!loadingContainer.active) {
                    loadingViews.push(presentCls.uuid);
                    loadingContainer.active = true;
                    loadingView.active = false;
                    loadingView.timer = setTimeout(() => {
                        loadingView.timer = undefined;
                        loadingView.active = true;
                    }, 1000);
                }
                else {
                    let index = loadingViews.findIndex(v => v === presentCls.uuid);
                    if (index >= 0) {
                        reject("View is already loading.");
                        return;
                    }
                }
                let error;
                let presenter = viewCache[presentCls.uuid];
                if (!presenter) {
                    // create a view
                    try {
                        presenter = await PresenterBase_1.createPresenter(presentCls);
                        presenter.view.name = nodeName;
                        viewCache[presentCls.uuid] = presenter;
                    }
                    catch (e) {
                        error = e;
                    }
                }
                if (presenter) {
                    presenter.open(modalRootView, param);
                    modalPresenter = presenter;
                    modalPresenter.view.onClose.once(() => {
                        modalPresenter = undefined;
                    });
                }
                let index = loadingViews.findIndex(v => v === presentCls.uuid);
                loadingViews.splice(index, 1);
                if (loadingViews.length == 0) {
                    if (loadingView.timer) {
                        clearTimeout(loadingView.timer);
                        loadingView.timer = undefined;
                    }
                    loadingContainer.active = false;
                }
                if (!presenter)
                    reject(error ? error : new Error());
                else
                    resolve(presenter);
            }
        });
    }
    UIManager.showModalPresenter = showModalPresenter;
    function dismissModalPresenter(destroy) {
        if (modalPresenter) {
            modalPresenter.view.close(destroy);
            modalPresenter = undefined;
        }
    }
    UIManager.dismissModalPresenter = dismissModalPresenter;
    function getModalPresenter() {
        return modalPresenter;
    }
    UIManager.getModalPresenter = getModalPresenter;
    function showToast(content) {
        ToastManager_1.ToastManager.addToast(toastRoot, content);
    }
    UIManager.showToast = showToast;
    /**
     * 在场景最上层弱提示
     * @param parentNode toast的父节点
     * @param content 显示内容
     */
    function showSceneToast(content, time = 2) {
        ToastManager_1.ToastManager.addToast(toastParentNode, content, time);
    }
    UIManager.showSceneToast = showSceneToast;
    /**
     * 展示特殊Toast
     * @param type 特殊Toast的类型
     */
    function showSpecialToast(type) {
        ToastManager_1.ToastManager.addSpecialToast(toastRoot, type);
    }
    UIManager.showSpecialToast = showSpecialToast;
    function getPresenter(view) {
        return viewMap[view];
    }
    UIManager.getPresenter = getPresenter;
    function showAlert(nodeOrPrefab, animate = true) {
        return AlertManager_1.AlertManager.showAlert(rootNode, nodeOrPrefab, animate);
    }
    UIManager.showAlert = showAlert;
})(UIManager = exports.UIManager || (exports.UIManager = {}));

cc._RF.pop();