Index   Table   Précédent   Suivant

6. Macro widgets

Ce sont des fenêtres prêtes à l'emploi que Helium génère à la demande, telles que boîte de dialogue ou sélecteur de fichier.

Index   Table   Précédent   Suivant

6.1. Boîte de dialogue

Une fenêtre de dialogue est une fenêtre temporaire avec un titre, quelques lignes de texte, une ligne horizontale pour faire joli et un ou plusieurs boutons, tels que Ok, Cancel, etc.

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
    /* 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);
    }


Index   Table   Début   Suivant