____________________________________ L1 -- IIG -- GTK : TP 'Trésor' ____________________________________ Ce TP se base sur le modèle : http://www-lipn.univ-paris13.fr/~toulouse/doc/iig/correction/tresor/tresor_struct_2/ 1) Réaliser une interface en gtk permettant de représenter graphiquement une partie de 'chasse au trésor' 1.1) Il faut d'abord se poser les questions suivantes : - Quels composants graphiques (widgets) utiliser ? - Comment s'imbriquent-ils entre eux ? 1.2) Puis mettre en oeuvre vos réponses, en écrivant un programme gtk qui implémente cette interface. 2) Et si l'interface permettait de jouer ? 2.1) Il faut d'abord se poser la question : quelle action associer à quel événement ? Ex. : - quand une case est jouée (quel signal envoyé par quel composant ?), on ne peut plus la jouer (quelle action, sur quel composant ?) - quand une case est jouée, elle affiche son contenu (trésor '$' ou pas 'X') - quand le trésor est trouvé, la partie est gagnée, la fenêtre doit l'indiquer etc. 2.2) Ensuite... comment effectivement associer les actions répertoriées aux événements répertoriés ? 3) Permettre via l'interface de commencer une nouvelle partie. 4) Programmation modulaire : séparez les spécifications d'interface de votre programme. 5) Boîtes de message / boîtes de dialogue 5.1) Faire en sorte qu'une boîte de message s'affiche lorsque l'utilisateur remporte la partie. 5.2) Faire en sorte qu'une demande de confirmation soit faite lorsque l'utilisateur ferme la fenêtre. ... et si l'utilisateur change alors d'avis (il ne souhaite pas quitter l'application) : que faire ? /!\ : la destruction de la fenêtre est une action que gtk associe à l'événement 'delete-event' survenu à la fenêtre. Le programmeur peut : - capter cet événement (en lui associant une fonction de callback) - interdire ensuite que les autres actions qui sont associées à l'événement 'delete-event' (dont, la destruction de la fenêtre) soient appliquées. Les fonctions de callback associée à l'événement 'delete-event' ont la signature suivante : gboolean ma_fonction (GtkWidget *widget, GdkEvent *event, gpointer param); Le comportement est le suivant : - si 'ma_fonction' renvoie TRUE, les autres fonctions de callback associées au signal 'delete-event' du même objet ne sont pas déclenchées ; - si 'ma_fonction' renvoie FALSE, les autres fonctions de callback associées au signal 'delete-event' sont déclenchées. Pour le jeu de tésor, on peut donc : - associer à l'événement "delete-event' de la fenêtre principale une fonction qui demande, via une boîte de dialogue, à l'utilisateur s'il souhaite vraiment quitter l'application ; - faire retourner TRUE ou FALSE à cette fonction selon la réponse fournie par l'utilisateur, via la boîte de message. 5.3) Enrichir la fenêtre principale d'un bouton 'Pseudo' et d'un libellé ayant vocation à contenir le pseudo du joueur. Faire alors en sorte qu'une boite de dialogue permettant à l'utilisateur de saisir son pseudo s'ouvre lorsque celui-ci clique sur le bouton 'Pseudo' ... et que la mise à jour soit effective sur la fenêtre principale lorsque l'utilisateur confirme le changement de pseudo !