mirror of
https://gitee.com/dgflash/oops-plugin-framework.git
synced 2026-09-03 04:03:46 +08:00
134 lines
3.9 KiB
TypeScript
134 lines
3.9 KiB
TypeScript
import { BlockInputEvents, Node, instantiate } from 'cc';
|
||
import { ViewUtil } from '../../utils/ViewUtil';
|
||
import { GuiPromptConfig } from '../GuiPromptConfig';
|
||
import { Notify } from '../prompt/Notify';
|
||
import { LayerHelper } from './LayerHelper';
|
||
|
||
/* 滚动消息提示层 */
|
||
export class LayerNotify extends Node {
|
||
private black!: BlockInputEvents;
|
||
/** 等待提示资源 */
|
||
private wait: Node = null!;
|
||
/** 自定义弹出提示资源 */
|
||
private notify: Node = null!;
|
||
/** 自定义弹出提示内容资源 */
|
||
private notifyItem: Node = null!;
|
||
/** 标记是否正在打开等待提示中 */
|
||
private waitOpening: boolean = false;
|
||
/** 标记是否在打开过程中被请求关闭 */
|
||
private waitShouldClose: boolean = false;
|
||
|
||
constructor(name: string) {
|
||
super(name);
|
||
LayerHelper.setFullScreen(this);
|
||
|
||
this.black = this.addComponent(BlockInputEvents);
|
||
this.black.enabled = false;
|
||
}
|
||
|
||
/** 打开等待提示 */
|
||
async waitOpen() {
|
||
this.waitOpening = true;
|
||
|
||
try {
|
||
if (this.wait == null) {
|
||
this.wait = await ViewUtil.createPrefabNodeAsync(
|
||
GuiPromptConfig.Wait.path
|
||
);
|
||
}
|
||
|
||
// 异步操作完成后,检查是否已被请求关闭
|
||
if (this.waitShouldClose) {
|
||
this.waitShouldClose = false;
|
||
this.doWaitClose();
|
||
return;
|
||
}
|
||
|
||
if (this.wait.parent == null) {
|
||
this.wait.parent = this;
|
||
this.black.enabled = true;
|
||
}
|
||
}
|
||
finally {
|
||
this.waitOpening = false;
|
||
}
|
||
}
|
||
|
||
/** 关闭等待提示 */
|
||
waitClose() {
|
||
// 如果正在打开中,标记应该关闭,等打开完成后再关闭
|
||
if (this.waitOpening) {
|
||
this.waitShouldClose = true;
|
||
return;
|
||
}
|
||
|
||
this.doWaitClose();
|
||
}
|
||
|
||
/** 实际执行关闭等待提示 */
|
||
private doWaitClose() {
|
||
if (this.wait && this.wait.parent) {
|
||
this.wait.parent = null;
|
||
this.black.enabled = false;
|
||
}
|
||
this.waitShouldClose = false;
|
||
}
|
||
|
||
/**
|
||
* 渐隐飘过提示
|
||
* @param content 文本表示
|
||
* @param useI18n 是否使用多语言
|
||
*/
|
||
async toast(content: string, useI18n: boolean) {
|
||
if (this.notify == null) {
|
||
this.notify = await ViewUtil.createPrefabNodeAsync(
|
||
GuiPromptConfig.Notify.path
|
||
);
|
||
this.notifyItem = this.notify.children[0];
|
||
this.notifyItem.parent = null;
|
||
}
|
||
|
||
this.notify.parent = this;
|
||
const item = instantiate(this.notifyItem);
|
||
const prompt = item.getChildByName('prompt')!;
|
||
const notify = prompt.getComponent(Notify)!;
|
||
item.parent = this.notify;
|
||
|
||
notify.onComplete = () => {
|
||
if (this.notify.children.length <= 1) {
|
||
this.notify.parent = null;
|
||
}
|
||
};
|
||
notify.toast(content, useI18n);
|
||
|
||
// 超过3个提示,就释放第一个提示
|
||
if (this.notify.children.length > 3) {
|
||
this.notify.children[0].destroy();
|
||
}
|
||
}
|
||
|
||
/** 销毁时释放资源 */
|
||
onDestroy() {
|
||
// 清理等待提示节点
|
||
if (this.wait) {
|
||
this.wait.destroy();
|
||
this.wait = null!;
|
||
}
|
||
|
||
// 清理通知提示节点
|
||
if (this.notify) {
|
||
this.notify.destroy();
|
||
this.notify = null!;
|
||
}
|
||
|
||
// 清理通知项模板节点
|
||
if (this.notifyItem) {
|
||
this.notifyItem.destroy();
|
||
this.notifyItem = null!;
|
||
}
|
||
|
||
// 清理事件阻挡组件
|
||
this.black = null!;
|
||
}
|
||
}
|