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

"""
Qt环境 vs ShowBase环境 GUI对比测试
验证两种环境中DirectGUI的差异
"""

import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QLabel, QPushButton
from PyQt5.QtCore import Qt
from QMeta3D.QMeta3DWidget import QMeta3DWidget
from QMeta3D.Meta3DWorld import Meta3DWorld
from direct.showbase.ShowBase import ShowBase
from direct.gui.DirectGui import *
from direct.gui.OnscreenText import OnscreenText
from panda3d.core import *

class QtTestWorld(Meta3DWorld):
    """Qt集成环境测试"""
    def __init__(self):
        super().__init__()
        
        print("=== Qt环境GUI测试 ===")
        self.setBackgroundColor(0.2, 0.2, 0.3)
        
        # 检查环境
        print(f"基类: {self.__class__.__bases__}")
        print(f"render2d: {self.render2d}")
        print(f"aspect2d: {self.aspect2d}")
        print(f"窗口类型: {type(self.win) if hasattr(self, 'win') else 'None'}")
        
        # 延迟创建GUI
        self.taskMgr.doMethodLater(1.0, self.createTestGUI, "create-gui")
    
    def createTestGUI(self, task=None):
        """创建测试GUI"""
        print("\n--- Qt环境创建GUI ---")
        
        # 完全模仿gui_3d_demo.py的创建方式
        try:
            self.testButton = DirectButton(
                text="Qt测试按钮",
                pos=(0, 0, 0),
                scale=0.1,
                command=self.onButtonClick,
                frameColor=(1, 0, 0, 1),  # 红色，更显眼
                text_font=None
            )
            print(f"✓ Qt环境按钮创建成功: {self.testButton}")
            print(f"  父节点: {self.testButton.getParent()}")
            print(f"  位置: {self.testButton.getPos()}")
            print(f"  隐藏状态: {self.testButton.isHidden()}")
            print(f"  渲染状态: {self.testButton.node().isOnstage()}")
            
        except Exception as e:
            print(f"✗ Qt环境按钮创建失败: {str(e)}")
        
        # 创建标题文本
        try:
            self.title = OnscreenText(
                text="Qt Environment Test",
                pos=(0, 0.8),
                scale=0.08,
                fg=(1, 1, 1, 1),
                align=TextNode.ACenter
            )
            print(f"✓ Qt环境标题创建成功: {self.title}")
        except Exception as e:
            print(f"✗ Qt环境标题创建失败: {str(e)}")
        
        # 检查render2d和aspect2d的状态
        print(f"\nQt环境渲染状态:")
        print(f"  render2d子节点数: {self.render2d.getNumChildren()}")
        print(f"  aspect2d子节点数: {self.aspect2d.getNumChildren()}")
        
        return task.done if task else None
    
    def onButtonClick(self):
        print("🎯 Qt环境按钮被点击了！")

class ShowBaseTestWorld(ShowBase):
    """ShowBase环境测试"""
    def __init__(self):
        ShowBase.__init__(self)
        
        print("\n=== ShowBase环境GUI测试 ===")
        self.setBackgroundColor(0.2, 0.2, 0.3)
        
        # 检查环境
        print(f"基类: {self.__class__.__bases__}")
        print(f"render2d: {self.render2d}")
        print(f"aspect2d: {self.aspect2d}")
        print(f"窗口类型: {type(self.win)}")
        
        # 立即创建GUI
        self.createTestGUI()
    
    def createTestGUI(self):
        """创建测试GUI"""
        print("\n--- ShowBase环境创建GUI ---")
        
        # 完全相同的GUI创建方式
        try:
            self.testButton = DirectButton(
                text="ShowBase测试按钮",
                pos=(0, 0, 0),
                scale=0.1,
                command=self.onButtonClick,
                frameColor=(0, 1, 0, 1),  # 绿色，区分
                text_font=None
            )
            print(f"✓ ShowBase环境按钮创建成功: {self.testButton}")
            print(f"  父节点: {self.testButton.getParent()}")
            print(f"  位置: {self.testButton.getPos()}")
            print(f"  隐藏状态: {self.testButton.isHidden()}")
            print(f"  渲染状态: {self.testButton.node().isOnstage()}")
            
        except Exception as e:
            print(f"✗ ShowBase环境按钮创建失败: {str(e)}")
        
        # 创建标题文本
        try:
            self.title = OnscreenText(
                text="ShowBase Environment Test",
                pos=(0, 0.8),
                scale=0.08,
                fg=(1, 1, 1, 1),
                align=TextNode.ACenter
            )
            print(f"✓ ShowBase环境标题创建成功: {self.title}")
        except Exception as e:
            print(f"✗ ShowBase环境标题创建失败: {str(e)}")
        
        # 检查render2d和aspect2d的状态
        print(f"\nShowBase环境渲染状态:")
        print(f"  render2d子节点数: {self.render2d.getNumChildren()}")
        print(f"  aspect2d子节点数: {self.aspect2d.getNumChildren()}")
    
    def onButtonClick(self):
        print("🎯 ShowBase环境按钮被点击了！")

def testQtEnvironment():
    """测试Qt环境"""
    print("启动Qt环境测试...")
    
    app = QApplication(sys.argv)
    
    # 创建主窗口
    mainWindow = QMainWindow()
    mainWindow.setWindowTitle("Qt环境测试")
    mainWindow.setGeometry(100, 100, 600, 400)
    
    # 创建布局
    centralWidget = QWidget()
    layout = QVBoxLayout(centralWidget)
    
    # 添加说明
    label = QLabel("Qt环境DirectGUI测试")
    label.setAlignment(Qt.AlignCenter)
    label.setStyleSheet("background-color: lightblue; padding: 10px;")
    layout.addWidget(label)
    
    # 创建世界
    world = QtTestWorld()
    
    # 创建Panda3D部件
    pandaWidget = QMeta3DWidget(world)
    layout.addWidget(pandaWidget)
    
    mainWindow.setCentralWidget(centralWidget)
    mainWindow.show()
    
    print("Qt环境窗口已显示")
    return app.exec_()

def testShowBaseEnvironment():
    """测试ShowBase环境"""
    print("\n启动ShowBase环境测试...")
    
    # 配置Panda3D窗口
    loadPrcFileData("", """
        win-size 600 400
        window-title ShowBase Environment Test
    """)
    
    # 创建ShowBase应用
    app = ShowBaseTestWorld()
    app.run()

def main():
    """主函数"""
    print("DirectGUI环境对比测试")
    print("="*50)
    
    choice = input("选择测试环境:\n1. Qt环境\n2. ShowBase环境\n3. 两个都测试\n请输入(1/2/3): ").strip()
    
    if choice == "1":
        testQtEnvironment()
    elif choice == "2":
        testShowBaseEnvironment()
    elif choice == "3":
        print("先测试ShowBase环境...")
        import threading
        import time
        
        # 先启动ShowBase环境
        showbase_thread = threading.Thread(target=testShowBaseEnvironment)
        showbase_thread.daemon = True
        showbase_thread.start()
        
        # 等待一会
        time.sleep(2)
        
        print("\n然后测试Qt环境...")
        testQtEnvironment()
    else:
        print("无效选择")

if __name__ == "__main__":
    main() 