2025-08-12 20:22:54 +08:00
|
|
|
import {
|
|
|
|
|
_decorator,
|
|
|
|
|
Component,
|
|
|
|
|
Node,
|
|
|
|
|
Button,
|
|
|
|
|
Label,
|
|
|
|
|
Color,
|
|
|
|
|
Sprite,
|
|
|
|
|
tween,
|
|
|
|
|
Vec3,
|
|
|
|
|
} from "cc";
|
|
|
|
|
import li_BaseView from "../../Main/Common/li_BaseView";
|
|
|
|
|
import LanguageUtils, { LanguageType } from "../../Main/Common/LanguageUtils";
|
|
|
|
|
import AudioManager from "../../Main/Manager/AudioManager";
|
2025-08-13 16:17:44 +08:00
|
|
|
import ConfigManager from "../../chat18x/manager/ConfigManager";
|
2025-08-12 20:22:54 +08:00
|
|
|
|
|
|
|
|
const { ccclass, property } = _decorator;
|
|
|
|
|
|
|
|
|
|
interface LanguageButton {
|
|
|
|
|
button: Button;
|
|
|
|
|
label: Label;
|
|
|
|
|
checkMark: Node;
|
|
|
|
|
bg: Sprite;
|
|
|
|
|
language: LanguageType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ccclass("SimpleLanguagePanel")
|
|
|
|
|
export class SimpleLanguagePanel extends li_BaseView {
|
|
|
|
|
@property(Button)
|
|
|
|
|
private closeBtn: Button = null;
|
|
|
|
|
|
2025-08-13 16:17:44 +08:00
|
|
|
@property(Node)
|
|
|
|
|
private languageDrawdown: Node = null;
|
|
|
|
|
|
2025-08-12 20:22:54 +08:00
|
|
|
@property(Label)
|
|
|
|
|
private titleLabel: Label = null;
|
|
|
|
|
|
|
|
|
|
@property(Button)
|
|
|
|
|
private btnEnglish: Button = null;
|
|
|
|
|
|
|
|
|
|
@property(Button)
|
|
|
|
|
private btnChinese: Button = null;
|
|
|
|
|
|
|
|
|
|
@property(Button)
|
|
|
|
|
private btnHindi: Button = null;
|
|
|
|
|
|
|
|
|
|
@property(Button)
|
|
|
|
|
private btnFrench: Button = null;
|
|
|
|
|
|
|
|
|
|
@property(Button)
|
|
|
|
|
private btnGerman: Button = null;
|
|
|
|
|
|
|
|
|
|
@property(Node)
|
|
|
|
|
private panelBg: Node = null;
|
|
|
|
|
|
|
|
|
|
private languageButtons: LanguageButton[] = [];
|
|
|
|
|
private currentSelectedLang: LanguageType = null;
|
|
|
|
|
|
|
|
|
|
onLoadCT() {
|
|
|
|
|
super.onLoadCT();
|
|
|
|
|
this.initUI();
|
|
|
|
|
this.bindEvents();
|
|
|
|
|
this.playEnterAnimation();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onEnable() {
|
|
|
|
|
this.currentSelectedLang = LanguageUtils.CurrentLanguage;
|
|
|
|
|
this.updateSelection();
|
2025-08-13 16:17:44 +08:00
|
|
|
this.languageDrawdown.active = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public onClickLanguageSelect() {
|
|
|
|
|
this.languageDrawdown.active = true;
|
2025-08-12 20:22:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private initUI() {
|
|
|
|
|
// 初始化语言按钮数组
|
|
|
|
|
this.initLanguageButton(this.btnEnglish, LanguageType.EN, "English");
|
|
|
|
|
this.initLanguageButton(this.btnChinese, LanguageType.CN, "中文");
|
|
|
|
|
this.initLanguageButton(this.btnHindi, LanguageType.HI, "हिंदी");
|
|
|
|
|
this.initLanguageButton(this.btnFrench, LanguageType.FR, "Français");
|
|
|
|
|
this.initLanguageButton(this.btnGerman, LanguageType.DE, "Deutsch");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private initLanguageButton(
|
|
|
|
|
button: Button,
|
|
|
|
|
language: LanguageType,
|
|
|
|
|
displayName: string
|
|
|
|
|
) {
|
|
|
|
|
if (!button) return;
|
|
|
|
|
|
|
|
|
|
const node = button.node;
|
|
|
|
|
|
|
|
|
|
// 查找或创建标签
|
|
|
|
|
let labelNode = node.getChildByName("Label");
|
|
|
|
|
if (!labelNode) {
|
|
|
|
|
labelNode = node.getChildByName("label");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let label: Label = null;
|
|
|
|
|
if (labelNode) {
|
|
|
|
|
label = labelNode.getComponent(Label);
|
|
|
|
|
if (label) {
|
|
|
|
|
label.string = displayName;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查找或创建选中标记
|
|
|
|
|
let checkMark = node.getChildByName("CheckMark");
|
|
|
|
|
if (!checkMark) {
|
|
|
|
|
checkMark = node.getChildByName("checkmark");
|
|
|
|
|
}
|
|
|
|
|
if (checkMark) {
|
|
|
|
|
checkMark.active = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取背景
|
|
|
|
|
let bg = node.getComponent(Sprite);
|
|
|
|
|
if (!bg) {
|
|
|
|
|
const bgNode = node.getChildByName("Bg");
|
|
|
|
|
if (bgNode) {
|
|
|
|
|
bg = bgNode.getComponent(Sprite);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.languageButtons.push({
|
|
|
|
|
button,
|
|
|
|
|
label,
|
|
|
|
|
checkMark,
|
|
|
|
|
bg,
|
|
|
|
|
language,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bindEvents() {
|
|
|
|
|
if (this.closeBtn) {
|
|
|
|
|
this.closeBtn.node.on(Button.EventType.CLICK, this.onCloseBtnClick, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 绑定语言按钮事件
|
|
|
|
|
this.languageButtons.forEach((langBtn) => {
|
|
|
|
|
if (langBtn.button) {
|
|
|
|
|
langBtn.button.node.on(
|
|
|
|
|
Button.EventType.CLICK,
|
|
|
|
|
() => {
|
|
|
|
|
this.onLanguageSelect(langBtn.language);
|
|
|
|
|
},
|
|
|
|
|
this
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private onLanguageSelect(language: LanguageType) {
|
|
|
|
|
if (this.currentSelectedLang === language) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//AudioManager.I.playSfx("click");
|
|
|
|
|
|
|
|
|
|
this.currentSelectedLang = language;
|
|
|
|
|
LanguageUtils.setLanguage(language);
|
|
|
|
|
this.updateSelection();
|
|
|
|
|
|
|
|
|
|
// 播放选中动画
|
|
|
|
|
const selectedBtn = this.languageButtons.find(
|
|
|
|
|
(btn) => btn.language === language
|
|
|
|
|
);
|
|
|
|
|
if (selectedBtn && selectedBtn.button) {
|
|
|
|
|
this.playSelectAnimation(selectedBtn.button.node);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 延迟关闭面板
|
|
|
|
|
this.scheduleOnce(() => {
|
|
|
|
|
this.playExitAnimation(() => {
|
|
|
|
|
this.close();
|
|
|
|
|
});
|
|
|
|
|
}, 0.5);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private updateSelection() {
|
|
|
|
|
this.languageButtons.forEach((langBtn) => {
|
|
|
|
|
const isSelected = langBtn.language === this.currentSelectedLang;
|
|
|
|
|
|
|
|
|
|
// 更新选中标记
|
|
|
|
|
if (langBtn.checkMark) {
|
|
|
|
|
langBtn.checkMark.active = isSelected;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新背景色
|
|
|
|
|
if (langBtn.bg) {
|
|
|
|
|
if (isSelected) {
|
|
|
|
|
langBtn.bg.color = new Color(150, 255, 150, 255);
|
|
|
|
|
} else {
|
|
|
|
|
langBtn.bg.color = new Color(255, 255, 255, 255);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新按钮交互性
|
|
|
|
|
if (langBtn.button) {
|
|
|
|
|
langBtn.button.interactable = !isSelected;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private playSelectAnimation(node: Node) {
|
|
|
|
|
tween(node)
|
|
|
|
|
.to(0.1, { scale: new Vec3(1.1, 1.1, 1) })
|
|
|
|
|
.to(0.1, { scale: new Vec3(1, 1, 1) })
|
|
|
|
|
.start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private playEnterAnimation() {
|
|
|
|
|
if (this.panelBg) {
|
|
|
|
|
this.panelBg.scale = new Vec3(0.8, 0.8, 1);
|
|
|
|
|
tween(this.panelBg)
|
|
|
|
|
.to(0.3, { scale: new Vec3(1, 1, 1) }, { easing: "backOut" })
|
|
|
|
|
.start();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private playExitAnimation(callback: () => void) {
|
|
|
|
|
if (this.panelBg) {
|
|
|
|
|
tween(this.panelBg)
|
|
|
|
|
.to(0.2, { scale: new Vec3(0.8, 0.8, 1) }, { easing: "backIn" })
|
|
|
|
|
.call(callback)
|
|
|
|
|
.start();
|
|
|
|
|
} else {
|
|
|
|
|
callback();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private onCloseBtnClick() {
|
|
|
|
|
//AudioManager.I.playSfx("click");
|
|
|
|
|
this.playExitAnimation(() => {
|
|
|
|
|
this.close();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onDestroy() {
|
|
|
|
|
// if (this.closeBtn) {
|
|
|
|
|
// this.closeBtn.node.off(
|
|
|
|
|
// Button.EventType.CLICK,
|
|
|
|
|
// this.onCloseBtnClick,
|
|
|
|
|
// this
|
|
|
|
|
// );
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// this.languageButtons.forEach((langBtn) => {
|
|
|
|
|
// if (langBtn.button) {
|
|
|
|
|
// langBtn.button.node.targetOff(this);
|
|
|
|
|
// }
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
super.onDestroy();
|
|
|
|
|
}
|
|
|
|
|
}
|