Outils pour utilisateurs

Outils du site


allegro:addon_dialog

**Ceci est une ancienne révision du document !** ----

A PCRE internal error occured. This might be caused by a faulty plugin

===== Dialogs Natifs ===== Les dialogs natifs sont très pratiques et très rapides/simples à implémenter, de quoi nous éviter bien des peines vu qu'on a pas à le coder dans notre jeu. On dispose de 3 types de dialogs : * FileChooser — Pour Ouvrer/Sauver un fichier * MessageBox — Affiche un message avec un ou deux boutons * TextLog — Affiche un log (texte plutôt long, avec une scrollbar) ===== Exemples ===== Il faut inclure ce header : <code c> #include <allegro5/allegro_native_dialog.h> </code> ==== MessageBox ==== C'est de loin le plus simple à utiliser, en plus il est utilisable avant même l'appel à la fonction **al_init** ; il suffit d'appeler la fonction **al_show_native_message_box** (attention c'est une fonction bloquante) : <code c> int res; res = al_show_native_message_box(al_get_current_display(), "Question", "Vous n'avez pas enregistré", "Voulez-vous quitter ?", "oui|non", ALLEGRO_MESSAGEBOX_QUESTION | ALLEGRO_MESSAGEBOX_YES_NO); </code> Le premier paramètre est le display dans lequel sera centré le dialog, ce paramètre peut être **NULL**.\\ Le second est le titre (en général mis dans la barre de la fenêtre).\\ Le troisième est l'en-tête du message.\\ Le quatrième est le message en lui-même.\\ Le cinquième est le texte qui est dans les boutons. S'il y a plusieurs boutons, on séparera le texte de chaque bouton par un **|** (barre verticale).\\ Le dernier est un bouléen avec différents flags utilisables et combinables : * **ALLEGRO_MESSAGEBOX_WARN** — Ce message est un warning, en général met une icône dans le dialog. * **ALLEGRO_MESSAGEBOX_ERROR** — Ce message est une erreur, en général met une icône dans le dialog. * **ALLEGRO_MESSAGEBOX_QUESTION** — Ce message est une question, en général met une icône dans le dialog. * **ALLEGRO_MESSAGEBOX_OK_CANCEL** — Le dialog devra comporter un bouton OK et un Cancel. * **ALLEGRO_MESSAGEBOX_YES_NO** — Le dialog devra comporter un bouton Yes et un No. Si l'un des deux derniers flags est utilisé, la fonction retourne 1 si l'utilisateur clique sur le bouton positif, 2 s'il clique sur le bouton négatif et 0 s'il ferme le dialog avec la croix (ou la touche ECHAP). la fonction **al_get_current_display** renvoit NULL s'il n'y a aucun display et peut être utilisée sans qu'allegro soit initialisée. ==== FileChooser ==== Il faut d'abord initialiser le dialog, l'afficher puis le détruire. <code c> ALLEGRO_FILECHOOSER *fchooser; ALLEGRO_PATH *path; char * file; path = al_get_standard_path(ALLEGRO_RESOURCES_PATH); fchooser = al_create_native_file_dialog(al_path_cstr(path, '/'), "Ouvrir une image", "*.bmp;*.jpg;*.png;*.*", ALLEGRO_FILECHOOSER_FILE_MUST_EXIST); al_destroy_path(path); if (al_show_native_file_dialog(al_get_current_display(), fchooser)){ if (al_get_native_file_dialog_count(fchooser) == 1) { file = al_get_native_file_dialog_path(fchooser, 0); } } puts(file); al_destroy_native_file_dialog(fchooser); </code> Pour **al_create_native_file_dialog**: Le premier paramètre est le chemin ouvert par défaut par le dialog.\\ Le second est le titre de la fenêtre du dialog.\\ Le troisième est la liste des formats acceptés (par extensions).\\ Le dernier est un booléen avec les différents flags pour configurer notre dialog : * **ALLEGRO_FILECHOOSER_FILE_MUST_EXIST** — Autorise seulement la sélection d'un fichier existant. * **ALLEGRO_FILECHOOSER_SAVE** — Dialog de sauvegarde (si l'OS a un dialog dédié à cette tâche). * **ALLEGRO_FILECHOOSER_FOLDER** — Pour ouvrir uniquement un dossier. * **ALLEGRO_FILECHOOSER_PICTURES** — Pour ouvrir des images. * **ALLEGRO_FILECHOOSER_SHOW_HIDDEN** — Pour afficher les fichiers cachés. * **ALLEGRO_FILECHOOSER_MULTIPLE** — Autorise la sélection de multiples fichiers. La fonction renvoit NULL en cas d’erreur. **al_show_native_file_dialog** Prend en paramètre un Display (peut être NULL), ainsi que le disalog à afficher.\\ Elle renvoit 0 en cas d'erreur. **al_get_native_file_dialog_count** Renvoit le nombre de paths choisis par l'utilisateur. **al_get_native_file_dialog_path** Renvoit le path en fonction de l'index, comprit entre 0 et la valeur renvoyée par la fonction précédente. Vous devez utiliser la string **file** avant de détruire le dialog avec **al_destroy_native_file_dialog** !! ==== TextLog ==== Il faut créer le dialog, le feed, et le fermer. <code c> ALLEGRO_TEXTLOG * log; int value; if (!(log = al_open_native_text_log("Console", ALLEGRO_TEXTLOG_NO_CLOSE | ALLEGRO_TEXTLOG_MONOSPACE))) { /* Failed */ } /* ... */ al_append_native_text_log(log, "Affichage de la valeur %d", value); /* ... */ al_close_native_text_log(log); </code> Le premier argument de **al_open_native_text_log** est le titre de la fenêtre, le second argument est un booléen : * **ALLEGRO_TEXTLOG_NO_CLOSE** — Pour ne pas avoir de croix (si possible) * **ALLEGRO_TEXTLOG_MONOSPACE** — Pour que chaque caractère aient la même largeur Elle renvoit false en cas d'échec. ===== Menus ===== Depuis la version 5.1, allegro permet d'ajouter une barre de menu à notre display, ainsi qu'un menu contextuel (clic-droit). {{ :allegro:menus.png?nolink& | Exemple des menus sous windows }} <html> <p style="text-align:center;margin-top:0px;font-size:0.9em"><em>Exemple des menus sous windows</em></p> </html> Un display ne peut avoir qu'une seule barre de menu, par contre on doit nous même écouter les évents de la souris et afficher le menu contextuel (popup menu) ce qui permet de pouvoir changer le menu en fonction de la zone cliquée. ==== Exemple ==== Les menus font partie du greffon //Native Dialogs// donc il faut inclure le header : <code c>#include <allegro5/allegro_native_dialog.h></code> Ils ont besoin que le greffon soit initialisé : <code c>al_init_native_dialog_addon();</code> Ensuite on peut créer un menu de différentes manières : * En une seule fois avec **al_build_menu** * En plusieurs appels successifs à **al_append_menu_item** === Première méthode === On crée une variable de type **ALLEGRO_MENU_INFO** qui contient une description de notre menu : <code c> ALLEGRO_MENU *menu = NULL; ALLEGRO_MENU_INFO menu_info[] = { ALLEGRO_START_OF_MENU("&Fichier", 1), {"&Ouvrir", 2, 0, NULL}, ALLEGRO_START_OF_MENU("Fichiers &Récents...", 3), {"kikoo.png", 4, 0, NULL}, {"wallpp.jpg", 5, 0, NULL}, ALLEGRO_END_OF_MENU, ALLEGRO_MENU_SEPARATOR, {"&Fermer", 6, 0, NULL}, ALLEGRO_END_OF_MENU, ALLEGRO_START_OF_MENU("&Aide", 7), {"À &propos", 8, 0, NULL}, ALLEGRO_END_OF_MENU, ALLEGRO_END_OF_MENU }; menu = al_build_menu(menu_info); </code> La macro **ALLEGRO_START_OF_MENU** ajoute un sous menu qui contiendra des éléments (boutons), **ALLEGRO_END_OF_MENU** ferme un menu. On doit rajouter un **ALLEGRO_END_OF_MENU** final pour fermer le menu qu'on crée. Chaque élément est crée de cette manière : <code c> { "&Ouvrir", /* Le libellé de notre élément, le '&' précède la lettre pour le mnemonic */ 2, /* l'ID pour savoir quel bouton du menu a été cliqué */ 0, /* flags d'option */ NULL /* une icône (ALLEGRO_BITMAP) */ } </code> Les //flags// sont : * **ALLEGRO_MENU_ITEM_DISABLED** — l'entrée est grisée, et ne peut être cliquée * **ALLEGRO_MENU_ITEM_CHECK_BOX** — une case à cocher précède le libellé * **ALLEGRO_MENU_ITEM_CHECKED** — précoche la case (à utiliser avec le flag précédent) Maintenant on ajoute notre menu à notre display avec **al_set_display_menu** puis pour recevoir les events : <code c> al_register_event_source(event_queue, al_get_default_menu_event_source()); </code> === Seconde méthode === Nous allons créer un menu contextuel (ce qui est tout aussi faisable avec la méthode décrite dans le paragraphe précédent) : <code c> ALLEGRO_MENU *pmenu; pmenu = al_create_popup_menu(); al_append_menu_item(pmenu, "É&diter", 10, 0, NULL, NULL); al_append_menu_item(pmenu, "&Supprimer", 11, 0, NULL, NULL); </code> Le premier paramètre est le popup-menu, les 4 suivant correspondent à la structure décrite dans le paragraphe précédent et le dernier paramètre permet d'ajouter un sous menu. la gestion de l'apparition du menu contextuel se fait //manuellement// : il faut la déclencher explicitement avec **al_popup_menu**. Tout dialog crée doit être détruit avec **al_destroy_menu**, (une fois sur le menu parent suffit à détruire tout les sous-menus). Tout clic sur un menu déclenche un event de type **ALLEGRO_EVENT_MENU_CLICK**. Selon l'implémentation, l'ajout d'un menu au display réduit sa taille, le display génère donc un event de type **ALLEGRO_EVENT_DISPLAY_RESIZE** on peut connaître la taille perdu en faisant la différence avec la valeur renvoyée par **al_get_display_height**. [[allegro:addons|Liste des greffons]]

allegro/addon_dialog.1332081308.txt.gz · Dernière modification: 2012/03/18 15:35 par mrhide