Outils pour utilisateurs

Outils du site


allegro:addon_dialog

Allegro — 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 :

#include <allegro5/allegro_native_dialog.h>

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) :

   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);

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.

   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);

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.

   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);

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.

Depuis la version 5.1, allegro permet d'ajouter une barre de menu à notre display, ainsi qu'un menu contextuel (clic-droit).

 Exemple des menus sous windows

Exemple des menus sous windows

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.

Exemples

Les menus font partie du greffon Native Dialogs donc il faut inclure le header :

#include <allegro5/allegro_native_dialog.h>

Ils ont besoin que le greffon soit initialisé :

al_init_native_dialog_addon();

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 :

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);

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 :

{
   "&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) */
}

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 :

al_register_event_source(event_queue, al_get_default_menu_event_source());

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) :

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);

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.

Liste des greffons

allegro/addon_dialog.txt · Dernière modification: 2012/06/29 17:06 par mrhide