Le widget SimpleDialog permet de créer et de gérer une fenêtre de dialogue de la façon la plus simple possible.
Un appel à HeSimpleDialog()
crée la fenêtre avec son texte et ses
boutons, l'affiche et attend qu'un bouton soit pressé ; dès qu'un
bouton est pressé, la fenêtre est automatiquement cachée et détruite et
la callback du bouton est appelée.
Une seule fenêtre de dialogue peut être affichée à la fois ; un nouvel appel à HeSimpleDialog remplace la fenêtre précédente.
La syntaxe est la suivante : on passe une suite d'arguments HE_DIALOG_
à la fonction, et cette suite est terminée par 0.
HeSimpleDialog (
HE_DIALOG_BELL,
HE_DIALOG_TITLE, "Le titre",
HE_DIALOG_MESSAGE, "Attention, le fichier",
HE_DIALOG_QUOTED, file_name,
HE_DIALOG_MESSAGE, "ne peut etre ouvert",
HE_DIALOG_BUTTON, "Reessayer"
HE_DIALOG_BUTTOK, "Annuler"
HE_DIALOG_PROC, my_dialog_proc
HE_DIALOG_DATA, my_data,
0);
La présence de HE_DIALOG_BELL
fait retentir un bip à l'affichage de la
fenêtre. Par HE_DIALOG_TITLE
on donne un titre à la fenêtre. Chaque
HE_DIALOG_MESSAGE
rajoute une ligne de texte. HE_DIALOG_QUOTED
joue le
même rôle, mais en rajoutant des "" autour du texte (très utile pour
le nom d'un fichier). Chaque HE_DIALOG_BUTTON
rajoute un bouton. On
peut préciser quel est le bouton qui est validé par défaut lorsqu'on
appuie sur [Entrée] : il suffit de le créer avec HE_DIALOG_BUTTOK
. La
callback de HE_DIALOG_PROC
est attachée à tous les
boutons. On peut enfin définir avec HE_DIALOG_DATA
une variable my_data
qui sera transmise en paramètre dans la callback.Le prototype de la callback my_dialog_proc est
void my_dialog_proc(char *name, void *my_data);
Tous les arguments passés à HeSimpleDialog sont optionnels ; s'il n'y a
pas de HE_DIALOG_PROC
, le clic sur un bouton fait tout simplement
disparaître la boîte de dialogue.Attention, l'appel à HeSimpleDialog est non bloquant ; c'est-à-dire que la fenêtre est immédiatement créée et affichée, puis le programme continue sans pouvoir attendre la réponse ; celle-ci sera connue lors de l'appel de la callback.
Dans l'exemple suivant, on crée une boîte de dialogue dans la fonction
ask_quit()
. Cette fonction est la callback du bouton Quit. On détourne
aussi la fermeture de la fenêtre via le Window Manager en attachant
une CloseProc au Frame.
/* examples/macro/dialog1.c */
#include <helium.h>
He_node *princ, *panel;
void dialog_proc (char *name, void *my_data)
{
if (!strcmp (name, "Oui")) HeQuit(0);
}
void ask_quit (He_node *hn)
{
HeSimpleDialog (
HE_DIALOG_BELL,
HE_DIALOG_TITLE, "Attention",
HE_DIALOG_MESSAGE, "Etes-vous certain",
HE_DIALOG_MESSAGE, "de vouloir quitter ?",
HE_DIALOG_BUTTON, "Oui",
HE_DIALOG_BUTTOK, "Annuler",
HE_DIALOG_PROC, dialog_proc,
0);
}
int main (int argc, char *argv[])
{
HeInit (&argc, &argv);
princ = HeCreateFrame();
HeSetFrameLabel (princ, "Boite de dialogue");
HeSetFrameCloseProc (princ, ask_quit);
panel = HeCreatePanel (princ);
HeCreateButtonP (panel, "Quit", ask_quit, NULL);
return HeMainLoop (princ);
}