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)

# ---- 输出目录策略 ----
# build/<preset>：仅存放 CMake 中间产物（编译对象、Makefile、生成的 QML 模块等）
# bin/<config>  ：最终产物（exe + Qt DLL + 插件），由 windeployqt 部署，开箱即用
# 注意：不能用全局 CMAKE_RUNTIME_OUTPUT_DIRECTORY —— 已验证它会破坏
# qt_add_qml_module 的 QML 模块嵌入，运行时报 "Module FancyInputQt contains no type named Main"。
# 必须用 per-target 属性且放在 qt_add_qml_module 之后设置（见下方 target_link_libraries 后）。

# Qt 6.8.3 MinGW 套件（LGPL v3 动态链接，可免费商用）
find_package(Qt6 6.8 REQUIRED COMPONENTS
    Core
    Gui
    Qml
    Quick
    QuickControls2
)

# QTP0004: QML 文件统一由 qt_add_qml_module 管理，无需额外 qmldir
qt_policy(SET QTP0004 NEW)
# QTP0001: QML 模块资源前缀使用 :/qt/qml/<URI>/（如 :/qt/qml/FancyInputQt/、:/qt/qml/FancyInput/Controls/），
#          main.cpp 中已 addImportPath("qrc:/") 使内嵌模块可被发现
qt_policy(SET QTP0001 NEW)

# ---- 阶段 0：Hello World 工程骨架 ----
# 后续阶段：输入识别核心 → 通用函数 → 主界面 → 分窗口 → 延后功能

qt_add_executable(FancyInputQt
    src/main.cpp
)

# ---- 用户控件模块 FancyInput.Controls（独立静态库） ----
# 自定义控件/主题统一放这里，App 主界面通过 `import FancyInput.Controls` 使用，
# 与 Qt 内置模块解耦，后续扩展新控件只需往 src/qml/controls/ 目录加 .qml 文件。
# URI 用点分命名空间（FancyInput.Controls），避免与主模块/第三方库撞名。
# 注意：Theme.qml 用 pragma Singleton，必须通过 QT_QML_SINGLETON_TYPE
# 源文件属性显式声明（qt_add_qml_module 只自动识别 .pragma library，
# 不会自动检测 pragma Singleton —— 见 Qt6QmlMacros.cmake 3292 行）。
qt_add_library(FancyInputControls STATIC)

set_source_files_properties(
    src/qml/controls/Theme.qml
    PROPERTIES QT_QML_SINGLETON_TYPE TRUE
)

qt_add_qml_module(FancyInputControls
    URI FancyInput.Controls
    VERSION 1.0
    QML_FILES
        src/qml/controls/Theme.qml
)

# ---- 主入口 QML 模块（App 自身，URI 与 exe 同名用于内嵌发现） ----
qt_add_qml_module(FancyInputQt
    URI FancyInputQt
    VERSION 1.0
    QML_FILES
        src/qml/Main.qml
    DEPENDENCIES
        FancyInputControls
)

target_link_libraries(FancyInputQt PRIVATE
    FancyInputControls
    FancyInputControlsplugin
    Qt6::Core
    Qt6::Gui
    Qt6::Qml
    Qt6::Quick
    Qt6::QuickControls2
)

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

# ---- 构建后自动部署 Qt DLL 到 bin/<config>（LGPL 动态链接） ----
# 用 Qt 官方 windeployqt 把所需 DLL + 插件 + QML 依赖拷到 exe 旁，
# 保证 bin/ 目录开箱即用（双击即可运行，无需依赖 PATH）。
#
# 体积优化（已验证，Release 从 ~63MB 减到 ~46MB）：
# 1. --skip-plugin-types qmltooling  -> 跳过 QML 调试插件（仅开发用）
# 2. 部署后删除未使用的 QuickControls2 风格：
#    FluentWinUI3(4.8MB)/Material/Universal/Imagine —— 默认只加载 Windows/Basic/Fusion
# 3. 删除未使用模块：tls(OpenSSL)、generic(触摸屏)、多余 imageformats
# 4. 强制删除 Qt6VirtualKeyboard（GPL v3，禁止用于闭源商用！本工程未使用它，
#    只是被 windeployqt 隐式部署进来）—— 见下方裁剪命令
if(WIN32)
    find_program(WINDEPLOYQT_EXECUTABLE windeployqt
        HINTS "${QT6_INSTALL_PREFIX}/bin"
        REQUIRED)
    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 "windeployqt: 部署 Qt 运行库到 bin/<config>")
    # 部署后裁剪未使用的 Qt 模块/插件（体积优化）
    set(DEPLOY_DIR "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}")
    add_custom_command(TARGET FancyInputQt POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E rm -rf
                "${DEPLOY_DIR}/qml/QtQuick/Controls/FluentWinUI3"
                "${DEPLOY_DIR}/qml/QtQuick/Controls/Material"
                "${DEPLOY_DIR}/qml/QtQuick/Controls/Universal"
                "${DEPLOY_DIR}/qml/QtQuick/Controls/Imagine"
        COMMAND ${CMAKE_COMMAND} -E rm -f
                "${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"
        COMMAND ${CMAKE_COMMAND} -E rm -rf
                "${DEPLOY_DIR}/tls"
                "${DEPLOY_DIR}/generic"
        # Qt6VirtualKeyboard = GPL v3，禁止闭源商用，且本工程未使用 —— 强制删除
        COMMAND ${CMAKE_COMMAND} -E rm -rf
                "${DEPLOY_DIR}/qml/QtQuick/VirtualKeyboard"
        COMMAND ${CMAKE_COMMAND} -E rm -f
                "${DEPLOY_DIR}/Qt6VirtualKeyboard.dll"
                "${DEPLOY_DIR}/platforminputcontexts/qtvirtualkeyboardplugin.dll"
        COMMAND ${CMAKE_COMMAND} -E rm -f
                "${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"
        COMMENT "体积优化: 删除未使用的 Qt 风格/插件 + GPL 的 VirtualKeyboard")
endif()
