#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
PANDA3D 中文GUI支持测试
解决中文字体显示问题的示例
"""

from direct.showbase.ShowBase import ShowBase
from direct.gui.DirectGui import *
from direct.gui.OnscreenText import OnscreenText
from panda3d.core import *
import os

class ChineseGUITest(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        
        # 设置窗口属性
        wp = WindowProperties()
        wp.setTitle("PANDA3D Chinese GUI Test")
        self.win.requestProperties(wp)
        self.setBackgroundColor(0.1, 0.2, 0.4)
        
        # 尝试加载中文字体
        self.chinese_font = self.loadChineseFont()
        
        # 创建GUI组件
        self.createGUI()
        
        print("="*50)
        print("PANDA3D 中文GUI测试程序启动")
        print(f"中文字体加载状态: {'成功' if self.chinese_font else '失败，使用默认字体'}")
        print("="*50)
    
    def loadChineseFont(self):
        """尝试加载中文字体"""
        # 常见的中文字体路径列表
        font_paths = [
            # Ubuntu/Debian系统的中文字体
            '/usr/share/fonts/truetype/wqy/wqy-microhei.ttc',
            '/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc',
            '/usr/share/fonts/truetype/arphic/ukai.ttc',
            '/usr/share/fonts/truetype/arphic/uming.ttc',
            '/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf',
            '/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc',
            '/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf',
            # 其他可能的字体路径
            '/System/Library/Fonts/PingFang.ttc',  # macOS
            'C:/Windows/Fonts/msyh.ttc',  # Windows
            'C:/Windows/Fonts/simhei.ttf',  # Windows
        ]
        
        print("正在尝试加载中文字体...")
        
        for font_path in font_paths:
            if os.path.exists(font_path):
                try:
                    print(f"尝试加载字体: {font_path}")
                    font = self.loader.loadFont(font_path)
                    if font:
                        print(f"成功加载字体: {font_path}")
                        return font
                    else:
                        print(f"字体文件存在但加载失败: {font_path}")
                except Exception as e:
                    print(f"加载字体时出错: {font_path}, 错误: {e}")
        
        print("未找到可用的中文字体，将使用默认字体")
        print("如果中文显示为方块，请安装中文字体：")
        print("sudo apt-get install fonts-wqy-microhei fonts-wqy-zenhei")
        return None
    
    def createText(self, text, pos, scale=0.06, fg=(1, 1, 1, 1)):
        """创建文本，优先使用中文字体"""
        if self.chinese_font:
            return OnscreenText(
                text=text,
                pos=pos,
                scale=scale,
                fg=fg,
                align=TextNode.ALeft,
                font=self.chinese_font
            )
        else:
            return OnscreenText(
                text=text,
                pos=pos,
                scale=scale,
                fg=fg,
                align=TextNode.ALeft
            )
    
    def createButton(self, text, pos, scale=0.06, command=None, frameColor=(0.5, 0.5, 0.5, 1)):
        """创建支持中文字体的按钮"""
        return DirectButton(
            text=text,
            pos=pos,
            scale=scale,
            command=command,
            frameColor=frameColor,
            text_fg=(1, 1, 1, 1),
            text_font=self.chinese_font if self.chinese_font else None
        )
    
    def createGUI(self):
        """创建GUI组件"""
        # 标题
        self.title = self.createText(
            "PANDA3D 中文GUI测试",
            (0, 0.85),
            0.08,
            (1, 1, 0, 1)
        )
        self.title.setAlign(TextNode.ACenter)
        
        # 说明文本
        self.info = self.createText(
            "这个程序测试中文字体在PANDA3D中的显示效果",
            (-0.95, 0.7),
            0.05,
            (0.8, 0.8, 0.8, 1)
        )
        
        # 创建测试按钮 - 支持中文字体
        self.testButton = self.createButton(
            text="Test Button (测试按钮)",
            pos=(-0.6, 0, 0.5),
            scale=0.08,
            command=self.onTestClick,
            frameColor=(0.2, 0.7, 0.2, 1)
        )
        
        # 创建标签显示区域
        self.statusLabel = self.createText(
            "状态: 程序就绪",
            (-0.95, 0.3),
            0.06,
            (0, 1, 0, 1)
        )
        
        # 创建功能测试区域
        self.createTestArea()
        
        # 创建字体信息显示
        self.createFontInfo()
        
        # 退出按钮 - 支持中文字体
        self.exitButton = self.createButton(
            text="Exit (退出)",
            pos=(0.7, 0, -0.7),
            scale=0.06,
            command=self.exitProgram,
            frameColor=(0.8, 0.2, 0.2, 1)
        )
    
    def createTestArea(self):
        """创建测试区域"""
        # 中文测试文本
        chinese_texts = [
            "简体中文测试：你好世界！",
            "常用汉字：一二三四五六七八九十",
            "标点符号：，。！？；：""''（）",
            "数字混合：2023年12月25日",
            "英中混合：Hello 世界 World 中国"
        ]
        
        self.test_texts = []
        for i, text in enumerate(chinese_texts):
            text_obj = self.createText(
                text,
                (-0.95, 0.1 - i*0.08),
                0.05,
                (1, 1, 1, 1)
            )
            self.test_texts.append(text_obj)
        
        # 计数器
        self.clickCount = 0
        self.counterText = self.createText(
            f"点击次数: {self.clickCount}",
            (-0.95, -0.5),
            0.06,
            (1, 0.5, 0, 1)
        )
    
    def createFontInfo(self):
        """创建字体信息显示"""
        font_status = "已加载中文字体" if self.chinese_font else "使用默认字体"
        
        self.fontInfo = self.createText(
            f"字体状态: {font_status}",
            (0.2, 0.7),
            0.05,
            (0.8, 0.8, 0.2, 1)
        )
        
        # 显示字体路径信息
        if self.chinese_font:
            # 尝试获取字体信息
            try:
                font_name = self.chinese_font.getName()
                self.fontPath = self.createText(
                    f"字体名称: {font_name}",
                    (0.2, 0.6),
                    0.04,
                    (0.6, 0.6, 0.6, 1)
                )
            except:
                self.fontPath = self.createText(
                    "字体信息: 无法获取",
                    (0.2, 0.6),
                    0.04,
                    (0.6, 0.6, 0.6, 1)
                )
        else:
            self.fontPath = self.createText(
                "建议安装: fonts-wqy-microhei",
                (0.2, 0.6),
                0.04,
                (1, 0.5, 0.5, 1)
            )
    
    def onTestClick(self):
        """测试按钮点击事件"""
        self.clickCount += 1
        
        # 更新状态和计数器
        self.statusLabel.setText(f"状态: 按钮被点击了 {self.clickCount} 次")
        self.counterText.setText(f"点击次数: {self.clickCount}")
        
        # 循环变换测试文本
        test_messages = [
            "第一次点击：欢迎使用PANDA3D！",
            "第二次点击：中文显示测试正常",
            "第三次点击：功能运行良好",
            "继续点击：一切正常运行中..."
        ]
        
        if self.clickCount <= len(test_messages):
            message = test_messages[self.clickCount - 1]
        else:
            message = f"第{self.clickCount}次点击：持续测试中..."
        
        # 更新第一行测试文本
        if self.test_texts:
            self.test_texts[0].setText(message)
        
        print(f"按钮点击: {self.clickCount} 次, 消息: {message}")
    
    def exitProgram(self):
        """退出程序"""
        print("用户选择退出程序")
        print("再见！Goodbye!")
        self.userExit()

if __name__ == "__main__":
    print("启动PANDA3D中文GUI测试程序...")
    print("如果看到方块字符，说明需要安装中文字体")
    app = ChineseGUITest()
    app.run() 