cmake_minimum_required(VERSION 3.16)

project(FancyInputQt
    VERSION 1.2.0
    DESCRIPTION "FancyInput 输入模拟/宏工具 - Qt 迁移版"
    LANGUAGES C CXX
)

# ============ 全局编译设置 ============
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

# ============ Qt 依赖（6.8.3 MinGW，LGPL v3 动态链接） ============
find_package(Qt6 6.8 REQUIRED COMPONENTS
    Core Gui Qml Quick QuickControls2
)

# QTP0001: QML 资源前缀为 :/qt/qml/<URI>/
# QTP0004: QML 文件统一由 qt_add_qml_module 管理，无需手写 qmldir
qt_policy(SET QTP0001 NEW)
qt_policy(SET QTP0004 NEW)

# QML 模块统一输出到 build/<config>/<URI路径>/（qmlls/qmllint 依赖此布局才能找到模块）
# 必须在 qt_add_qml_module 之前设置
set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")

# ============ 主程序 ============
qt_add_executable(FancyInputQt
    src/main.cpp
)

# ============ QML 模块 1：FancyInput.Controls（用户自定义控件） ============
# 控件文件放在 src/qml/controls/ 目录下，GLOB 自动收集：
# 以后新增控件只需放 .qml 文件，无需修改本文件。
file(GLOB CONTROLS_QML_FILES CONFIGURE_DEPENDS
    RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
    "src/qml/controls/*.qml"
)

# Theme.qml 是 QML 单例（pragma Singleton），需显式声明
set_source_files_properties(
    src/qml/controls/Theme.qml
    PROPERTIES QT_QML_SINGLETON_TYPE TRUE
)

qt_add_qml_module(FancyInputControls
    STATIC           # 编译为静态库，链接进 exe，无需额外部署 DLL
    URI FancyInput.Controls
    VERSION 1.0
    QML_FILES
        ${CONTROLS_QML_FILES}
)

# ============ QML 模块 2：FancyInputQt（App 主界面） ============
qt_add_qml_module(FancyInputQt
    URI FancyInputQt
    VERSION 1.0
    QML_FILES
        src/qml/Main.qml
    DEPENDENCIES
        FancyInputControls
)

# ============ 链接 ============
target_link_libraries(FancyInputQt PRIVATE
    FancyInputControls        # 控件模块（含 QML 资源）
    FancyInputControlsplugin  # 控件模块的静态插件，必须链接，否则运行时找不到模块
    Qt6::Core Qt6::Gui Qt6::Qml Qt6::Quick Qt6::QuickControls2
)

# ============ 输出目录 ============
# exe 输出到 bin/<config>，build/ 只留中间产物（须在 qt_add_qml_module 之后设置）
set_target_properties(FancyInputQt PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}"
)

# ============ 部署：windeployqt 拷贝 Qt 运行库 + 裁剪未使用组件 ============
if(WIN32)
    find_program(WINDEPLOYQT_EXECUTABLE windeployqt
        HINTS "${QT6_INSTALL_PREFIX}/bin"
        REQUIRED)

    # 1. 拷贝所需 Qt DLL/插件/QML 到 exe 旁
    add_custom_command(TARGET FancyInputQt POST_BUILD
        COMMAND "${WINDEPLOYQT_EXECUTABLE}"
                --no-translations --no-system-d3d-compiler --no-opengl-sw
                --skip-plugin-types qmltooling
                --qmldir "${CMAKE_SOURCE_DIR}/src/qml"
                "$<TARGET_FILE:FancyInputQt>"
        COMMENT "部署 Qt 运行库")

    # 2. 体积优化：删除未使用的 Qt 组件
    set(DEPLOY_DIR "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}")

    # 2.1 未使用的 QuickControls2 风格（默认只需 Windows/Basic/Fusion）
    set(UNUSED_STYLES
        "${DEPLOY_DIR}/qml/QtQuick/Controls/FluentWinUI3"
        "${DEPLOY_DIR}/qml/QtQuick/Controls/Material"
        "${DEPLOY_DIR}/qml/QtQuick/Controls/Universal"
        "${DEPLOY_DIR}/qml/QtQuick/Controls/Imagine"
        "${DEPLOY_DIR}/Qt6QuickControls2FluentWinUI3StyleImpl.dll"
        "${DEPLOY_DIR}/Qt6QuickControls2Material.dll"
        "${DEPLOY_DIR}/Qt6QuickControls2MaterialStyleImpl.dll"
        "${DEPLOY_DIR}/Qt6QuickControls2Universal.dll"
        "${DEPLOY_DIR}/Qt6QuickControls2UniversalStyleImpl.dll"
        "${DEPLOY_DIR}/Qt6QuickControls2Imagine.dll"
        "${DEPLOY_DIR}/Qt6QuickControls2ImagineStyleImpl.dll")

    # 2.2 Qt6VirtualKeyboard（GPL v3 禁止闭源商用，本工程未使用）
    set(GPL_COMPONENTS
        "${DEPLOY_DIR}/qml/QtQuick/VirtualKeyboard"
        "${DEPLOY_DIR}/Qt6VirtualKeyboard.dll"
        "${DEPLOY_DIR}/platforminputcontexts/qtvirtualkeyboardplugin.dll")

    # 2.3 其他未使用组件
    set(UNUSED_MISC
        "${DEPLOY_DIR}/tls"
        "${DEPLOY_DIR}/generic"
        "${DEPLOY_DIR}/imageformats/qgif.dll"
        "${DEPLOY_DIR}/imageformats/qicns.dll"
        "${DEPLOY_DIR}/imageformats/qtga.dll"
        "${DEPLOY_DIR}/imageformats/qtiff.dll"
        "${DEPLOY_DIR}/imageformats/qwbmp.dll"
        "${DEPLOY_DIR}/imageformats/qwebp.dll")

    add_custom_command(TARGET FancyInputQt POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E rm -rf ${UNUSED_STYLES}
        COMMAND ${CMAKE_COMMAND} -E rm -rf ${GPL_COMPONENTS}
        COMMAND ${CMAKE_COMMAND} -E rm -rf ${UNUSED_MISC}
        COMMENT "体积优化: 裁剪未使用的 Qt 组件")
endif()
