diff --git a/doc/assets/API_GUI.md b/doc/assets/API_GUI.md new file mode 100644 index 0000000..d560d9c --- /dev/null +++ b/doc/assets/API_GUI.md @@ -0,0 +1,49 @@ +# Documentation de l'API GUI (Custom BIOS / ROM) + +Cette documentation décrit le fonctionnement, les constantes et les fonctions de la bibliothèque d'interface graphique (GUI) en mode réel. Le système repose sur une table de dispatch (macro `GUI`) et une boucle d'événements pour gérer jusqu'à 32 widgets simultanément. + +--- + +## 1. Constantes et Énumérations + +Les définitions globales utilisées pour paramétrer les widgets. + +### Limites du système +| Constante | Valeur | Description | +| :--- | :--- | :--- | +| `GUI_MAX_WIDGETS` | `32` | Nombre maximum de widgets simultanés. | +| `GUI_CHECKBOX_SIZE` | `10` | Taille en pixels du carré d'une case à cocher. | + +### États des Widgets (`GUI_STATE_*`) +| Constante | Valeur | Description | +| :--- | :--- | :--- | +| `GUI_STATE_FREE` | `0` | Slot vide, mémoire disponible. | +| `GUI_STATE_NORMAL` | `1` | Affiché, au repos. | +| `GUI_STATE_HOVER` | `2` | La souris survole le widget. | +| `GUI_STATE_PRESSED`| `3` | Le clic de la souris est maintenu enfoncé sur le widget. | +| `GUI_STATE_DISABLED`| `4` | Grisé, aucune interaction possible. | + +### Types d'Objets (`OBJ_TYPE_*`) +| Constante | Valeur | Description | +| :--- | :--- | :--- | +| `OBJ_TYPE_LABEL` | `0` | Texte simple (non interactif). | +| `OBJ_TYPE_BUTTON` | `1` | Bouton rectangulaire classique. | +| `OBJ_TYPE_SLIDER` | `2` | Curseur / jauge de valeur. | +| `OBJ_TYPE_BUTTON_ROUNDED` | `3` | Bouton avec bords arrondis. | +| `OBJ_TYPE_CHECKBOX` | `4` | Case à cocher (Toggle). | + +### Attributs de Modes (`SLIDER_*`) +| Constante | Valeur | Description | +| :--- | :--- | :--- | +| `SLIDER_HORIZONTAL` | `1` | Le slider se déplace sur l'axe X. | +| `SLIDER_VERTICAL` | `2` | Le slider se déplace sur l'axe Y. | + +--- + +## 2. Appel de l'API : La Macro `GUI` + +L'interaction avec les widgets doit se faire via la macro `GUI`. Elle empile les arguments dans le bon ordre et appelle la fonction correspondante via la table `gui_api_table`. + +**Syntaxe NASM :** +```nasm +GUI ACTION_ID, arg1, arg2, ... \ No newline at end of file diff --git a/src/gui/lib-api.asm b/src/gui/lib-api.asm index 83ff51c..11d2264 100644 --- a/src/gui/lib-api.asm +++ b/src/gui/lib-api.asm @@ -24,7 +24,7 @@ %define GUI_MAX_WIDGETS 32 ; Nombre max de widgets simultanés ; Dimensions -%define GUI_CHECKBOX_SIZE 10 ; +%define GUI_CHECKBOX_SIZE 10 ; 10x10 pixels ; --- Drapeaux & États --- %define GUI_STATE_FREE 0 ; Le slot est vide (mémoire dispo) diff --git a/src/gui/lib-draw.asm b/src/gui/lib-draw.asm index 1dfaf0e..368f23e 100644 --- a/src/gui/lib-draw.asm +++ b/src/gui/lib-draw.asm @@ -392,18 +392,17 @@ draw_checkbox: add ax, 4 mov bx, [gs:si + widget.y] + ; centrage vertical mov cx, [gs:si + widget.h] - mov dx, [gs:si + widget.w] - sub cx, GUI_CHECKBOX_SIZE shr cx, 1 - add bx, cx ; Y1 + add bx, cx ; bx = Y1 + (h/2) - mov cx, ax - add cx, GUI_CHECKBOX_SIZE ; X2 + mov cx, ax ; x + add cx, GUI_CHECKBOX_SIZE ; cx = X2 mov dx, bx - add dx, GUI_CHECKBOX_SIZE ; Y2 + add dx, GUI_CHECKBOX_SIZE ; Y2 ; Sauvegarde coords pour le X push ax @@ -415,10 +414,16 @@ draw_checkbox: GFX RECTANGLE_FILL, ax, bx, cx, dx, PATTERN_WHITE, 15, 0 GFX RECTANGLE, ax, bx, cx, dx, 0 + pop dx + pop cx + pop bx + pop ax + ; Check if checked cmp word [gs:si + widget.thumb_pos], 0 je .draw_label + ; Dessin du X (Diagonales) add ax, 2 add bx, 2 @@ -433,10 +438,7 @@ draw_checkbox: GFX LINE, ax, dx, cx, bx, 0 .draw_label: - pop dx - pop cx - pop bx - pop ax + ; Dessin du texte à droite (BoxX2 + 6) add cx, 6