# 手工维护 —— 不是 tools/gen_part3.py 的生成产物，重新生成 p01/p03 不会影响这里。
#
# 教学补充示例：方案书「C++方向」课程要求、但仓库 p03/（wiki 抓取内容）未覆盖
# 的技术点，每个子目录一个最小可运行 Qt 程序 + 配套 README.md 教学文档。
# 不计入 README.md/CLAUDE.md 里「144+29=173 个目标」的生成器目标计数。

function(add_teaching_example name dir)
    add_executable(${name} ${dir}/${name}.cpp)
    set_target_properties(${name} PROPERTIES
        CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
    target_link_libraries(${name} PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
    target_compile_options(${name} PRIVATE -Wall -Wextra)
endfunction()

add_teaching_example(qt_qss_styling qss_styling)
add_teaching_example(qt_model_view_basics model_view)
add_teaching_example(qt_json_parse_write json_io)
add_teaching_example(qt_thread_worker qthread_worker)
add_teaching_example(qt_property_animation property_animation)
add_teaching_example(qt_state_machine state_machine)

# 坑点最小复现示例（OUTLINE_4DAY.md §9.2）：默认跑「正确写法」离屏可验证退出码 0，
# 错误写法一律用命令行开关现场触发（--crash / --dangle），不影响自动化验证。
add_teaching_example(qt_pitfall_stack_widget pitfall_stack_widget)
add_teaching_example(qt_pitfall_lambda_capture pitfall_lambda_capture)
add_teaching_example(qt_pitfall_double_connect pitfall_double_connect)
add_teaching_example(qt_table_widget_basics table_widget)
# Day2 下午案例参考实现（OUTLINE_4DAY.md Day2 下午「简易计算器」）
add_teaching_example(qt_calculator calculator)

# Day2 案例的 Qt Designer(.ui) 对照版：界面用表单设计、业务逻辑与 qt_calculator
# 一致。需要 AUTOUIC（add_teaching_example 只开 AUTOMOC），单独写 target。
add_executable(qt_calculator_designer
    calculator_designer/qt_calculator_designer.cpp
    calculator_designer/calculator_designer.ui)
set_target_properties(qt_calculator_designer PROPERTIES
    CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF
    AUTOMOC ON AUTOUIC ON)
target_link_libraries(qt_calculator_designer PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
target_compile_options(qt_calculator_designer PRIVATE -Wall -Wextra)

# Day2 增强版计算器（calculator_designer_ext）：在 Designer 版基础上把「立即计算」
# 升级为「表达式求值」——独立 ExpressionEvaluator 用递归下降解析器实现运算符优先级
# 与括号（含嵌套、未闭合自动补全）。多源文件 + .ui 表单，单独写 target。
# 注意：子目录里那个 Qt Creator 导出的 CMakeLists.txt 不参与仓库构建（C++11 /
# 目标名 Calculator / ANDROID 分支均不符仓库 C++17 规范），构建一律走本 target。
add_executable(qt_calculator_designer_ext
    calculator_designer_ext/main.cpp
    calculator_designer_ext/calculatordesigner.cpp
    calculator_designer_ext/expressionevaluator.cpp
    calculator_designer_ext/widget.ui)
target_include_directories(qt_calculator_designer_ext PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/calculator_designer_ext)
set_target_properties(qt_calculator_designer_ext PROPERTIES
    CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF
    AUTOMOC ON AUTOUIC ON)
target_link_libraries(qt_calculator_designer_ext PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
target_compile_options(qt_calculator_designer_ext PRIVATE -Wall -Wextra)

# Day5 综合案例参考实现（OUTLINE_4DAY.md §3 / §9.3）
add_teaching_example(qt_student_manager student_manager)

# QMainWindow 教学综合示例（wiki「5 QMainWindow」pageId 58954529 的 5.1–5.6 全组件）：
# form designer(.ui) 定义主窗体结构、.qrc 资源文件提供应用图标。单独写 target
# （标准 add_teaching_example 只开 AUTOMOC，本例还需 AUTOUIC+AUTORCC）。
add_executable(qt_mainwindow_showcase
    mainwindow_showcase/main.cpp
    mainwindow_showcase/mainwindow_showcase.cpp
    mainwindow_showcase/mainwindow_showcase.h
    mainwindow_showcase/mainwindow.ui
    mainwindow_showcase/mainwindow.qrc)
set_target_properties(qt_mainwindow_showcase PROPERTIES
    CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF
    AUTOMOC ON AUTOUIC ON AUTORCC ON)
target_link_libraries(qt_mainwindow_showcase PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
target_compile_options(qt_mainwindow_showcase PRIVATE -Wall -Wextra)

# Day3 上午版参考实现：把 Day2 增强版计算器装进 QMainWindow（菜单/状态栏/历史停靠窗）。
# 复用 Day2 的 calculatordesigner + expressionevaluator + widget.ui（自包含复制），
# 新增 mainwindow.{h,cpp} 外壳 + 含 runSelfTest 的 main.cpp。无 QSS（QSS 在下午版）。
add_executable(qt_calculator_mainwindow
    calculator_mainwindow/main.cpp
    calculator_mainwindow/mainwindow.cpp
    calculator_mainwindow/calculatordesigner.cpp
    calculator_mainwindow/expressionevaluator.cpp
    calculator_mainwindow/widget.ui)
target_include_directories(qt_calculator_mainwindow PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/calculator_mainwindow)
set_target_properties(qt_calculator_mainwindow PROPERTIES
    CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF
    AUTOMOC ON AUTOUIC ON)
target_link_libraries(qt_calculator_mainwindow PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
target_compile_options(qt_calculator_mainwindow PRIVATE -Wall -Wextra)

# Day3 下午版参考实现：上午版 + QSS 双主题美化。复用上午版同款 5 文件（自包含复制），
# 仅 mainwindow.{h,cpp} 加双主题 QSS + 视图菜单「深色主题」、main.cpp 自测加主题断言。
add_executable(qt_calculator_mainwindow_qss
    calculator_mainwindow_qss/main.cpp
    calculator_mainwindow_qss/mainwindow.cpp
    calculator_mainwindow_qss/calculatordesigner.cpp
    calculator_mainwindow_qss/expressionevaluator.cpp
    calculator_mainwindow_qss/widget.ui
    calculator_mainwindow_qss/themes.qrc)
target_include_directories(qt_calculator_mainwindow_qss PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/calculator_mainwindow_qss)
set_target_properties(qt_calculator_mainwindow_qss PROPERTIES
    CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF
    AUTOMOC ON AUTOUIC ON AUTORCC ON)
target_link_libraries(qt_calculator_mainwindow_qss PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
target_compile_options(qt_calculator_mainwindow_qss PRIVATE -Wall -Wextra)

# QDialog 教学综合示例（wiki「6 对话框 QDialog」pageId 183664881 的 6.2–6.5）：
# QWidget 布满 pushbutton，每个按钮演示一种 QDialog 行为。纯代码（无 .ui），
# 单文件，走 add_teaching_example。
add_teaching_example(qt_dialog_showcase qdialog_showcase)

# QLineEdit 自绘小眼睛 / echo mode 切换（Day4 上午：组件绘制 + 事件捕捉 + clear button 避让）：
# 子类化 QLineEdit，paintEvent 自绘眼睛、mouseEvent 命中切换 echoMode，与内置 clear button
# 动态避让（读 objectName=="clearButton" 子 widget 几何）。子目录另有独立 CMakeLists.txt
# 供单独打开（不走这里：顶层 add_subdirectory 不递归）。
add_teaching_example(qt_lineedit_eye_toggle lineedit_eye_toggle)

# Day4 综合演示示例（事件机制 + QPainter 绘图 + 多线程）：Mandelbrot 分形渲染器。
# 三段式对比（主线程卡死 / 后台单线程 / 后台多线程），滚轮缩放 + 拖拽平移 + 分块并行。
# 多源文件（无 .ui/.qrc），单独写 target；子目录另有独立 CMakeLists.txt 供单独打开
# （不走这里：顶层 add_subdirectory 不递归），与 lineedit_eye_toggle 同模式。
add_executable(qt_mandelbrot_renderer
    mandelbrot_renderer/main.cpp
    mandelbrot_renderer/mandelbrot_widget.cpp
    mandelbrot_renderer/mandelbrot_strip_task.cpp)
target_include_directories(qt_mandelbrot_renderer PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/mandelbrot_renderer)
set_target_properties(qt_mandelbrot_renderer PROPERTIES
    CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON)
target_link_libraries(qt_mandelbrot_renderer PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
target_compile_options(qt_mandelbrot_renderer PRIVATE -Wall -Wextra)

# Qt5 文件操作教学综合示例（QFile/QTextStream/QDataStream/QFileInfo/QDir/QTextCodec/QJson）：
# 一个 QWidget 布满按钮，5 个主题（基础IO/编码/文本vs二进制/异常处理/QJson），每个按钮
# 产生一个文件落到 demo_output/（可执行文件同目录），方便课堂手动打开查看。纯代码单文件。
add_teaching_example(qt_file_io_demo file_io_demo)

add_custom_target(all_teaching_examples DEPENDS
    qt_qss_styling
    qt_model_view_basics
    qt_json_parse_write
    qt_thread_worker
    qt_property_animation
    qt_state_machine
    qt_pitfall_stack_widget
    qt_pitfall_lambda_capture
    qt_pitfall_double_connect
    qt_table_widget_basics
    qt_calculator
    qt_calculator_designer
    qt_calculator_designer_ext
    qt_student_manager
    qt_mainwindow_showcase
    qt_calculator_mainwindow
    qt_calculator_mainwindow_qss
    qt_dialog_showcase
    qt_lineedit_eye_toggle
    qt_mandelbrot_renderer
    qt_file_io_demo)
