This commit implements Phase 7 of the UIModule, adding advanced features that make the UI system production-ready. ## Phase 7.1 - UIScrollPanel New scrollable container widget with: - Vertical and horizontal scrolling (configurable) - Mouse wheel support with smooth scrolling - Drag-to-scroll functionality (drag content or scrollbar) - Interactive scrollbar with proportional thumb - Automatic content size calculation - Visibility culling for performance - Full styling support (colors, borders, scrollbar) Files added: - modules/UIModule/Widgets/UIScrollPanel.h - modules/UIModule/Widgets/UIScrollPanel.cpp - modules/UIModule/Core/UIContext.h (added mouseWheelDelta) - modules/UIModule/UIModule.cpp (mouse wheel event routing) ## Phase 7.2 - Tooltips Smart tooltip system with: - Hover delay (500ms default) - Automatic positioning with edge avoidance - Semi-transparent background with border - Per-widget tooltip text via JSON - Tooltip property on all UIWidget types - Renders on top of all UI elements Files added: - modules/UIModule/Core/UITooltip.h - modules/UIModule/Core/UITooltip.cpp - modules/UIModule/Core/UIWidget.h (added tooltip property) - modules/UIModule/Core/UITree.cpp (tooltip parsing) ## Tests Added comprehensive visual tests: - test_28_ui_scroll.cpp - ScrollPanel with 35+ items - test_29_ui_advanced.cpp - Tooltips on various widgets - assets/ui/test_scroll.json - ScrollPanel layout - assets/ui/test_tooltips.json - Tooltips layout ## Documentation - docs/UI_MODULE_PHASE7_COMPLETE.md - Complete Phase 7 docs - docs/PROMPT_UI_MODULE_PHASE6.md - Phase 6 & 7 prompt - Updated CMakeLists.txt for new files and tests ## UIModule Status UIModule is now feature-complete with: ✅ 9 widget types (Panel, Label, Button, Image, Slider, Checkbox, ProgressBar, TextInput, ScrollPanel) ✅ Flexible layout system (vertical, horizontal, stack, absolute) ✅ Theme and style system ✅ Complete event system ✅ Tooltips with smart positioning ✅ Hot-reload support ✅ Comprehensive tests (Phases 1-7) 🚀 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
204 lines
7.1 KiB
CMake
204 lines
7.1 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
project(GroveEngine VERSION 1.0.0 LANGUAGES CXX)
|
|
|
|
# C++ Standard
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
# ============================================================================
|
|
# Sanitizers for Testing
|
|
# ============================================================================
|
|
option(GROVE_ENABLE_TSAN "Enable ThreadSanitizer" OFF)
|
|
|
|
if(GROVE_ENABLE_TSAN)
|
|
message(STATUS "🔍 ThreadSanitizer enabled (5-15x slowdown expected)")
|
|
add_compile_options(-fsanitize=thread -g -O1 -fno-omit-frame-pointer)
|
|
add_link_options(-fsanitize=thread)
|
|
|
|
# Disable optimizations that confuse TSan
|
|
add_compile_options(-fno-optimize-sibling-calls)
|
|
|
|
message(WARNING "⚠️ TSan cannot be combined with ASan - build separately")
|
|
endif()
|
|
|
|
# ============================================================================
|
|
# Helgrind (Valgrind) Integration
|
|
# ============================================================================
|
|
option(GROVE_ENABLE_HELGRIND "Add Helgrind test target" OFF)
|
|
|
|
if(GROVE_ENABLE_HELGRIND)
|
|
find_program(VALGRIND_EXECUTABLE valgrind)
|
|
|
|
if(VALGRIND_EXECUTABLE)
|
|
message(STATUS "✅ Valgrind found: ${VALGRIND_EXECUTABLE}")
|
|
|
|
# Add custom target for all tests
|
|
add_custom_target(helgrind
|
|
COMMAND ${CMAKE_COMMAND} -E echo "🔍 Running Helgrind (10-50x slowdown, be patient)..."
|
|
COMMAND ${VALGRIND_EXECUTABLE}
|
|
--tool=helgrind
|
|
--log-file=${CMAKE_BINARY_DIR}/helgrind-full.log
|
|
--suppressions=${CMAKE_SOURCE_DIR}/helgrind.supp
|
|
--error-exitcode=1
|
|
--read-var-info=yes
|
|
${CMAKE_CTEST_COMMAND} --output-on-failure --timeout 600
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running all tests with Helgrind deadlock detector"
|
|
)
|
|
|
|
# Add convenience target for single test
|
|
add_custom_target(helgrind-single
|
|
COMMAND ${CMAKE_COMMAND} -E echo "🔍 Running single test with Helgrind..."
|
|
COMMAND ${VALGRIND_EXECUTABLE}
|
|
--tool=helgrind
|
|
-v
|
|
--log-file=${CMAKE_BINARY_DIR}/helgrind-single.log
|
|
--suppressions=${CMAKE_SOURCE_DIR}/helgrind.supp
|
|
--error-exitcode=1
|
|
--read-var-info=yes
|
|
./tests/test_13_cross_system
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running test_13_cross_system with Helgrind"
|
|
)
|
|
|
|
message(STATUS "✅ Helgrind targets added:")
|
|
message(STATUS " - make helgrind (all tests)")
|
|
message(STATUS " - make helgrind-single (test_13 only)")
|
|
else()
|
|
message(WARNING "⚠️ Valgrind not found - Helgrind targets disabled")
|
|
message(STATUS " Install: sudo apt-get install valgrind")
|
|
endif()
|
|
endif()
|
|
|
|
# Dependencies
|
|
include(FetchContent)
|
|
|
|
# nlohmann_json for JSON handling
|
|
FetchContent_Declare(
|
|
nlohmann_json
|
|
GIT_REPOSITORY https://github.com/nlohmann/json.git
|
|
GIT_TAG v3.11.3
|
|
)
|
|
FetchContent_MakeAvailable(nlohmann_json)
|
|
|
|
# spdlog for logging
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON) # Force PIC for all targets
|
|
FetchContent_Declare(
|
|
spdlog
|
|
GIT_REPOSITORY https://github.com/gabime/spdlog.git
|
|
GIT_TAG v1.12.0
|
|
)
|
|
FetchContent_MakeAvailable(spdlog)
|
|
|
|
# StillHammer libraries
|
|
add_subdirectory(external/StillHammer/topictree) # Ultra-fast topic routing
|
|
add_subdirectory(external/StillHammer/logger) # Domain-organized logging
|
|
|
|
# Core library (INTERFACE - header-only pour les interfaces)
|
|
add_library(grove_core INTERFACE)
|
|
|
|
target_include_directories(grove_core INTERFACE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
)
|
|
|
|
target_link_libraries(grove_core INTERFACE
|
|
nlohmann_json::nlohmann_json
|
|
)
|
|
|
|
# Alias for consistent naming
|
|
add_library(GroveEngine::core ALIAS grove_core)
|
|
|
|
# Optional: Build implementations
|
|
option(GROVE_BUILD_IMPLEMENTATIONS "Build GroveEngine implementations" ON)
|
|
|
|
if(GROVE_BUILD_IMPLEMENTATIONS)
|
|
# Find OpenSSL for SHA256 hashing (optional on MinGW)
|
|
find_package(OpenSSL QUIET)
|
|
if(OpenSSL_FOUND)
|
|
message(STATUS "OpenSSL found - using hardware-accelerated SHA256")
|
|
set(GROVE_USE_OPENSSL ON)
|
|
else()
|
|
message(STATUS "OpenSSL not found - using fallback SHA256 implementation")
|
|
set(GROVE_USE_OPENSSL OFF)
|
|
endif()
|
|
|
|
add_library(grove_impl STATIC
|
|
# --- Working files (IDataNode-based) ---
|
|
src/ResourceRegistry.cpp
|
|
src/JsonDataValue.cpp
|
|
src/JsonDataNode.cpp
|
|
src/JsonDataTree.cpp
|
|
src/DataTreeFactory.cpp
|
|
src/IntraIO.cpp # ✅ Fixed for IDataNode
|
|
src/IntraIOManager.cpp # ✅ Fixed for IDataNode
|
|
src/SequentialModuleSystem.cpp # ✅ Fixed for IDataNode
|
|
src/IOFactory.cpp # ✅ Fixed for IDataNode
|
|
src/ModuleFactory.cpp # ✅ Should work (no json in main API)
|
|
src/ModuleSystemFactory.cpp # ✅ Needs check
|
|
src/EngineFactory.cpp # ✅ Needs check
|
|
src/DebugEngine.cpp # ✅ Needs migration
|
|
src/ModuleLoader.cpp # ✅ Hot-reload support
|
|
|
|
# --- TODO: Fix API mismatch (json vs IDataNode) ---
|
|
# src/ImGuiUI.cpp # Requires imgui dependency
|
|
)
|
|
|
|
target_link_libraries(grove_impl PUBLIC
|
|
GroveEngine::core
|
|
topictree::topictree
|
|
stillhammer_logger
|
|
spdlog::spdlog
|
|
${CMAKE_DL_LIBS}
|
|
)
|
|
|
|
if(GROVE_USE_OPENSSL)
|
|
target_link_libraries(grove_impl PUBLIC OpenSSL::Crypto)
|
|
target_compile_definitions(grove_impl PUBLIC GROVE_USE_OPENSSL=1)
|
|
else()
|
|
target_compile_definitions(grove_impl PUBLIC GROVE_USE_OPENSSL=0)
|
|
endif()
|
|
|
|
# Enable position-independent code for static library (needed for .so modules)
|
|
set_target_properties(grove_impl PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
|
|
|
# If imgui is available from parent project, link it
|
|
if(TARGET imgui_backends)
|
|
target_link_libraries(grove_impl PUBLIC imgui_backends)
|
|
endif()
|
|
|
|
add_library(GroveEngine::impl ALIAS grove_impl)
|
|
endif()
|
|
|
|
# ============================================================================
|
|
# Modules (hot-reloadable .so)
|
|
# ============================================================================
|
|
option(GROVE_BUILD_MODULES "Build GroveEngine modules" ON)
|
|
|
|
if(GROVE_BUILD_MODULES)
|
|
# BgfxRenderer module (2D rendering via bgfx)
|
|
option(GROVE_BUILD_BGFX_RENDERER "Build BgfxRenderer module" OFF)
|
|
if(GROVE_BUILD_BGFX_RENDERER)
|
|
add_subdirectory(modules/BgfxRenderer)
|
|
endif()
|
|
|
|
# UIModule (declarative UI system)
|
|
option(GROVE_BUILD_UI_MODULE "Build UIModule" OFF)
|
|
if(GROVE_BUILD_UI_MODULE)
|
|
add_subdirectory(modules/UIModule)
|
|
endif()
|
|
endif()
|
|
|
|
# Testing
|
|
option(GROVE_BUILD_TESTS "Build GroveEngine tests" ON)
|
|
|
|
if(GROVE_BUILD_TESTS)
|
|
enable_testing()
|
|
add_subdirectory(tests)
|
|
endif()
|
|
|
|
# Installation
|
|
install(DIRECTORY include/grove
|
|
DESTINATION include
|
|
FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
|
|
)
|