# Prompt pour Phase 6 & 7 - UIModule Final Features

## Contexte

Tu travailles sur **GroveEngine**, un moteur de jeu C++17 avec système de modules hot-reload. Le **UIModule** a été développé avec succès jusqu'à la **Phase 5** et est maintenant très fonctionnel.

### Architecture Existante

- **IModule** - Interface pour modules dynamiques (.so)
- **IDataNode** - Abstraction données structurées (JsonDataNode)
- **IIO (IntraIOManager)** - Pub/sub pour communication inter-modules
- **BgfxRenderer** - Rendu 2D avec bgfx (sprites, texte)

### État Actuel du UIModule

**Phases Complétées (1-5)**:

✅ **Phase 1: Core Foundation**
- `UIPanel`, `UILabel` - Widgets de base
- `UIRenderer` - Rendu via IIO (`render:sprite`, `render:text`)
- `UIContext` - État global UI (mouse, keyboard, focus)
- `UITree` - Chargement JSON → arbre de widgets

✅ **Phase 2: Layout System**
- `UILayout` - Layout automatique (vertical, horizontal, stack, absolute)
- Flexbox-like avec padding, spacing, alignment, flex sizing
- Measure + Layout passes (bottom-up → top-down)

✅ **Phase 3: Interaction & Events**
- `UIButton` - États (normal, hover, pressed, disabled)
- Hit testing récursif (point → widget)
- IIO events: `ui:click`, `ui:hover`, `ui:action`

✅ **Phase 4: More Widgets**
- `UIImage` - Affichage textures
- `UISlider` - Draggable value input (horizontal/vertical)
- `UICheckbox` - Toggle boolean
- `UIProgressBar` - Progress display read-only
- Event `ui:value_changed` pour slider/checkbox

✅ **Phase 5: Styling & Themes**
- `UIStyle` - Système de thèmes avec palette de couleurs
- `UITheme` - Définition thèmes (dark, light)
- `UIStyleManager` - Résolution styles (default ← theme ← inline)
- Références couleurs (`$primary` → couleur réelle)

### Structure Actuelle

```
modules/UIModule/
├── UIModule.cpp/h              # Module principal + event system
├── Core/
│   ├── UIWidget.h              # Interface base tous widgets
│   ├── UIContext.h/cpp         # État global + hit testing
│   ├── UITree.h/cpp            # Parsing JSON + factories
│   ├── UILayout.h/cpp          # Système de layout
│   └── UIStyle.h/cpp           # Thèmes et styles
├── Widgets/
│   ├── UIPanel.h/cpp
│   ├── UILabel.h/cpp
│   ├── UIButton.h/cpp
│   ├── UIImage.h/cpp
│   ├── UISlider.h/cpp
│   ├── UICheckbox.h/cpp
│   └── UIProgressBar.h/cpp
└── Rendering/
    └── UIRenderer.h/cpp        # Publish render commands via IIO
```

### Topics IIO

**Subscribed (Inputs)**:
- `input:mouse:move` → `{x, y}`
- `input:mouse:button` → `{button, pressed, x, y}`
- `input:keyboard` → `{keyCode, char}`
- `ui:load` → `{path}` - Load new layout
- `ui:set_visible` → `{id, visible}` - Show/hide widget

**Published (Outputs)**:
- `render:sprite` → Background, panels, images
- `render:text` → Labels, button text
- `ui:click` → `{widgetId, x, y}`
- `ui:hover` → `{widgetId, enter: bool}`
- `ui:action` → `{action, widgetId}` - Semantic action
- `ui:value_changed` → `{widgetId, value/checked}`

## Fichiers à Lire en Premier

1. `docs/PLAN_UI_MODULE.md` - Plan complet des 7 phases
2. `docs/UI_MODULE_PHASE2_COMPLETE.md` - Phase 2 (Layout)
3. `docs/UI_MODULE_PHASE3_COMPLETE.md` - Phase 3 (Interactions)
4. `modules/UIModule/Core/UIWidget.h` - Interface widget
5. `modules/UIModule/UIModule.cpp` - Event system principal
6. `modules/UIModule/Core/UIStyle.h` - Système de thèmes

## Phase 6: Text Input

### Objectif
Implémenter un champ de saisie de texte interactif.

### Composants à Créer

#### 1. `Widgets/UITextInput.h/cpp`

**Fonctionnalités**:
- Saisie de texte avec curseur
- Sélection de texte (drag pour sélectionner)
- Copier/coller basique (via clipboard système ou buffer interne)
- Curseur clignotant
- Input filtering (numbers only, max length, regex, etc.)
- Password mode (masquer caractères)

**États**:
- Normal, Focused, Disabled
- Cursor position (index dans string)
- Selection range (start, end)

**Events**:
- `ui:text_changed` → `{widgetId, text}`
- `ui:text_submit` → `{widgetId, text}` - Enter pressed

**JSON Exemple**:
```json
{
  "type": "textinput",
  "id": "username_input",
  "text": "",
  "placeholder": "Enter username...",
  "maxLength": 20,
  "filter": "alphanumeric",
  "onSubmit": "login:username"
}
```

#### 2. Gestion Clavier dans UIModule

**Extend `UIContext`**:
- Tracking du widget focused
- Keyboard event routing au widget focused

**Extend `UIModule::processInput()`**:
- Route `input:keyboard` vers widget focused
- Support Tab navigation (focus next/previous)

**Keyboard Events à Gérer**:
- Caractères imprimables → Ajouter au texte
- Backspace → Supprimer caractère avant curseur
- Delete → Supprimer caractère après curseur
- Left/Right arrows → Déplacer curseur
- Home/End → Début/fin de texte
- Ctrl+C/V → Copy/paste (optionnel)
- Enter → Submit

#### 3. Curseur Clignotant

**Animation**:
- Timer dans `UITextInput::update()` pour blink
- Render cursor si visible et focused
- Blink interval ~500ms

#### 4. Rendu

**UIRenderer Extension** (si nécessaire):
- Render curseur (ligne verticale)
- Render sélection (rectangle semi-transparent)
- Clip texte si trop long (scroll horizontal)

### Tests

**Fichier**: `tests/visual/test_27_ui_textinput.cpp`
- 3-4 text inputs avec différents filtres
- Placeholder text
- Password input
- Submit action qui affiche le texte en console

**JSON**: `assets/ui/test_textinput.json`

### Critères de Succès Phase 6

- [ ] UITextInput widget compile et fonctionne
- [ ] Saisie de texte visible en temps réel
- [ ] Curseur clignotant visible quand focused
- [ ] Backspace/Delete fonctionnels
- [ ] Event `ui:text_submit` publié sur Enter
- [ ] Input filtering fonctionne (numbers only, max length)
- [ ] Focus management (click pour focus, Tab pour next)
- [ ] Test visuel démontre toutes les fonctionnalités

## Phase 7: Advanced Features

### Objectif
Fonctionnalités avancées pour un système UI production-ready.

### 7.1 UIScrollPanel

**Scroll Container**:
- Panel avec scroll vertical/horizontal
- Scrollbars visuels (optionnels)
- Mouse wheel support
- Touch/drag scrolling
- Clip content (ne pas render en dehors bounds)

**JSON**:
```json
{
  "type": "scrollpanel",
  "width": 300,
  "height": 400,
  "scrollVertical": true,
  "scrollHorizontal": false,
  "showScrollbar": true
}
```

### 7.2 Drag & Drop

**Draggable Widgets**:
- Attribut `draggable: true` sur widget
- Événements `ui:drag_start`, `ui:drag_move`, `ui:drag_end`
- Drag preview (widget suit la souris)
- Drop zones avec `ui:drop` event

**Use Case**:
- Réorganiser items dans liste
- Drag & drop inventory items
- Move windows/panels

### 7.3 Tooltips

**Hover Tooltips**:
- Attribut `tooltip: "text"` sur widget
- Apparition après delay (~500ms hover)
- Position automatique (éviter bords écran)
- Style configurable

**JSON**:
```json
{
  "type": "button",
  "text": "Save",
  "tooltip": "Save your progress"
}
```

### 7.4 Animations

**Animation System**:
- Fade in/out (alpha)
- Slide in/out (position)
- Scale up/down
- Rotation (si supporté par renderer)

**Easing Functions**:
- Linear, EaseIn, EaseOut, EaseInOut

**JSON**:
```json
{
  "type": "panel",
  "animation": {
    "type": "fadeIn",
    "duration": 300,
    "easing": "easeOut"
  }
}
```

### 7.5 Data Binding

**Auto-sync Widget ↔ IDataNode**:
- Attribut `dataBinding: "path.to.data"`
- Widget auto-update quand data change
- Data auto-update quand widget change

**Exemple**:
```json
{
  "type": "slider",
  "id": "volume_slider",
  "dataBinding": "settings.audio.volume"
}
```

**Implementation**:
- UIModule subscribe à data changes
- Widget read/write via IDataNode
- Bidirectional sync

### 7.6 Hot-Reload des Layouts

**Runtime Reload**:
- Subscribe `ui:reload` topic
- Recharge JSON sans restart app
- Preserve widget state si possible
- Utile pour design iteration

### Priorisation Phase 7

**Must-Have** (priorité haute):
1. **UIScrollPanel** - Très utile pour listes longues
2. **Tooltips** - UX improvement significatif

**Nice-to-Have** (priorité moyenne):
3. **Animations** - Polish, pas critique
4. **Data Binding** - Convenience, mais peut être fait manuellement

**Optional** (priorité basse):
5. **Drag & Drop** - Cas d'usage spécifiques
6. **Hot-Reload** - Utile en dev, pas en prod

### Tests Phase 7

**test_28_ui_scroll.cpp**:
- ScrollPanel avec beaucoup de contenu
- Vertical + horizontal scroll
- Mouse wheel

**test_29_ui_advanced.cpp**:
- Tooltips sur plusieurs widgets
- Animations (fade in panel au start)
- Data binding demo (si implémenté)

## Ordre Recommandé d'Implémentation

### Partie 1: Phase 6 (UITextInput)
1. Créer `UITextInput.h/cpp` avec structure de base
2. Implémenter rendu texte + curseur
3. Implémenter keyboard input handling
4. Ajouter focus management à UIModule
5. Implémenter input filtering
6. Créer test visuel
7. Documenter Phase 6

### Partie 2: Phase 7.1 (ScrollPanel)
1. Créer `UIScrollPanel.h/cpp`
2. Implémenter scroll logic (offset calculation)
3. Implémenter mouse wheel support
4. Implémenter scrollbar rendering (optionnel)
5. Implémenter content clipping
6. Créer test avec long content
7. Documenter

### Partie 3: Phase 7.2 (Tooltips)
1. Créer `UITooltip.h/cpp` ou intégrer dans UIContext
2. Implémenter hover delay timer
3. Implémenter tooltip positioning
4. Intégrer dans widget factory (parse `tooltip` property)
5. Créer test
6. Documenter

### Partie 4: Phase 7.3+ (Optionnel)
- Animations si temps disponible
- Data binding si cas d'usage clair
- Drag & drop si besoin spécifique

## Notes Importantes

### Architecture

**Garder la cohérence**:
- Tous les widgets héritent `UIWidget`
- Communication via IIO pub/sub uniquement
- JSON configuration pour tout
- Factory pattern pour création widgets
- Hot-reload ready (serialize state dans `getState()`)

**Patterns Existants**:
- Hit testing dans `UIContext::hitTest()`
- Event dispatch dans `UIModule::updateUI()`
- Widget factories dans `UITree::registerDefaultWidgets()`
- Style resolution via `UIStyleManager`

### Performance

**Considérations**:
- Hit testing est O(n) widgets → OK pour UI (< 500 widgets typique)
- Layout calculation chaque frame → OK si pas trop profond
- Text input: éviter realloc à chaque caractère
- ScrollPanel: culling pour ne pas render widgets hors vue

### Limitations Connues à Adresser

**Text Centering**:
- UIRenderer n'a pas de text measurement API
- Texte des boutons pas vraiment centré
- Solution: Ajouter `measureText()` à UIRenderer ou BgfxRenderer

**Border Rendering**:
- Propriété `borderWidth`/`borderRadius` existe mais pas rendue
- Soit ajouter à UIRenderer, soit accepter limitation

**Focus Visual**:
- Pas d'indicateur visuel de focus actuellement
- Ajouter border highlight ou overlay pour widget focused

## Fichiers de Référence

### Widgets Existants (pour pattern)
- `modules/UIModule/Widgets/UIButton.cpp` - Interaction + states
- `modules/UIModule/Widgets/UISlider.cpp` - Drag handling
- `modules/UIModule/Widgets/UICheckbox.cpp` - Toggle state

### Core Systems
- `modules/UIModule/Core/UIContext.cpp` - Hit testing pattern
- `modules/UIModule/UIModule.cpp` - Event publishing pattern
- `modules/UIModule/Core/UITree.cpp` - Widget factory pattern

### Tests Existants
- `tests/visual/test_26_ui_buttons.cpp` - Input forwarding SDL → IIO
- `assets/ui/test_widgets.json` - JSON structure reference

## Build & Test

```bash
# Build UIModule
cmake -DGROVE_BUILD_UI_MODULE=ON -DGROVE_BUILD_BGFX_RENDERER=ON -B build-bgfx
cmake --build build-bgfx --target UIModule -j4

# Build test
cmake --build build-bgfx --target test_27_ui_textinput -j4

# Run test
cd build-bgfx/tests
./test_27_ui_textinput
```

## Critères de Succès Finaux

### Phase 6 Complete
- ✅ UITextInput fonctionne avec keyboard input
- ✅ Focus management implémenté
- ✅ Events `ui:text_changed` et `ui:text_submit`
- ✅ Input filtering fonctionne
- ✅ Test visuel démontre toutes les features

### Phase 7 Complete (Minimum)
- ✅ UIScrollPanel fonctionne avec mouse wheel
- ✅ Tooltips s'affichent au hover
- ✅ Tests visuels pour scroll + tooltips
- ✅ Documentation complète

### UIModule Production-Ready
- ✅ 8+ widget types utilisables
- ✅ Layout system flexible
- ✅ Theme system pour cohérence visuelle
- ✅ Event system complet
- ✅ Hot-reload support
- ✅ Tests couvrant toutes les features
- ✅ Documentation exhaustive

## Documentation à Créer

Après chaque phase:
- `docs/UI_MODULE_PHASE6_COMPLETE.md`
- `docs/UI_MODULE_PHASE7_COMPLETE.md`
- `docs/UI_MODULE_FINAL.md` - Guide complet d'utilisation

Inclure:
- Features implémentées
- JSON examples
- Event flow diagrams
- Limitations connues
- Best practices
- Performance notes

## Questions Fréquentes

**Q: Faut-il implémenter TOUTE la Phase 7?**
R: Non, focus sur ScrollPanel + Tooltips (priorité haute). Le reste est optionnel selon besoins.

**Q: Comment gérer clipboard pour copy/paste?**
R: Simplifier - buffer interne suffit pour MVP. Clipboard OS peut être ajouté plus tard.

**Q: Scroll horizontal pour TextInput si texte trop long?**
R: Oui, essentiel. Calculer offset pour garder curseur visible.

**Q: Multi-line text input?**
R: Pas nécessaire Phase 6. Single-line suffit. Multi-line = Phase 7+ si besoin.

**Q: Animation system: nouvelle classe ou intégré widgets?**
R: Nouvelle classe `UIAnimation` + `UIAnimator` manager. Garder widgets simples.

**Q: Data binding: pull ou push?**
R: Push (reactive). Subscribe aux changes IDataNode, update widget automatiquement.

## Bon Courage!

Le UIModule est déjà très solide (Phases 1-5). Phase 6 et 7 vont le rendre production-ready et feature-complete.

Focus sur:
1. **Qualité > Quantité** - Mieux vaut TextInput parfait que 10 features buggées
2. **Tests** - Chaque feature doit avoir un test visuel
3. **Documentation** - Code self-documenting + markdown docs
4. **Cohérence** - Suivre patterns existants

Les fondations sont excellentes, tu peux être fier du résultat! 🚀
