154 lines
3.9 KiB
TypeScript
154 lines
3.9 KiB
TypeScript
import BasePopup from "@max-studio/core/ui/BasePopup";
|
|
import { uiConfig, UIType } from "@max-studio/core/ui/UIDecorator";
|
|
import UIManager from "@max-studio/core/ui/UIManager";
|
|
import { IDialogBoxOptions } from "assets/scripts/DialogBox";
|
|
import { Vec3 } from "cc";
|
|
import { Button } from "cc";
|
|
import { tween } from "cc";
|
|
import { Label } from "cc";
|
|
import { _decorator, Node } from "cc";
|
|
const { ccclass, property } = _decorator;
|
|
|
|
/**
|
|
* 基础对话框组件
|
|
*/
|
|
@uiConfig({
|
|
bundle: "games",
|
|
prefab: "prefabs/uis/CommonDialogBox",
|
|
isMulti: true,
|
|
isCache: true,
|
|
type: UIType.POPUP,
|
|
})
|
|
@ccclass("CommonDialogBox")
|
|
export class CommonDialogBox extends BasePopup {
|
|
@property(Label)
|
|
titleLabel: Label = null!;
|
|
|
|
@property(Node)
|
|
contentRoot: Node = null!;
|
|
|
|
@property(Label)
|
|
contentLabel: Label = null!;
|
|
|
|
@property(Button)
|
|
confirmBtn: Button = null!;
|
|
|
|
@property(Label)
|
|
confirmBtnLabel: Label = null!;
|
|
|
|
@property(Button)
|
|
cancelBtn: Button = null!;
|
|
|
|
@property(Label)
|
|
cancelBtnLabel: Label = null!;
|
|
|
|
@property(Button)
|
|
closeBtn: Button = null!;
|
|
|
|
// 回调函数
|
|
private onConfirmCallback: (() => void) | null = null;
|
|
private onCancelCallback: (() => void) | null = null;
|
|
|
|
protected onLoad(): void {
|
|
// 绑定按钮事件
|
|
if (this.confirmBtn) {
|
|
this.confirmBtn.node.on(Button.EventType.CLICK, this.onConfirmClick, this);
|
|
}
|
|
|
|
if (this.cancelBtn) {
|
|
this.cancelBtn.node.on(Button.EventType.CLICK, this.onCancelClick, this);
|
|
}
|
|
|
|
if (this.closeBtn) {
|
|
this.closeBtn.node.on(Button.EventType.CLICK, this.onCloseClick, this);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 确定按钮点击事件
|
|
*/
|
|
private onConfirmClick(): void {
|
|
// 执行回调
|
|
if (this.onConfirmCallback) {
|
|
this.onConfirmCallback();
|
|
}
|
|
|
|
// 隐藏对话框
|
|
void UIManager.getInstance().closeUI(this);
|
|
}
|
|
|
|
async onShow(options: IDialogBoxOptions = {}) {
|
|
this.contentRoot.scale = Vec3.ZERO;
|
|
tween(this.contentRoot).to(0.3, { scale: Vec3.ONE }, { easing: "backOut" }).start();
|
|
|
|
const {
|
|
title = "提示",
|
|
content = "",
|
|
onConfirm,
|
|
onCancel,
|
|
confirmText = "确定",
|
|
cancelText = "取消",
|
|
showCancel = true,
|
|
hideClose = false,
|
|
} = options;
|
|
|
|
// 设置标题和内容
|
|
if (this.titleLabel) {
|
|
this.titleLabel.string = title;
|
|
}
|
|
if (this.contentLabel) {
|
|
this.contentLabel.string = content;
|
|
}
|
|
|
|
// 设置按钮文本
|
|
if (this.confirmBtnLabel) {
|
|
this.confirmBtnLabel.string = confirmText;
|
|
}
|
|
if (this.cancelBtnLabel) {
|
|
this.cancelBtnLabel.string = cancelText;
|
|
}
|
|
|
|
// 控制取消按钮显示状态
|
|
if (this.cancelBtn) {
|
|
this.cancelBtn.node.active = showCancel;
|
|
}
|
|
|
|
if (this.closeBtn) {
|
|
this.closeBtn.node.active = !hideClose;
|
|
}
|
|
|
|
// 保存回调函数
|
|
this.onConfirmCallback = onConfirm || null;
|
|
this.onCancelCallback = onCancel || null;
|
|
}
|
|
|
|
/**
|
|
* 取消按钮点击事件
|
|
*/
|
|
private onCancelClick(): void {
|
|
// 执行回调
|
|
if (this.onCancelCallback) {
|
|
this.onCancelCallback();
|
|
}
|
|
|
|
// 隐藏对话框
|
|
void UIManager.getInstance().closeUI(this);
|
|
}
|
|
|
|
private onCloseClick(): void {
|
|
// 隐藏对话框
|
|
void UIManager.getInstance().closeUI(this);
|
|
}
|
|
|
|
async onHide(): Promise<void> {
|
|
return new Promise((resolve) => {
|
|
tween(this.contentRoot)
|
|
.to(0.2, { scale: new Vec3(0.8, 0.8, 0.8) }, { easing: "quadIn" })
|
|
.call(() => {
|
|
resolve();
|
|
})
|
|
.start();
|
|
});
|
|
}
|
|
}
|