# Prompt pour implémenter le UIModule ## Contexte Tu travailles sur GroveEngine, un moteur de jeu C++17 avec système de modules hot-reload. Le projet utilise: - **IModule** - Interface pour les modules dynamiques (.so) - **IDataNode** - Abstraction pour données structurées (implémenté par JsonDataNode) - **IIO (IntraIOManager)** - Système pub/sub pour communication inter-modules - **BgfxRenderer** - Module de rendu 2D avec bgfx (sprites, text, particules) ## Tâche Implémenter le **UIModule** - un système UI déclaratif avec: - Configuration via JSON (layouts, styles, thèmes) - Hiérarchie de widgets (Panel, Button, Label, Slider, etc.) - Rendu via IIO topics (`render:sprite`, `render:text`) - Gestion des inputs via IIO (`input:mouse`, `input:keyboard`) ## Fichiers à lire en premier 1. `plans/PLAN_UI_MODULE.md` - Plan détaillé des 7 phases 2. `CLAUDE.md` - Instructions du projet, patterns de code 3. `include/grove/IModule.h` - Interface module 4. `include/grove/IDataNode.h` - Interface données 5. `modules/BgfxRenderer/BgfxRendererModule.cpp` - Exemple de module existant 6. `src/grove/JsonDataNode.cpp` - Implémentation IDataNode ## Phase à implémenter Commence par la **Phase 1: Core Foundation**: 1. Créer la structure de dossiers: ``` modules/UIModule/ ├── UIModule.cpp/h ├── Core/ │ ├── UIWidget.h │ ├── UIContext.cpp/h │ └── UITree.cpp/h ├── Widgets/ │ ├── UIPanel.cpp/h │ └── UILabel.cpp/h └── Rendering/ └── UIRenderer.cpp/h ``` 2. Implémenter `UIModule` comme IModule: - `setConfiguration()` - Charge le fichier JSON de layout - `process()` - Update l'UI, publie les render commands - `shutdown()` - Cleanup 3. Implémenter `UIWidget` (interface de base): ```cpp class UIWidget { public: virtual ~UIWidget() = default; virtual void update(UIContext& ctx, float deltaTime) = 0; virtual void render(UIRenderer& renderer) = 0; std::string id; float x, y, width, height; bool visible = true; UIWidget* parent = nullptr; std::vector> children; }; ``` 4. Implémenter `UIPanel` et `UILabel` 5. Implémenter `UIRenderer` qui publie sur IIO: ```cpp void UIRenderer::drawRect(float x, float y, float w, float h, uint32_t color) { auto sprite = std::make_unique("sprite"); sprite->setDouble("x", x); sprite->setDouble("y", y); sprite->setDouble("width", w); sprite->setDouble("height", h); sprite->setInt("color", color); sprite->setInt("textureId", 0); // White texture m_io->publish("render:sprite", std::move(sprite)); } ``` 6. Créer un test `tests/visual/test_24_ui_basic.cpp` ## JSON de test ```json { "id": "test_panel", "type": "panel", "x": 100, "y": 100, "width": 300, "height": 200, "style": { "bgColor": "0x333333FF" }, "children": [ { "type": "label", "text": "Hello UI!", "x": 10, "y": 10, "style": { "fontSize": 16, "color": "0xFFFFFFFF" } } ] } ``` ## Build Ajouter au CMakeLists.txt principal: ```cmake if(GROVE_BUILD_UI_MODULE) add_subdirectory(modules/UIModule) endif() ``` Build: ```bash cmake -DGROVE_BUILD_UI_MODULE=ON -DGROVE_BUILD_BGFX_RENDERER=ON -B build-bgfx cmake --build build-bgfx -j4 ``` ## Critères de succès Phase 1 - [ ] Module compile et se charge dynamiquement - [ ] Parse un JSON de layout simple - [ ] Affiche un panel (rectangle coloré) via `render:sprite` - [ ] Affiche un label (texte) via `render:text` - [ ] Test visuel fonctionnel ## Notes importantes - Utiliser `JsonDataNode` pour parser les layouts (pas de lib externe) - Le rendu passe par IIO, pas d'appels directs à bgfx - Suivre les patterns de `BgfxRendererModule` pour la structure - Layer UI = 1000+ (au-dessus des sprites de jeu)